2016-11-16 29 views
0

首先不能住我想说对不起我的英文不好和语法错误定制督察阵列/列表播放模式

我有一个问题,那就是当我在我的阵列我所做的编辑器按下播放键在我的自定义编辑器disapares(也是当我更新脚本)!

首先我有一个名为“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

顺便说一句,我希望的产品类别是好的,我知道我可以清理代码很多,但我做了这个真的becuse IM在一个秘密项目工作快速,不希望使用该代码:)

回答

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拿着ColorChanger脚本),当你调用的ColorChanger.single[i].gameObjectToChange = [...];CustomColorChangerInspector检查脚本不知道你提到过,你的游戏对象的。

这就是为什么你必须引用它。我通常做它快速定制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)); 
      [...] 
     } 
    } 
} 
+0

我已经tryed将所有你推荐的东西,但同样的事情还是发生了: /但是m_Target究竟是什么?我应该如何添加它? – Jrp0h

+0

@ Jrp0h好了,我不好意思,我没注意到你直接提到'ColorChanger.single [i]',所以你的自定义编辑器脚本并不知道他必须修改哪个脚本实例。你必须在这里使用一些不同的东西。我会在几分钟内更新我的答案,以增加这一点。 – Kardux

+0

非常感谢!有些东西终于奏效我非常感谢你的帮助!我认为因为“ColorChangerSingle”的列表是静态的,我可以在不考虑脚本的情况下在所有脚本中引用它!以及我在C#编程中学到了很多东西:)但非常感谢你让我从挫折中解脱出来。 – Jrp0h