1

すべての定数を1つのファイルにグループ化し、インスペクターに表示する必要があります。これが私が試したことです:

  1. #define定数

    #define speed 10.0f
    #define hp 3
    

    これは、どこに置いても機能しません、エラー:

    ファイル内の最初のトークンの後にプリプロセッサシンボルを定義または定義解除できません

  2. 静的を使用する

    public static readonly float speed = 10.0f;
    public static readonly int hp = 3;
    

    動作しますが、メインカメラに取り付けると、定数がインスペクターウィンドウに表示されません。さて、私はインスペクターが静的フィールドをサポートしていないことを知っています。

  3. 提案どおりにシングルトンを使用する

    using UnityEngine;
    using System.Collections;
    
    public class GameConfig : MonoBehaviour {
    
    
    private static GameConfig instance;
    
    public GameConfig() 
    {
        if (instance != null) 
        {
            Debug.LogError("GameConfig Warning: unable to create multiple instances");
        }
        instance = this;
    }
    
    public static GameConfig Instance 
    {
        get
        {
            if (instance == null) 
            {
                Debug.Log("GameConfig: Creating an instance");
                new GameConfig();
            }
            return instance;
        }
    }
    

    今、私が追加した場合:

    public float speed = 10.0f;
    

    GameConfig.Instance.speedはアクセス可能ですが、モノラルエディターはオートコンプリートをポップアウトしません。そしてそれはこのメッセージを受け取ります:

    CompareBaseObjectsは、メインスレッドからのみ呼び出すことができます。
    コンストラクターとフィールド初期化子は、シーンをロードするときにロードスレッドから実行されます。
    コンストラクターまたはフィールド初期化子でこの関数を使用しないでください。代わりに、初期化コードをAwakeまたはStart関数に移動してください。

    私が試してみると:

    public float speed = 10.0f;
    public float Speed {get {return speed;}}
    

    同じメッセージが表示されます。

ただし、ゲームは引き続き機能し、変数はインスペクターに正しく表示されます。注:修正しても、他に方法はありますか?2つの名前(プロパティ+フィールド)と面倒な作業で定数を書くのは冗長に思えるので。

4

1 に答える 1

2

Unity by C#のgameObjectでシングルトンを使用するには、サブクラス(GameConfig)のコンストラクターを使用せずに、GameObjectを作成してから、必要なコンポーネントを追加します。このような:

private static GameConfig _instance = null;
public static GameConfig instance 
{
    get {
        if (!_instance) {
            //check if an GameConfig is already in the scene
            _instance = FindObjectOfType(typeof(GameConfig)) as GameConfig;

            //nope create one
        if (!_instance) {
            var obj = new GameObject("GameConfig");
            DontDestroyOnLoad(obj);
            _instance = obj.AddComponent<GameConfig>();
            }
        }
        return _instance;
    }
}

ちなみに、メソッド2では、自分で検査UIを設定することで物事を成し遂げることができます。GameConfigのカスタムエディタを構築し、検査したいものを追加します。詳細については、CustomEditor属性Editor.OnInspectorGUIを参照してください。インスペクターをカスタマイズする方法やデフォルトのエディターを拡張する方法がわからない場合は、Unityのサイトの拡張エディターでいくつかの便利なガイドを見つけることができます(カスタムインスペクターのセクションが適している場合があります)。

于 2013-01-26T01:03:30.353 に答える