在预制件

时间:2017-09-10 18:32:22

标签: unity3d unity5

意识到您无法在脚本对象中真正使用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
}

1 个答案:

答案 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引用,您可以获得方法的名称,类型,它所属的对象以及您需要的任何内容。