自定义检查器阵列/列表未处于播放模式

时间:2016-11-16 08:16:06

标签: c# unity3d

首先,我想说对不起因为我的英语不好和语法错误

我遇到了一个问题,那就是当我在编辑器中按下播放时,我在自定义编辑器中制作的数组会消失(当我更新脚本时也会这样做)!

首先我得到一个名为“ColorChangerSingle”的脚本,这是我声明varibles的脚本

using UnityEngine;
public class ColorChangerSingle
{
public GameObject gameObjectToChange;
public Color color;
}

然后我有一个名为“ColorChanger”的脚本,这是我制作自定义检查器的脚本,它得到的是“ColorChangerSingle”的静态列表

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ColorChanger : MonoBehaviour {
public static List<ColorChangerSingle> single = new List();
}

我有一个名为“CustomChangeColorInspector”的自定义检查器脚本,它是自定义检查器脚本。

using UnityEditor;
using UnityEngine;
[CustomEditor(typeof(ColorChanger))]
public class CustomColorChangerInspector : Editor
{
public override void OnInspectorGUI()
{
for (int i = 0; i < ColorChanger.single.Count; i++)
{
EditorGUILayout.BeginHorizontal();
ColorChanger.single[i].gameObjectToChange = (GameObject)EditorGUILayout.ObjectField(ColorChanger.single[i].gameObjectToChange, typeof(GameObject));
ColorChanger.single[i].color = EditorGUILayout.ColorField(ColorChanger.single[i].color);
EditorGUILayout.EndHorizontal();
if (ColorChanger.single[i].gameObjectToChange != null)
if (ColorChanger.single[i].gameObjectToChange.GetComponent() != null)
ColorChanger.single[i].gameObjectToChange.GetComponent().material.color = ColorChanger.single[i].color;
}
EditorGUILayout.BeginHorizontal("box");
if (GUILayout.Button("Add To Array"))
{
ColorChanger.single.Add(new ColorChangerSingle());
}
if (GUILayout.Button("Remove Object In Array"))
{
ColorChanger.single.RemoveAt(ColorChanger.single.Count - 1);
}
EditorGUILayout.EndHorizontal();
}
}

当我在“不播放模式”中添加数组时,一切正常(设置对象/更改它们的颜色)但是当我按下播放时,数组会“重置”,我认为它与“ColorChanger”脚本有关我将列表设置为等于ColorChangerSingle的新列表:/ 非常感谢任何帮助!

图片:

https://gyazo.com/167ab826b6d578ec5a66d9d2586479e8

https://gyazo.com/847a063f9885478200c5a504be1dae2a

谢谢你的时间,祝你有个美好的一天! // Jrp0h

顺便说一下,我希望这个类别很好,我知道我可以清理代码很多,但我很快就开始这个秘密项目,并且不想使用该代码:)

1 个答案:

答案 0 :(得分:0)

我不认为您的问题来自public static List<ColorChangerSingle> single = new List();行。

我建议您将[SerializeField]属性添加到single字段,将[System.Serializable]添加到ColorChangerSingle课程。你还确定你的场景在进入播放模式之前已经保存了(这是我以前做过的常见错误)吗?如果没有,您可以在OnInspectorGUI()方法的末尾添加类似的内容:

if(GUI.changed && !Application.isPlaying)
{
    EditorUtility.SetDirty(m_Target);
    EditorSceneManager.MarkSceneDirty(EditorSceneManager.GetActiveScene());
}

编辑:此外,您必须为自定义检查器脚本提供对要编辑的脚本实例的引用(想想许多 GameObjects 持有< strong> ColorChanger 脚本),当您致电ColorChanger.single[i].gameObjectToChange = [...]; CustomColorChangerInspector 检查员脚本时,您也不知道您所引用的哪个GameObject。

这就是你必须引用它的原因。我通常用于快速自定义inspetocrs的方式(例如,使用序列化有多种方法):

[CustomEditor(typeof(ColorChanger))]
public class CustomColorChangerInspector : Editor
{
    // I like to declare it once for all but you can also call "(ColorChanger)target" each time to refer to the target
    private ColorChanger m_Target;

    public override void OnInspectorGUI()
    {
        m_Target = target as ColorChanger;
        for (int i = 0; i < ColorChanger.single.Count; i++)
        {
            EditorGUILayout.BeginHorizontal();
            m_Target.single[i].gameObjectToChange = (GameObject)EditorGUILayout.ObjectField(m_Target.single[i].gameObjectToChange, typeof(GameObject));
            [...]
        }
    }
}