Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unity3d 统一脚本对象问题_Unity3d_Scriptable Object - Fatal编程技术网

Unity3d 统一脚本对象问题

Unity3d 统一脚本对象问题,unity3d,scriptable-object,Unity3d,Scriptable Object,我在Rooms中有一个列表,其中包含我在编辑器中创建并拖放到列表中的预制按钮。RoomSO也是预先制作的(在编辑器中制作),然后在运行时创建ButtonSO的实例,并尝试将其添加到RoomSO按钮中。我在编辑器中查看房间,发现“类型不匹配”。我不明白为什么 RoomSO脚本: [CreateAssetMenu(fileName = "New Room", menuName = "Rooms/Room")] public class RoomSO : S

我在Rooms中有一个列表,其中包含我在编辑器中创建并拖放到列表中的预制按钮。RoomSO也是预先制作的(在编辑器中制作),然后在运行时创建ButtonSO的实例,并尝试将其添加到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)
     }
 }
 [CreateAssetMenu(fileName = "New Button", menuName = "Rooms/Button")]
 public class ButtonSO : ScriptableObject
 {
     public string buttonText;
 }
你的问题不是真正的“问题”

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

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

您将在检查器中看到类型不匹配,但是实际上这意味着有一个有效的引用-否则它会说
None(ButtonSO)
Missing(ButtonSO)
,只有在播放模式结束后才会保存。在结束播放模式后,您将看到后面的
丢失(按钮SO)
,因为
列表仍然存在,其中的项目-但是运行时创建的相应引用将被销毁

只要播放模式处于运行状态,运行时代码应仍能正常工作

顺便说一句,如果在运行时在
ScriptableObject
中指定一个
GameObject
字段,并从场景中引用,也会发生同样的情况



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

,这样roomso脚本就不会编译。所以这不是所有相关的代码。所以很难帮助添加在原始代码中丢失的ButtonSO bt=按钮。仍然使用
(ButtonSO)
,因为ButtonSO
看起来很多余。。。特别是因为
CreateInstance
已经返回类型
T
。。。我的猜测是,它表示类型不匹配,因为这是一个运行时创建的
ScriptableObject
实例,除非您实际将其保存为资产,否则该实例仅临时存在于内存中。。我真的不理解你的用例,但是如果你从来没有把它保存为资产。。。为什么它需要是一个
ScriptableObject
而不是一个普通的类?@derHugo是的,它是冗余代码……但它是测试代码的一部分,我试图让它工作……这就是redunant代码的解释。我试图理解为什么这不起作用。我不明白为什么内存中的SO实例不能添加到列表中以保存资产文件中的相同按钮。它可以添加到。。。我打赌它只是说检查员不匹配,对吗?在这种情况下,你根本不用担心。。。如前所述,这只是因为它不是一个实际的资产引用,而只是临时内存中的一个对象,但在运行时,这对您来说没有问题。但是,如果您打算在编辑器中使用此选项来自动生成某些资产,那么您应该确保将这些资产存储为资产并引用它们……感谢您的解释。我的代码不在实际项目中。但我在我的真实项目中使用了这种方法,并提出了一些我不了解的东西。我最初的想法是有一些系列化的问题(我还没有读过)。但我打破了真实项目的代码,看看测试代码会发生什么。然后我遇到了这个“问题”…我根本没想到会出现“类型不匹配”的错误。这实际上不是“类型错误”,因为类型实际上是正确的。我可以处理对象,只要它在内存中。