Unity3d 在预置中存储数据的选项

Unity3d 在预置中存储数据的选项,unity3d,unity5,Unity3d,Unity5,在意识到不能在可脚本化对象中真正使用UnityEvents之后(它们不能正确读取全局变量值)。我不得不转移到另一个解决方案来存储对话框 我能找到的最好的解决办法就是把它们储存在相应的NPC预制件中。这真的很方便。然而,这在我口中留下了一个不好的味道,它只是感觉像这样的预制存储数据是错误的。这是个坏习惯吗? 例如,如果我在对话框对象中重构一些东西,那么所有东西都会丢失 由于我似乎无法成功地将UnityEvents存储到任何地方(无法将它们序列化为Json,并且前面提到的可脚本化对象似乎无法很好地处

在意识到不能在可脚本化对象中真正使用
UnityEvents
之后(它们不能正确读取全局变量值)。我不得不转移到另一个解决方案来存储对话框

我能找到的最好的解决办法就是把它们储存在相应的NPC预制件中。这真的很方便。然而,这在我口中留下了一个不好的味道,它只是感觉像这样的预制存储数据是错误的。这是个坏习惯吗? 例如,如果我在
对话框对象
中重构一些东西,那么所有东西都会丢失

由于我似乎无法成功地将UnityEvents存储到任何地方(无法将它们序列化为Json,并且前面提到的可脚本化对象似乎无法很好地处理它们),如果我想使用编辑器创建对话框,我觉得这是唯一的解决方案

先检查一下,这很愚蠢吗?还有别的办法吗

我正试图保存以下内容的
列表

[System.Serializable]
public class DialogObject {
    public List<PageData> conversations = new List<PageData>();
    public UnityEvent postEvent; //Invoked on last page of Dialog
}
[System.Serializable]
公共类对话框对象{
公共列表对话=新列表();
public UnityEvent postEvent;//在对话框的最后一页调用
}

我想说是的,预置是用来创建新类型项目的模板。您正在尝试保存数据状态

即使无法序列化UnityEvent,也可以序列化其内容

如果您通过inspector分配,则可以使用

但是,如果您从一开始就知道存储的位置,那么就不会有存储问题

第二种解决方案是,将方法分配给UnityEvent时,将其存储

void AddListener (UnityAction ev)
{
     MethodInfo mi = ev.Method;
     // Use mi
     postEvent.AddListener(ev);
}

有了mi引用,您就有了方法的名称、类型、它所属的对象以及您需要的任何东西。

我想说是的,预置是用来创建新类型项的模板。您正在尝试保存数据状态

即使无法序列化UnityEvent,也可以序列化其内容

如果您通过inspector分配,则可以使用

但是,如果您从一开始就知道存储的位置,那么就不会有存储问题

第二种解决方案是,将方法分配给UnityEvent时,将其存储

void AddListener (UnityAction ev)
{
     MethodInfo mi = ev.Method;
     // Use mi
     postEvent.AddListener(ev);
}

通过mi引用,您可以获得方法的名称、类型、所属对象以及所需的任何信息。

谢谢,我将尝试PersistentMethodName,因为关键是要在inspector中完成。你能解释一下为什么它在可编写脚本的对象中不起作用吗?将实际UnityEvent添加到可编写脚本的对象效果很好,您可以在inspector中根据需要对其进行编辑。但是您尝试访问的所有全局值(例如
public int id=12
)都返回默认值。它是返回默认值还是返回检查器中的值?是否希望获得脚本中给定的值?请尝试单击“重置”,以便检查器返回脚本值。谢谢,我将尝试PersistentMethodName,因为关键是要在检查器中执行此操作。你能解释一下为什么它在可编写脚本的对象中不起作用吗?将实际UnityEvent添加到可编写脚本的对象效果很好,您可以在inspector中根据需要对其进行编辑。但是您尝试访问的所有全局值(例如
public int id=12
)都返回默认值。它是返回默认值还是返回检查器中的值?是否希望获得脚本中给定的值?尝试单击“重置”,以便检查器返回脚本值。