Unity编辑器-C#:为什么我的列表重置为null OnEnable?

时间:2019-02-02 15:25:01

标签: c# list unity3d

我试图制作一个自定义的统一编辑器,由于某种原因,每次我关闭窗口并再次打开它时,我的列表都将重置为空。

我试图通过键和值分离成2名单独的列表中的数据从字典保存OnDisable,然后重新创建字典OnEnable通过组合列表。但每次OnEnable叫我从我的列表中得到一个空...

下面的的代码看起来像什么的例子。

public Dictionary<string, string> myDictionary = new Dictionary<string, string>();

[SerializeField]
public List<string> listOfDictionaryKeys;


    private void OnEnable()
    {
        // this always returns null
        Debug.Log(listOfDictionaryKeys.Count);

    }

    private void OnDisable()
    {
        // this successfully saves the keys to the list
        listOfDictionaryKeys = (myDictionary.Keys).ToList();

    }

没有任何人有任何想法,为什么我可能会失去我的列表数据?我没有在检查器中设置任何值,它们都是通过代码设置和保存的。

2 个答案:

答案 0 :(得分:0)

UnityEditor是一个棘手的野兽,它运行自己的回调循环,并且在编辑器中进行序列化和反序列化可能会有些混乱。

有时,统一对象将获得对象的任何构造函数的支持,并在下一次更新时使用默认值覆盖它。我想象一个对象的检查器在期望列表的地方找到null时将其初始化,但是如果您不将新的序列化表单与场景一起保存,则它将保持为null,并且当OnEnable发生在bull中时将为null (反序列化后),除非它与场景一起保存。

我对这个过程没有完全的了解,但这就是我的想象。

要快速解决此问题,请执行以下操作:

private void OnEnable()
{
    if (listOfDictionaryKeys==null) listOfDictionaryKeys=new List<string>();
    // this always returns null
    Debug.Log(listOfDictionaryKeys.Count);

}

这样,您就不会在存在的情况下意外删除它

答案 1 :(得分:0)

从您的问题中我真的无法理解@Bean(name = "activemqConnectionFactory") public PooledConnectionFactory connectionFactory(@Qualifier("activemqRedeliveryPolicy") RedeliveryPolicy redeliveryPolicy) { ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(); connectionFactory.setBrokerURL("tcp://" + env.getProperty("queue.url")); connectionFactory.setTrustAllPackages(true); PooledConnectionFactory pooledConnectionFactory = new PooledConnectionFactory(connectionFactory); pooledConnectionFactory.setMaxConnections(8); return pooledConnectionFactory; } OnEnable是您的编辑器脚本的一部分还是组件本身。

如果稍后:

当组件从禁用状态变为启用状态时,会调用

OnDisable,而当它在检查器中获得焦点时,会。禁用组件或相应的GameObject时,调用OnEnable的方式相同,如果失去焦点,则

如果您想要对检查器中的获得和失去焦点做出反应,则必须是Inspector脚本本身的OnDisabledOnEnable。例如

OnDisable

我也看不到您在字典中填充的位置,因为您说字典在检查器中没有发生。当具有直接访问字段的mixonb [CustomEditor(typeof(XY)] public class XYEditor : Editor { XY _target; SerializedProperty list; // Called when the class gains focus private void OnEnable() { _target = (XY) target; //Link the SerializedProperty list = serializedObject.FindProperty("listOfDictionaryKeys"); } public override void OnInpectorGUI() { //whatever your inspector does } // Called when the component looses focus private void OnDisable() { serializedObjet.Update(); // empty list list.ClearArray; // Reading access to the target's fields is okey // as long as you are sure they are set at the moment the editor is closed foreach(var key in _target.myDoctionary.keys) { list.AddArrayElementAtIndex(list.arraySize); var element = list.GetArrayElementAtIndex(list.arraySize - 1); element.stringValue = key; } serialzedObject.ApplyModifiedProperties; } } 时,这可能是个问题。