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 中使用 C# 在游戏对象中使用单例,不应该使用子类(GameConfig)的构造函数,而是创建一个游戏对象,然后将所需的组件添加到其中。像这样:

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 回答