Unity 脚本化对象问题

Unity Scriptable Objects issue

我在 RoomSO 中有一个列表,其中包含我在编辑器中创建并拖放到列表中的预制 ButtonSO。 RoomSO 也是预制的(在编辑器中制作)然后在运行时我创建了一个 ButtonSO 实例并尝试将它添加到 RoomSO 按钮。我在编辑器中查看 RoomSO,我得到“类型不匹配”。我不明白为什么?

RoomSO 脚本:

 [CreateAssetMenu(fileName = "New Room", menuName = "Rooms/Room")]
 public class RoomSO : ScriptableObject
 {
     public List<ButtonSO> buttons;
 
     public void AddButton()
     {
         ButtonSO bt = (ButtonSO) ScriptableObject.CreateInstance<ButtonSO>() as ButtonSO;
         bt.buttonText = "Hello";
         buttons.Add(bt)
     }
 }

我的 ButtonSO 脚本:

 [CreateAssetMenu(fileName = "New Button", menuName = "Rooms/Button")]
 public class ButtonSO : ScriptableObject
 {
     public string buttonText;
 }

你的问题并不是真正的“问题”。

发生的情况是,通常 Unity 期望将 ScriptableObject asset 引用分配给 Inspector 中的字段。因为ScriptableObject的实际use-case是有一定的可兑换data/behaviour容器资产

您正在做的是在运行时创建实例。这些实例仅存储在临时内存中,因为您实际上从未将它们作为资产存储到项目中。

您会在检查器中看到类型不匹配,实际上这意味着存在有效引用 - 否则它会显示 None (ButtonSO)Missing (ButtonSO),它只会在播放模式结束后才会被保存。稍后 Missing (ButtonSO) 您将在结束播放模式后看到,因为 List<ButtonSO> 仍然存在,其中的项目 - 您在运行时创建的相应引用将被销毁。

只要播放模式为 运行,您的运行时代码仍应按预期工作。

顺便说一句,如果您分配例如ScriptableObject 中的 GameObject 字段,在运行时从场景中引用。


但总的来说:如果您在运行时创建这些实例 - 为什么它们需要 ScriptableObjects?您可以使用普通的 class.