在使用Unity的UnityEditor类的OnInspectorGUI方法时,我似乎陷入了困境。我想在检查器中命名数组元素,以便于编辑,根据文档,我目前正在使用:
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]);
我猜这是因为我的数组是在游戏开始时初始化的,而编辑器代码在开发过程中一直在运行。
我该如何解决这种情况呢?
非常感谢。
发布于 2016-05-18 19:51:14
你必须在一个只运行一次的函数中初始化aBaseStats
。
下面的代码是BAD
public float[] aBaseStats = new float[35];
void Start(){
}
下面的代码是GOOD
public float[] aBaseStats;
void Start(){
aBaseStats = new float[35];
}
在一个只运行一次的编辑器回调函数中初始化它。
编辑:
我不知道会在OnInspectorGUI
函数()之前运行的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]);
}
发布于 2016-05-18 21:28:53
作为程序员回答的补充,我想向您指出以下几点:
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);
}
}
https://stackoverflow.com/questions/37298579
复制相似问题