我需要将所有常量分组到一个文件中并在检查器上显示它们。这是我尝试过的:
#define
常量
#define speed 10.0f
#define hp 3
这不起作用,无论我把它们放在哪里,错误:
无法在文件
中的第一个标记后定义或取消定义预处理程序符号
使用静态
public static readonly float speed = 10.0f;
public static readonly int hp = 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;}}
我收到同样的消息。
但游戏仍然可以正常工作,并且变量在检查员身上正确显示。 注意:即使我修复它,还有其他方法吗?因为用2个名字(属性+字段)和繁琐的工作来编写常量似乎是多余的。
答案 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 attribute和Editor.OnInspectorGUI。如果您不知道如何自定义检查器或如何扩展默认编辑器,您可以在Unity网站的Extending Editor中找到一些有用的指南(Custom Inspectors部分可能适合您)。