不足しているコンポーネント
CoddyのUnityジャーニー「Unityスクリプティングの基礎」セクションの一部。レッスン 31/67。
要求したコンポーネントがオブジェクトに付いていない場合でも、GetComponent は処理を止めません。Editor では、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. と表示されます。このメッセージには、見つからない型とオブジェクトの名前が示されています。Inspector でコンポーネントを追加するか、オブジェクトに意図的に付いていない場合があるなら、まず確認しましょう。TryGetComponent(out rb) は、コンポーネントがあれば true を返して rb に値を設定し、なければエラーなしで false を返します(out を使うと、メソッドは変数を通じて値を返せます)。
bool canHop;
void Start()
{
canHop = TryGetComponent(out rb);
}その後、Update() では if (canHop) の場合にのみボールを押し上げます。Editor の外、ビルドしたゲームでは、GetComponent は通常の null を返すため、同じミスをすると NullReferenceException が発生します。
チャレンジ
中級Spaceキーで街灯を点灯・消灯しますが、Lamp2の電球は壊れています。Lightがなく、Spaceキーを押すとMissingComponentExceptionで停止します。スクリプトを修正してください。
- Lightがある街灯は、Spaceキーで引き続き点灯・消灯します。
- Lightがない街灯はLightに触れないため、エラーは発生しません。
- ゲーム開始時に、Lightがない街灯は電球を
Color.grayにして、壊れていることがプレイヤーにわかるようにします。
Playを押してからSpaceキーを押し、エラーを確認します。修正したら、Checkを押してください。
自分で試してみよう
using UnityEngine;
public class LampSwitch : MonoBehaviour
{
Light bulb;
void Start()
{
bulb = GetComponent<Light>();
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
bulb.enabled = !bulb.enabled;
}
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。