インスペクターでドラッグ&ドロップ可能な変数のパターン

インスペクターで初期値を入力するための修飾子(または、属性)には、public と[SerializeField]があります

この2つの違いについてサンプルを通して考えていきます

考えてみましょう

次の実行結果から、Enemyにアタッチされているスクリプトを考えてみましょう
プロジェクト名はFieldValueSampleとしましょう

using UnityEngine;

public class EnemyController : MonoBehaviour
{
    // GameManagerゲームオブジェクトのColorChangerコンポーネント(スクリプト)の
    // Playerフィールドをnullにしてしまう悪人
    void Awake()
    {
        GameObject.Find("GameManager").GetComponent<ColorChanger>().Player = null;
    }
}

エラーの対処をしましたが、次のようになりましたので、また原因を考えてみましょう
EnemyContollerを変更せずに考えてみましょう

Playerフィールドを守るためにアクセス修飾子をpublicからpriveteに変更します
(C#では、アクセス修飾子を省略してもprivete扱いになるため、このコードではそのようにしています)

using UnityEngine;

public class ColorChanger : MonoBehaviour
{
    GameObject Player;

    private void Start()
    {
        Player.GetComponent<Renderer>().material.color = Color.blue;
    }
}

上記変更で、EnemyControllerからアクセスが禁止されます
VisualStudioでは、次のコードのPlayer部分が赤い波線になります

using UnityEngine;

public class EnemyController : MonoBehaviour
{
    // GameManagerゲームオブジェクトの
    // ColorChangerコンポーネント(スクリプト)の
    // Playerフィールドをnullにしてしまう悪人
    void Awake()
    {
        GameObject manager = GameObject.Find("GameManager");

        manager.GetComponent<ColorChanger>().Player = null;
    }
}

Enemyは悪いことができなくなりました。かんねんして、manager.GetComponent().Player = null:を削除しました。

実行してみると、今度はnullエラーが出ました。

どうもGameManagerでPlayerをドラッグ&ドロップできなくなってしまったようです

Unityには、このように

アクセス修飾子をprivateにしたいと同時にインスペクターにも代入できるようにしたいを成り立たせるために属性が用意されています

[SerializeField]
GameObject Player;

Unity

Posted by hidepon