我试图制作一个自定义的统一编辑器,由于某种原因,每次我关闭窗口并再次打开它时,我的列表都将重置为空。
我试图通过键和值分离成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();
}
没有任何人有任何想法,为什么我可能会失去我的列表数据?我没有在检查器中设置任何值,它们都是通过代码设置和保存的。
答案 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脚本本身的OnDisabled
和OnEnable
。例如
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;
}
}
时,这可能是个问题。