Unity3d。 Unity 3D学生からの教訓(B13-B16)

次のリンクで以前のレッスンを見つけることができます。

レッスンB01-B03

レッスンB04-B08

レッスンB09-B12



PS:前のレッスンのいくつかのエラーも修正されました。多くはufomeshMikhailS habravchinsのおかげです









基本レッスン13-トリガーによる衝突の検出






このレッスンでは、無形のトリガーコライダーを使用して、プレーヤーには見えないオブジェクト間の衝突を検出する方法を説明します。



衝突を検出したいが、衝突するオブジェクトが停止しないようにしたい場合は、トリガーを使用する必要があります



トリガーを使用すると、オブジェクトがシーンのどこにあるかを正確に判断できます(アプリケーションの起動中)。



私たちのシーンには、青いプラットフォーム(「プラットフォーム」)に落ちる立方体(剛体のある「箱 」)があります。

b1300

b1301



当然、プラットフォームにはキューブが停止します。そのコンポーネントにはボックスコライダーがあるためです。

b1302



Box ColliderコンポーネントにはIs Triggerチェックボックスがあります 有効にする場合

彼と再びシーンを実行すると、キューブはプラットフォームを介して落下します。

b1303



このようにして、ユーザーには見えない衝突を作成できます。 たとえば、プラットフォームでMesh Rendererコンポーネントを無効にします。 階層ビューでオブジェクトを選択すると、オブジェクトの緑色のアウトラインが表示されます。

b1304



プレイを押すと、キューブは目に見えないプラットフォームを通り抜けますが、これまでのところ、何が起こったのかはわかりません。

b1305



スクリプトを作成し、 トリガーと呼び、次のコードをクラス本体に追加します

//     // myTrigger - ,   void OnTriggerEnter(Collider myTrigger) { if (myTrigger.gameObject.name == "box") { Debug.Log("Box went through!"); } }
      
      







プラットフォームにスクリプトを追加します。 これで、キューブがプラットフォームを通過するとすぐに、「ボックスが通過しました!」というメッセージがコンソールに表示されます。



元のレッスンへのリンク



追加資料
公式Unity3dスクリプトリファレンスのOnTriggerEnter関数に関する情報



公式コンポーネントガイドからのBox Colliderコンポーネント情報> Unity3d







基本レッスン14-GUIテキストとカウンター








このレッスンでは、GUIテキストコンポーネントを使用して画面にカウンター情報を表示する方法について説明します。



画面にテキスト情報を表示するには、 GUI Text要素を使用します

シーンに追加します-Game Object-> Create Other-> GUI Text。

b1400



また、カメラのGUILayerコンポーネントがオンになっていることに注意してください

b1401



テキストは、エディターを介して直接編集できます( テキストフィールド)。

b1402



ただし、これにはスクリプトを使用します。 スクリプト(GUITextExample)を追加します Update()メソッドでコードを記述します。



GUIテキストについて
GUIテキストgameObjectのコンポーネントであるため、オブジェクト自体を通常のgameObjectとして処理できます コンポーネントは、 Component-> Rendering-> GUITextにあります。 つまり GameObject-> Create Other-> GUI Textを作成することにより、適切なコンポーネントで空の GameObjectを作成します。





  guiText.text = "Hey What's Up?";
      
      







guiText.textパラメーターの設定ページに移動すると、次が表示されます。

var text :文字列

説明

表示するテキスト。



つまり、パラメーターを渡すときは、 文字列を渡す必要があります。



ゲームを開始すると、テキストが変わります。

b1403



カウンターを表示してみましょう。 クラスで、カウンター変数(Counter)を追加し、 Update()メソッドのコードを少し調整します

 private int Counter = 0; void Update () { ++Counter; guiText.text = Counter; }
      
      







その結果、Unityはエラーをスローします。

 Cannot implicitly convert type `int' to `string'
      
      







int型の変数をstring型にキャストする必要があります。

これはさまざまな方法で実行できます。 それらのいくつかを次に示します。

 ... // ToString() -  ,     guiText.text = Counter.ToString(); ... // Convert.ToString(value) -    value  String.Empty,   value   null. guiText.text = Convert.ToString(Counter) ... //  '+'    . guiText.text = "" + Counter; ... //etc
      
      







MSDNでの注意
文字列は不変です。文字列オブジェクトの内容は、オブジェクトが作成された後に変更することはできませんが、構文により変更が可能であるようです。 たとえば、このコード(「+」演算子を意味する)を記述するとき、コンパイラは実際に新しい文字シーケンス用の新しい文字列オブジェクトを作成します。





最後のメソッドを使用します。空行の代わりに、テキストを書き込みます。

 guiText.text = "Counter is:" + Counter;
      
      







[再生]をクリックして、カウンター変数の値がどのように増加するかを確認します。

b1404



プロジェクトに追加のフォント(フォント)ある場合は、テキストのフォントを変更することもできます。



フォントを変更するには、 GUIText(Font)コンポーネントの対応するフィールドにドラッグするだけです

b1405



ここでは、サイズ(フォントサイズ) 、位置合わせ(位置合わせ)などのその他のパラメーターを変更できます。



元のレッスンへのリンク



追加資料
公式のUnity3dスクリプトリファレンスからのGUIText.text変数に関する情報



公式コンポーネントリファレンス> Unity3dからのGUIテキストコンポーネントに関する情報







基本レッスン15-スクリプトを使用したコンポーネントの追加








このレッスンでは、スクリプトを使用してコンポーネントをオブジェクトに追加する方法を示し、それらを一度だけ追加したことを確認します。



ランタイムにコンポーネントを追加するために、スクリプトを使用します。

この例では、プラットフォーム(「プラットフォーム」)とその上にあるボックス(剛体のある「ボックス」)があります。





箱が落ちたらすぐにプラットフォームへのコンポーネントを完成させてみましょう。

addCompスクリプトを追加し、次のコードをクラスに追加します。

 void OnCollisionEnter(Collision myCollision) { if (myCollision.gameObject.name == "Platform") { myCollision.gameObject.AddComponent(Rigidbody); } }
      
      







スクリプトをボックスに追加します。 私たちはプレイを押してみます-ボックスがプラットフォームに落ちるとすぐに、それも落ち始めます。





ただし、コンソールには警告が表示されます。

 Can't add component 'Rigidbody' to Platform because such a component is already added to the game object!
      
      







このメッセージは、ボックスがプラットフォームと衝突するたびにRigidbodyコンポーネントを追加しようとしているため、つまり、複数回追加しようとしているために受信しました。 これを防ぐには、チェックを追加し、欠落している場合にのみコンポーネントを追加する必要があります。 OnCollisionEnter()にもう1つの条件を追加します。

 void OnCollisionEnter(Collision myCollision) { if (myCollision.gameObject.name == "Platform") { if(!myCollision.gameObject.rigidbody) { myCollision.gameObject.AddComponent("Rigidbody"); } } }
      
      







次に、アプリケーションを実行し、コンソールに警告がないことを確認します。



元のレッスンへのリンク









基本レッスン16-シーン間の切り替え








このレッスンでは、Unityプロジェクトのシーンを切り替えるスクリプトを記述する方法について説明します。



Unityを完全に使用するには、異なるシーン間を切り替えたり、異なるレベル、メニュー、その他のコンテンツをロードできる必要があります。 これを行うには、 ApplicationクラスのLoadLevel()メソッドを使用します。



この例では、2つのシーンがあります。 最初(「レベル」) -キューブと平面(「床」)で、その上にあります。2番目(「ゲームオーバー」) -緑の光子とGUI Text'om-「YOU WIN!」

b1600

b1601



次のコードでスクリプト(LoadLevel)を追加します。

 void OnCollisionEnter (Collision myCollision) { if (myCollision.gameObject.name == "floor") { Application.LoadLevel("gameover"); } }
      
      







再生をクリックします。 その結果、コンソールにエラーが表示されました:

 Level 'gameover' (-1) couldn't be loaded because it has not been added to the build settings. To add a level to the build settings use the menu File->Build Settings...
      
      







実際、Applicationクラスを使用する場合、 ビルド設定で最終アプリケーションにロードするすべてのシーンを指定する必要があります。 [ファイル]-> [ビルド設定]ビルド設定に移動し、 レベルゲームオーバーシーンプロジェクトビューから[ビル設定]のトップフィールドにドラッグします。

b1602



エディタウィンドウからレベル名を指定できるようにスクリプトを少し変更し、スクリプトをより「柔軟」にします。

 public string myLevel; void OnCollisionEnter (Collision myCollision) { if (myCollision.gameObject.name == "floor") { Application.LoadLevel(myLevel); } }
      
      







エディターウィンドウで、コンポーネントの対応するフィールドに対して、ロードするシーンの名前を入力します。

b1603



元のレッスンへのリンク



追加資料
公式のUnity3dスクリプトリファレンスからのApplication.LoadLevel関数に関する情報



公式Unity3dスクリプトリファレンスのOnTriggerEnter関数に関する情報




All Articles