Unity3D Game:处理一个文件中的常量

时间:2013-01-26 00:37:57

标签: c# iphone ios unity3d

我需要将所有常量分组到一个文件中并在检查器上显示它们。这是我尝试过的:

  1. #define常量

    #define speed 10.0f
    #define hp 3
    

    这不起作用,无论我把它们放在哪里,错误:

      

    无法在文件

    中的第一个标记后定义或取消定义预处理程序符号
  2. 使用静态

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

    它可以工作,但当我将它附加到主摄像机时,常量不会显示在检查器窗口中。那么我现在知道检查员不支持静态字段。

  3. 建议使用Singleton

    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   加载场景时,将从加载线程执行构造函数和字段初始值设定项   不要在构造函数或字段初始值设定项中使用此函数,而是将初始化代码移动到唤醒或启动函数。

    如果我尝试:

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

    我收到同样的消息。

  4. 但游戏仍然可以正常工作,并且变量在检查员身上正确显示。 注意:即使我修复它,还有其他方法吗?因为用2个名字(属性+字段)和繁琐的工作来编写常量似乎是多余的。

1 个答案:

答案 0 :(得分:1)

要通过C#在Unity中的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 attributeEditor.OnInspectorGUI。如果您不知道如何自定义检查器或如何扩展默认编辑器,您可以在Unity网站的Extending Editor中找到一些有用的指南(Custom Inspectors部分可能适合您)。