我在制作UI时候,经常喜欢直接调用组件对象。 如果在游戏运行时再去Find和GetComponent会比较浪费效率。 我通常会挂一个脚本把游戏内用处理的组件都拉上去,但是不同的UI的要挂的对象不同,放的元素也不同。
这样有一个问题, 如果热更新可能就糟了,所以可以搞一个简单的统一的Dictionary,既统一也简单。
下面脚本是根据官网的稍微修改了下
using UnityEngine;
using System.Collections.Generic;
namespace Thinbug.Jason
{
public class SerializationData : MonoBehaviour, ISerializationCallbackReceiver
{
[System.Serializable]
public class KeyValue
{
public string name = "";
public Object target;
}
public List<KeyValue> listData = new List<KeyValue>();
public Dictionary<string, Object> dict
{ get { return _dict; }
}
Dictionary<string, Object> _dict = new Dictionary<string, Object>();
public void OnBeforeSerialize()
{
listData.Clear();
foreach (var kvp in _dict)
{
KeyValue kv = new KeyValue { name = kvp.Key, target = kvp.Value };
listData.Add(kv);
}
}
public void OnAfterDeserialize()
{
int no = 0;
_dict = new Dictionary<string, Object>();
foreach (KeyValue info in listData)
{
if (!_dict.ContainsKey(info.name))
{
_dict.Add(info.name, info.target);
}
else
{
no++;
_dict.Add(info.name+"("+no+")", null);
}
}
}
}
}
这样就可以存放不同的Object了。 这里注意在反序列话这里增加了一个no,这里是为了可以在面板里增加不报错,因为同名的key就报错了。

到这里本来就完了,但是发现我想把如图:  Text对象里的Text组件拖动到序列中怎么拖动呢,如果直接拉Text对象,那么拖动的时对象本身,并不是Text文本组件。
这里因为是Object类型,所以拉的时候要注意,这里有一个技巧: 可以点击SerializationData脚本的属性,然后会弹出一个单独的属性框, 
这样在Hierarchy里点击其他深度的对象组件就灵活多了。例如某个子集GameObject里的RectTransform或者Text、Image就容易多了。
或者你还可以开两个Inspector窗口,把其中一个锁定在有序列化脚本的,然后点击其他来拖放也可以达到目的。
参考:
http://docs.unity3d.com/cn/current/ScriptReference/ISerializationCallbackReceiver.html
|