Unity3D - 如何使用自定义检查器代码的数组?

时间:2016-05-18 11:42:25

标签: arrays unity3d initialization customization execution

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

git push ssh://jenkins.server:34841/scriptler.git HEAD:refs/heads/master

在我的J_Character脚本中,我初始化aBaseStats数组,如下所示:

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

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

}

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

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

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

我怎样才能解决这种情况?

非常感谢。

2 个答案:

答案 0 :(得分:4)

您必须在仅运行一次的函数中初始化aBaseStats

以下代码为 BAD

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

}

以下代码为 GOOD

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

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

修改

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

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]);

}

答案 1 :(得分:0)

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

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);

    }
}