Unity3d 统一脚本对象问题
我在Rooms中有一个列表,其中包含我在编辑器中创建并拖放到列表中的预制按钮。RoomSO也是预先制作的(在编辑器中制作),然后在运行时创建ButtonSO的实例,并尝试将其添加到RoomSO按钮中。我在编辑器中查看房间,发现“类型不匹配”。我不明白为什么 RoomSO脚本:Unity3d 统一脚本对象问题,unity3d,scriptable-object,Unity3d,Scriptable Object,我在Rooms中有一个列表,其中包含我在编辑器中创建并拖放到列表中的预制按钮。RoomSO也是预先制作的(在编辑器中制作),然后在运行时创建ButtonSO的实例,并尝试将其添加到RoomSO按钮中。我在编辑器中查看房间,发现“类型不匹配”。我不明白为什么 RoomSO脚本: [CreateAssetMenu(fileName = "New Room", menuName = "Rooms/Room")] public class RoomSO : S
[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实例不能添加到列表中以保存资产文件中的相同按钮。它可以添加到。。。我打赌它只是说检查员不匹配,对吗?在这种情况下,你根本不用担心。。。如前所述,这只是因为它不是一个实际的资产引用,而只是临时内存中的一个对象,但在运行时,这对您来说没有问题。但是,如果您打算在编辑器中使用此选项来自动生成某些资产,那么您应该确保将这些资产存储为资产并引用它们……感谢您的解释。我的代码不在实际项目中。但我在我的真实项目中使用了这种方法,并提出了一些我不了解的东西。我最初的想法是有一些系列化的问题(我还没有读过)。但我打破了真实项目的代码,看看测试代码会发生什么。然后我遇到了这个“问题”…我根本没想到会出现“类型不匹配”的错误。这实际上不是“类型错误”,因为类型实际上是正确的。我可以处理对象,只要它在内存中。