在预制件中存储数据的选项
Options to storing data in a prefab
意识到您不能真正在脚本对象中使用 UnityEvents
(它们不能正确读取全局变量值)。我不得不转向另一种解决方案来存储我的对话框。
我能找到的最佳解决方案是将它们存储在相应的 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
}
我会说是的,预制件是用来创建某种类型的新项目的模板。您正在尝试保存数据状态。
即使您无法序列化 UnityEvent,您也可以序列化其内容。
如果你通过inspector赋值,你可以使用https://docs.unity3d.com/ScriptReference/Events.UnityEventBase.GetPersistentMethodName.html
但是如果您从一开始就知道它的去向,那么您就不会有存储问题。
第二种解决方案是将方法分配给 UnityEvent,然后存储它。
void AddListener (UnityAction ev)
{
MethodInfo mi = ev.Method;
// Use mi
postEvent.AddListener(ev);
}
有了 mi 引用,你就有了方法的名称、它的类型、它所属的对象以及你需要的任何东西。
意识到您不能真正在脚本对象中使用 UnityEvents
(它们不能正确读取全局变量值)。我不得不转向另一种解决方案来存储我的对话框。
我能找到的最佳解决方案是将它们存储在相应的 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
}
我会说是的,预制件是用来创建某种类型的新项目的模板。您正在尝试保存数据状态。
即使您无法序列化 UnityEvent,您也可以序列化其内容。
如果你通过inspector赋值,你可以使用https://docs.unity3d.com/ScriptReference/Events.UnityEventBase.GetPersistentMethodName.html
但是如果您从一开始就知道它的去向,那么您就不会有存储问题。
第二种解决方案是将方法分配给 UnityEvent,然后存储它。
void AddListener (UnityAction ev)
{
MethodInfo mi = ev.Method;
// Use mi
postEvent.AddListener(ev);
}
有了 mi 引用,你就有了方法的名称、它的类型、它所属的对象以及你需要的任何东西。