首先,我想说对不起因为我的英语不好和语法错误
我遇到了一个问题,那就是当我在编辑器中按下播放时,我在自定义编辑器中制作的数组会消失(当我更新脚本时也会这样做)!
首先我得到一个名为“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顺便说一下,我希望这个类别很好,我知道我可以清理代码很多,但我很快就开始这个秘密项目,并且不想使用该代码:)
答案 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));
[...]
}
}
}