Menu
CoddyTech

不足しているコンポーネント

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が発生します。

challenge icon

チャレンジ

中級

Lamp2にはLightがありません。Spaceを押しても無視するようにし、壊れていることを表示しましょう。

  1. Start()で、GetComponentの行をhasBulb = TryGetComponent(out bulb);に置き換え、bool hasBulb;フィールドを追加します。
  2. hasBulbがfalseのとき、ランプに色を付けます: GetComponent<Renderer>().material.color = Color.gray;。
  3. 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プレイグラウンド