LoginSignup
24
15

More than 1 year has passed since last update.

【Unity】変数の受け渡し まとめ【入門】

Last updated at Posted at 2021-11-06

はじめに

Unity初心者の方向けに、スクリプトやシーンをまたいで変数を共有する方法について
できるだけわかりやすくまとめました。

目次

1.同じシーンのスクリプト間で変数を共有する
  1.1. 同じオブジェクトの別スクリプト
  1.2. 別オブジェクトの別スクリプト
2.別シーンのスクリプト間で変数を共有する
  2.1. public static 変数として宣言する【お手軽】
  2.2. プロパティを使って呼び出す【安全】
  2.3. ゲームオブジェクトを破壊せずに保持する【BGMにおすすめ】

1. 同じシーンのスクリプト間で変数を共有する

1.1. 同じオブジェクトの別スクリプト

例:Playerにつけた別スクリプトに、PlayerについているPlayerScript.csを読み込みたい
→スクリプトをGetComponentで読み込む

PlayerScript.cs
//@呼ばれる方のスクリプト
public int speed=1;
ChangingSpeed.cs
//@呼ぶ方のスクリプト
void Start()
    {
        Invoke("Change", 3); //3秒経ったら実行する
    }
void Change()
    {
        Debug.Log("例1成功!スピードアップ!");
        PlayerScript playerscript = GetComponent<PlayerScript>();
        playerscript.speed = 10;
    }
}

1.2. 別オブジェクトの別スクリプト

例:空のGameObjectにつけたスクリプトに、PlayerについているPlayerScript.csを読み込みたい
→特定のゲームオブジェクトを.Findで探し、スクリプトをGetComponentで読み込む

PlayerScript.cs
//@呼ばれる方のスクリプト
public int speed=1;
SpeedChanger.cs
//@呼ぶ方のスクリプト
void Start()
    {
        Invoke("Change", 3);
    }
void Change()
    {
        Debug.Log("例2成功!スピードアップ!");
        PlayerScript playerscript; //呼ぶスクリプトにあだなつける
        GameObject obj = GameObject.Find("Player"); //Playerっていうオブジェクトを探す
        playerscript = obj.GetComponent<PlayerScript>(); //付いているスクリプトを取得
        playerscript.speed = 10;
    }
}

2. 別シーンのスクリプト間で変数を共有する

2.1. public static 変数として宣言する【お手軽】

→ゲーム全体に変数が保存される=シーン遷移でオブジェクトが破棄されても変数が生き残る

Script1.cs
//@呼ばれる方のスクリプト
public static int a=100;
Script2.cs
//@呼ぶ方のスクリプト
int number = Script1.a; // =変数を呼び出したい元のスクリプトのクラス名、変数名;
void Start()
    {
        Debug.Log(number + "成功!!");
    }
}

注意点:どのスクリプトにStatic変数を書いたか忘れずに把握しておくこと

2.2. プロパティを使って呼び出す【安全】

→外部からは変数をいじることができないのでバグが起こりづらい
(プロパティとはGetとSetを用いたプログラムの名称!)

Script1.cs
//@呼ばれる方のスクリプト
private int num;
public int GetSetProperty  //public 戻り値 プロパティ名
    { 
        get { return num; } //get {return フィールド名;}
        set { num = value; } //set {フィールド名 = value;}
    }
Script2.cs
//@呼ぶ方のスクリプト
int number = Script1.a; // =変数を呼び出したい元のスクリプトのクラス名、変数名;
void Start()
    {
        Script1 script = new Script1(); //インスタンス化する
        script.GetSetProperty = 10; //set、numを10に書き換える
        Debug.Log(script.GetSetProperty); //get、numを取得してConsoleに表示
    }
}

2.3. ゲームオブジェクトを破壊せずに保持する【BGMにおすすめ】

→DontDestroyOnLoadを使ってそもそもシーンをまたいでも破棄されないようにする

BGM.cs
AudioSource audioSourceBGM;
void Start()
    {
        audioSourceBGM = GetComponent<AudioSource>();
    }
void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            DontDestroyOnLoad(this.gameObject);
            SceneManager.LoadScene("Scene2");
        }
    }
}

注意点:同じオブジェクトが重複する(ex.BGMが二重に聞こえる)が起こりうるので、不要になったら Destroy (this); などで削除する

参考

遷移しても大丈夫!Unityの変数を異なるシーン間で共有する方法
Unityで他のスクリプトの変数や関数を利用する
C#のプロパティについて調べてみた
【Unity】スクリプトを他のスクリプトから参照する方法
【Unity】よく出てくるprivate, public, static,[SerializeField]についてまとめてみた!

24
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
24
15