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

本文关键字:于播放 播放 模式 检查 数组 列表 自定义 | 更新日期: 2023-09-27 18:18:21

首先我想说对不起,我的英语和语法都很糟糕

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

首先,我有一个名为"ColorChangerSingle"的脚本,这是我声明变量的脚本

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

顺便说一句,我希望这个分类是好的,我知道我可以清理代码很多,但我做这个真的很快,因为我在一个秘密项目工作,不想使用那个代码:)

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

我认为您的问题不是来自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());
}

EDIT:此外,你必须给你的自定义检查器脚本一个你想要编辑的脚本实例的引用(想想你的许多GameObjects持有ColorChanger脚本),当你调用ColorChanger.single[i].gameObjectToChange = [...];时,你的CustomColorChangerInspector检查器脚本不知道你也引用了哪个GameObject。

这就是为什么你必须引用它。对于快速自定义检查器,我通常这样做(有不止一种方法,例如使用序列化):

[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));
            [...]
        }
    }
}