0

我在 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;
 }
4

1 回答 1

1

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

发生的情况是,通常 Unity 期望分配给 Inspector 中的字段的ScriptableObject 资产引用。因为实际用例ScriptableObject是拥有某些可交换的数据/行为容器资产。

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

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

只要 Play 模式正在运行,您的运行时代码应该仍能按预期工作。

顺便说一句,如果您在运行时使用来自场景的引用来分配例如 a 中的GameObject字段,也会发生同样的情况。ScriptableObject


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

于 2020-09-16T11:25:09.283 回答