使用编辑器设置值实例化ScriptableObject

问题描述 投票:0回答:1

在Unity中,使用基类创建项目系统:

[CreateAssetMenu]
class ItemBase : ScriptableObject(){
    public string ItemName;
    public Sprite ItemSprite;

    void Spawn() {
        //Spawn Item Using The Sprite
    }
}

然后我使用CreateAssetMenu在我的项目文件夹中右键单击要添加到游戏中的每个项目,然后在编辑器中分配它们的值。

[当我从编辑器中将对象拖到游戏对象上时,一切正常。

我遇到的问题是,我无法弄清楚如何在运行时从脚本中实例化这些实例。

[当我尝试像类一样引用它时,找不到该类,当我添加一个镜像所创建项目的脚本时,由编辑器设置的属性在实例化时为null。

理想情况下,id喜欢做什么:

  1. 右键单击并从编辑器中创建一个名为FishingRod的新ItemBase

  2. 在编辑器中分配名称和精灵

  3. \\Instantiate From Script FishingRod rod = ScriptableObject.CreateInstance(typeof(FishingRod)); // Properties should be the properties set by editor FishingRod.Spawn(); // Inserts Item Into Game

但是当我实例化该类时,它的属性为null;

 rod.ItemSprite //is null
 rod.ItemName //is null
unity3d
1个回答
0
投票

从您的用例描述来看,您似乎不需要在运行时创建ScriptableObject的实例。您宁愿引用并使用您已经创建的内容。

所以您应该做的是

  1. ((您已经做过)通过检查员的资产创建菜单(ItemBase-> ItemBase)创建一个新的Create实例
  2. ((您已经做过)用您的数据(名称和子画面)填充此“容器”
  3. 现在要使用此资产的文件通过检查器中的字段对其进行引用:

    // In the Inspector go to according GameObject
    // and drag the ScriptableObject you created into this slot
    [SerilaizeField] private ItemBase fishingRod;
    
  4. 然后您只需通过]使用此实例的值和方法

    fishingRod.Spawn();
    

  5. 因此,如果您想在不同的项目之间切换,例如有一种控制器脚本,例如

[SerilaizeField] private ItemBase fishingRod;
[SerilaizeField] private ItemBase hammer;
[SerilaizeField] private ItemBase umbrella;

然后您可以在它们之间进行切换,例如

private ItemBase _activeItem;

public void SelectFishingRod()
{
    _activeItem = fishingRod;
}

public void SelectHammer()
{
    _activeItem = hammer;
}

public void SelectUmbrella()
{
    _activeItem = umbrella;
}

然后例如做

public void UseActiveTool()
{
    _activeItem.Spawn();
}
    
© www.soinside.com 2019 - 2024. All rights reserved.