不足しているコンポーネント
CoddyのUnityジャーニー「Unityスクリプトの基礎」セクションの一部。レッスン 45/85。
要求したコンポーネントがオブジェクトに付いていなくても、GetComponentは処理を止めません。エディターでは、nullと等しいと判定される代替値を返し、コードがそれを初めて使ったときにUnityが例外をスローします。このボールはSpaceキーを押すと跳ねるはずですが、Rigidbodyが付いていません。
Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
rb.AddForce(Vector3.up * 300f);
}
}Spaceキーを押すと、MissingComponentException: There is no 'Rigidbody' attached to the "Ball" game object, but a script is trying to access it.と表示されます。このメッセージには、見つからない型とオブジェクトの名前が示されています。インスペクターでコンポーネントを追加するか、意図的にオブジェクトに付いていない場合があるなら、先に有無を確認しましょう。コンポーネントがある場合、TryGetComponent(out rb)はtrueを返してrbに値を設定し、ない場合はエラーなしでfalseを返します(outを使うと、メソッドから変数を通じて値を返せます)。
bool canHop;
void Start()
{
canHop = TryGetComponent(out rb);
}その後、Update()ではif (canHop)の場合にのみボールを押し上げます。エディターの外、つまりビルドしたゲームでは、GetComponentは通常のnullを返すため、同じ間違いをするとNullReferenceExceptionが発生します。
チャレンジ
中級Lamp2にはLightがありません。Spaceを押しても無視するようにし、壊れていることを表示しましょう。
Start()で、GetComponentの行をhasBulb = TryGetComponent(out bulb);に置き換え、bool hasBulb;フィールドを追加します。hasBulbがfalseのとき、ランプに色を付けます:GetComponent<Renderer>().material.color = Color.gray;。Update()で、hasBulbがtrueのときだけライトを切り替えます。
「プレイ」を押してからSpaceを押します。正常なランプは切り替わり、エラーは発生しません。その後、「確認」を押します。
自分で試してみよう
using UnityEngine;
public class LampSwitch : MonoBehaviour
{
Light bulb;
void Start()
{
bulb = GetComponent<Light>();
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
bulb.enabled = !bulb.enabled;
}
}
}
Unityスクリプトの基礎のすべてのレッスン
自分で練習してみよう: Unityプレイグラウンド