Unity脚本对象问题

问题描述

我在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 资产引用。因为ScriptableObject的实际用例是具有某些可交换的数据/行为容器资产。

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

您会在检查器中看到类型不匹配的内容,实际上是指存在有效的引用-否则它会说None (ButtonSO)Missing (ButtonSO),只有赢了播放模式结束后将无法保存。由于Missing (ButtonSO)仍然存在,因此您在结束播放模式后将看到后面的List<ButtonSO>,其中的项目-但是在运行时创建的相应引用将被销毁

只要运行“播放”模式,您的运行时代码仍应可以正常工作。

如果您分配例如GameObject中的一个ScriptableObject字段,并在运行时提供来自场景的引用。


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