private static GameManager instance = new GameManager();
が問題です。
GameObject
にスクリプトが添付されている場合、そのスクリプトのタイプのインスタンスは、スクリプト内でthis
と参照されます。つまり、同じスクリプトが複数のGameObject
に添付されている場合、同じタイプのインスタンスが複数存在する可能性があります。したがって
、特定のインスタンスは、インスペクタで設定さcurLevel = 1
を有するインスタンス特定GameObject
に取り付けられたタイプのあります。これは、スクリプト内でthis
と呼ばれることを意味します。 より
あなたのコードのようGameManager
の新しいインスタンスを宣言するとstatic GameManager instance
は、別のインスタンスを指しているので、あなたは基本的にインスペクタのすべての値を無視しているが、インスタンスあなたはインスペクタでの値を設定します。
インスペクタを使用して宣言した特定のインスタンスを使用するには、次の操作を行う必要があります。私はAwake()
にStart()
を変更
using System.Collections.Generic;
using System.Collections;
using UnityEngine;
public class GameManager : MonoBehaviour
{
private static GameManager instance;
public static GameManager get() { return instance; }
public int currentLevel;
public int curLevel { get; set; }
public int totalEnemy;
public int totLevel { get; set; }
void Awake()
{
if (instance == null)
{
instance = this;
}
else
{
Debug.LogError(string.Format("GameManager.Awake(): More than one instances of this type {0} is being initialised but it's meant to be Singleton and should not be initialised twice. It is currently being initialised under the GameObject {1}.", this.GetType(), this.gameObject.name));
Destroy(gameObject);
}
curLevel = currentLevel;
totLevel = totalEnemy;
}
}
注意。これは、他のスクリプトからこのメソッドで初期化された値を参照しているためで、実行時に異なるMonoBehaviours
の間で最初に呼び出されるStart()
を保証することができないためです。しかし、UnityはAwake()
が常にStart()
より早く呼び出されることを保証します。さらに、Awake()
で自己初期化可能な変数を初期化し、この実行順序のために他のスクリプトに依存する変数をStart()
に初期化するのはUnityのベストプラクティスです。
最後に、あなたのシーンにGameManager
という成分を持つ複数のGameObject
がある場合に問題が発生します。このようなオブジェクトが2つある場合を考えてみましょう。シーンがロードされると、各スクリプトはAwake()
を呼び出し、両方ともprivate static GameManager instance;
を2つのthis
のそれぞれに設定します。その結果、あるものが別のものに上書きされます。
このスクリプトを慎重に使用し、にこのスクリプトが1つだけ含まれていることを確認してください。しかし、あなたのコードを知らない人が思考せずにそれを使うことができるように、コードを書くべきです。が簡単に検出される可能性があります。です。
EDIT:
OPさんのコメントに対応するため、このタイプは複数回のプロジェクトに比べて初期化されるとき、私が処理するコードを追加しました。 @Karduxの提案に加えて、プロジェクトをにサイレントにしたくないので、私はDebug.LogError()
を追加しました。を解決しました。問題が発生した場合は、通知を受けたいと思います。
プロジェクトで頻繁にSingleton
Sを使用している場合は、すべての子Singleton
のためのプロセスをチェックし、このインスタンスを扱う親abstract class Singleton
を持ちたい、とSingleton
からGameManager
継承している場合があります。
ただし、誤って使用すると悪い設計パターンとみなされますので、慎重にSingleton
を使用してください。 (そして、私はそれを正しく使うことができないので、それを使用することはできません。)
あなたは 'currentLevel'を変更したようですが、 'instance'を変更する必要があります –