名前で検索
CoddyのUnityジャーニー「Unityスクリプトの基礎」セクションの一部。レッスン 56/85。
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 = GameObject.Find("Goal").transform;を設定します。Update()で、Input.GetKeyDown(KeyCode.Space)のときに、"Distance to goal: " + Vector3.Distance(transform.position, goal.position)をログに出力します。
「プレイ」を押してSpaceキーを押すと、コンソールにDistance to goal: 5と表示されます。その後、「確認」を押します。
自分で試してみよう
using UnityEngine;
public class Beacon : MonoBehaviour
{
private Transform goal;
void Start()
{
// Goalという名前のオブジェクトを見つけ、そのTransformをgoalに保持する。
}
void Update()
{
// Space: ゴールまでの距離をログに記録する。
}
}
Unityスクリプトの基礎のすべてのレッスン
自分で練習してみよう: Unityプレイグラウンド