意识到您无法在脚本对象中真正使用UnityEvents
(它们无法正确读取全局变量值)。我不得不转向另一个解决方案,以便存储我的Dialogs。
我能找到的最佳解决方案是将它们存储在相应的NPC预制件中。这真的很方便。然而,这在我的口中留下了不好的味道,将数据存储在这样的预制件中只是感觉不对。这是一种不好的做法吗?
例如,如果我要重构DialogObject
中的某些内容,那么一切都将丢失。
由于我似乎无法在任何地方成功存储UnityEvents(无法将它们序列化为Json,并且如上所述,Scriptable Objects似乎无法很好地处理它们)我觉得这是唯一的解决方案,如果我想能够使用编辑器创建对话框。
首先在这里查看,这是愚蠢的吗?还有另一种方式吗?
我正在尝试保存此List
:
[System.Serializable]
public class DialogObject {
public List<PageData> conversations = new List<PageData>();
public UnityEvent postEvent; //Invoked on last page of Dialog
}
答案 0 :(得分:2)
我会说是的,预制件是一个模板来创建一个类型的新项目。您正在尝试保存数据状态。
即使您无法序列化UnityEvent,也可以序列化其内容。
如果您通过检查员分配,则可以使用https://docs.unity3d.com/ScriptReference/Events.UnityEventBase.GetPersistentMethodName.html
但是如果从一开始就知道存储的话就不会有存储问题。
第二个解决方案是将方法分配给UnityEvent时,存储它。
void AddListener (UnityAction ev)
{
MethodInfo mi = ev.Method;
// Use mi
postEvent.AddListener(ev);
}
使用mi引用,您可以获得方法的名称,类型,它所属的对象以及您需要的任何内容。