たくあんポリポリ

勉強したことを載せていきます。最近、技術系の記事はZennに書いています。(https://zenn.dev/chittai)

UnityでScene遷移時にstatic変数の値を引き継いでしまう問題に遭遇した時

UnityでSceneの遷移時に少しハマったのでメモします。あまり具体例とかないですが。

環境

使用した環境は以下

  • Unity 2018.1.3f1

何にハマったのか

各シーンにて、条件を満たすとSceneの遷移が起こるようになっていて以下の様に遷移してみた。

Menu→Play→Menu→Play

最初Menuから入って、その後Playに移って、クリアしたらMenuに戻ってまたPlayへと遷移していたのですが、2回目の遷移の時にゲームが始まった瞬間に終わってしまったり、Clearの時に表示されるUIが消えなかったりして思った様に動いてはくれませんでした。

何が原因だったのか

問題は2つあって、

  1. 原因となっていたのは、ゲームのプレイ状態(開始・プレイ中・終了のステータス)を保持する変数がstaticで定義されていて、Sceneが変わってもゲームのプレイ状態を引き継いでしまっていたことが問題でした。(クリア後にMenuに戻っても、ゲームのプレイ状態はクリアのままなので、次にPlayにいってもすぐに終了してしまう)
  2. もう一つは、同じ様にstaticで定義していたのだけれど、Start()の前、インスタンス変数を定義するところで初期化されている変数があったためSceneが始まった際にきれいに初期化されなかったことです。

例として、変更前と

public class PlayManager : MonoBehaviour {
    float _PlayTime = 20;

~~~

変更後

public class PlayManager : MonoBehaviour {
    float _PlayTime;

    void Start () {
        _PlayTime = 20;
    }

~~~

何を対応したのか

Scene遷移時にゲームのプレイ状態の初期化を入れたのと、もう一つはインスタンス変数として定義した変数はStart()の中で定義するようにしたこと。この当たりのstatic変数の扱いとかはUnityのベストプラクティス的なものがあるのかな?