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
字段,在运行时从场景中引用。
但总的来说:如果您在运行时创建这些实例 - 为什么它们需要 ScriptableObject
s?您可以使用普通的 class
.
我在 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
字段,在运行时从场景中引用。
但总的来说:如果您在运行时创建这些实例 - 为什么它们需要 ScriptableObject
s?您可以使用普通的 class
.