はじめに
Unity初心者の方向けに、スクリプトやシーンをまたいで変数を共有する方法について
できるだけわかりやすくまとめました。
目次
1.同じシーンのスクリプト間で変数を共有する
1.1. 同じオブジェクトの別スクリプト
1.2. 別オブジェクトの別スクリプト
2.別シーンのスクリプト間で変数を共有する
2.1. public static 変数として宣言する【お手軽】
2.2. プロパティを使って呼び出す【安全】
2.3. ゲームオブジェクトを破壊せずに保持する【BGMにおすすめ】
1. 同じシーンのスクリプト間で変数を共有する
1.1. 同じオブジェクトの別スクリプト
例:Playerにつけた別スクリプトに、PlayerについているPlayerScript.csを読み込みたい
→スクリプトをGetComponentで読み込む
//@呼ばれる方のスクリプト
public int speed=1;
//@呼ぶ方のスクリプト
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で読み込む
//@呼ばれる方のスクリプト
public int speed=1;
//@呼ぶ方のスクリプト
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 変数として宣言する【お手軽】
→ゲーム全体に変数が保存される=シーン遷移でオブジェクトが破棄されても変数が生き残る
//@呼ばれる方のスクリプト
public static int a=100;
//@呼ぶ方のスクリプト
int number = Script1.a; // =変数を呼び出したい元のスクリプトのクラス名、変数名;
void Start()
{
Debug.Log(number + "成功!!");
}
}
注意点:どのスクリプトにStatic変数を書いたか忘れずに把握しておくこと
2.2. プロパティを使って呼び出す【安全】
→外部からは変数をいじることができないのでバグが起こりづらい
(プロパティとはGetとSetを用いたプログラムの名称!)
//@呼ばれる方のスクリプト
private int num;
public int GetSetProperty //public 戻り値 プロパティ名
{
get { return num; } //get {return フィールド名;}
set { num = value; } //set {フィールド名 = value;}
}
//@呼ぶ方のスクリプト
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を使ってそもそもシーンをまたいでも破棄されないようにする
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]についてまとめてみた!