名前で探す
CoddyのUnityジャーニー「Unityスクリプティングの基礎」セクションの一部。レッスン 42/67。
GameObject.Find("Player")はシーン内で名前が完全に一致するアクティブなオブジェクトを検索して返します。一致するものがなければnullを返します。Inspectorでフィールドを設定する手間を省けますが、その代わりシーン内のすべてのオブジェクトを検索します。そのため、Start()内で一度だけ呼び出し、結果をフィールドに保持しましょう。この防犯カメラはゲーム開始時にPlayerを見つけ、毎フレーム監視します。
private Transform player;
void Start()
{
player = GameObject.Find("Player").transform;
}
void Update()
{
transform.LookAt(player);
}名前は大文字・小文字やスペースも含めて完全に一致させる必要があります。"player"や"Player "では何も見つかりません。Findは非アクティブ(非表示)のオブジェクトもスキップします。検索に失敗してもnullが静かに返され、結果を使う次の行でエラーが発生します。ここでは.transformがNullReferenceExceptionをスローします。"Car/Wheel"のようなパスを指定すると、Carの子であるWheelが見つかります。
チャレンジ
中級ローバーは目標までの距離を報告します。
Start()で、Goalという名前のオブジェクトを見つけ、そのTransformをgoalに保持します。- Spaceキーを押すたびに、ローバーから目標までの距離を
Distance to goal: 5のようにログに出力します。
目標は移動する可能性があるため、Spaceキーを押した瞬間に測定します。
Playを押し、ゲーム画面をクリックしてSpaceキーを押し、次にCheckを押します。
自分で試してみよう
using UnityEngine;
public class Beacon : MonoBehaviour
{
private Transform goal;
void Start()
{
// Goal という名前のオブジェクトを探し、その Transform を goal に保持する。
}
void Update()
{
// Space: ゴールまでの距離をログに出力する。
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。