【问题标题】:Unity3D - how to use arrays with custom inspector code?Unity3D - 如何使用带有自定义检查器代码的数组?
【发布时间】:2016-09-14 21:06:01
【问题描述】:

Unity 的 UnityEditor 类的 OnInspectorGUI 方法似乎陷入了第 22 条问题。我想在检查器中命名数组元素以便于编辑,目前我正在使用,根据文档:

public override void OnInspectorGUI()
{
   J_Character charScript = (J_Character)target;

   charScript.aBaseStats[0] = EditorGUILayout.FloatField("Base Health", charScript.aBaseStats[0]);

}

在我的 J_Character 脚本中,我像这样初始化 aBaseStats 数组:

public float[] aBaseStats = new float[35];

问题是,每当我尝试在编辑器中执行任何操作(因此调用 OnInspectorGUI)时,我都会收到指向该行的索引超出范围错误

charScript.aBaseStats[0] = EditorGUILayout.FloatField("Base Health", charScript.aBaseStats[0]);

我猜这是因为我的数组是在游戏开始时初始化的,而编辑器代码在开发过程中一直在运行。

我该如何解决这种情况?

非常感谢。

【问题讨论】:

    标签: arrays unity3d initialization customization execution


    【解决方案1】:

    你必须在一个只运行一次的函数中初始化aBaseStats

    下面的代码是BAD

    public float[] aBaseStats = new float[35];
    void Start(){
    
    }
    

    下面的代码是GOOD

    public float[] aBaseStats;
    void Start(){
    aBaseStats = new float[35];
    }
    

    在运行一次的编辑器回调函数中对其进行初始化。

    编辑:

    我不知道将在OnInspectorGUI function() 之前运行的Start 回调函数。下面的 hack 应该可以工作。

    public float[] aBaseStats;
    bool initialized = false;
    public override void OnInspectorGUI()
    {
       if (!initialized)
       {
           initialized = true;
           aBaseStats = new float[35];
       }
    
       J_Character charScript = (J_Character)target;
    
       charScript.aBaseStats[0] = EditorGUILayout.FloatField("Base Health",aBaseStats[0]);
    
    }
    

    【讨论】:

    • 谢谢。我已经在 Start 和 Awake 中尝试过,但它不起作用 - 再次,大概是因为这些功能只在游戏开始时运行,而不是在编辑器中运行。您能否通过“在运行一次的编辑器回调函数中对其进行初始化”来扩展您的意思。请问?
    • @Absinthe Editor的回调函数很多,不知道你用的是哪一个。如果你列出你正在使用的所有 Unity OnSomething 函数会很好,然后我会告诉你正确的运行一次。
    • @Absinthe 尝试一些更简单的东西。试试charScript.aBaseStats[0] = 1f; 看看你是否仍然得到同样的错误。如果你这样做了,那么你没有很好地初始化它。确保在代码行charScript.aBaseStats[0] = EditorGUILayout.FloatField("Base Health", charScript.aBaseStats[0]);之前初始化它
    • charScript.aBaseStats[0] = 1f;没用,同样的错误。如果我在 OnInspectorGui 方法中初始化,则不会出现错误,但当然在每次调用它时,我分配给数组的任何值都会重新初始化。我已经尝试为编辑器代码寻找一些等效的 MonoBehaviours Awake 功能,但我找不到任何东西。我在自定义编辑器脚本中使用的唯一 OnSomething(实际上也是唯一的方法)是 OnInspectorGui
    • 它们没有重新初始化。 bool 可以防止这种情况发生。
    【解决方案2】:

    作为程序员回答的补充,我想指出以下几点:

    http://docs.unity3d.com/ScriptReference/ExecuteInEditMode.html

    这似乎正是您正在寻找的功能。 (即使播放模式未激活,它也会运行该方法)

    using UnityEngine;
    using System.Collections;
    
    [ExecuteInEditMode]
    public class ExampleClass : MonoBehaviour {
        public Transform target;
        void Update() {
            if (target)
                transform.LookAt(target);
    
        }
    }
    

    【讨论】:

    • 谢谢,尝试在 Awake 中初始化并以 [ExecuteInEditMode] 开始,但遇到了同样的错误
    • 您是否尝试过结合我们的答案?如果您设置一个变量来跟踪初始化并使用更新函数来初始化您的值(如果它们尚未初始化)它应该可以工作。如果不能,您可以发布带有匹配错误的代码示例吗?
    猜你喜欢
    • 1970-01-01
    • 2019-05-27
    • 1970-01-01
    • 2023-03-08
    • 2016-07-14
    • 2015-03-18
    • 2012-02-21
    • 2020-07-03
    • 1970-01-01
    相关资源
    最近更新 更多