在Unity中,使用基类创建项目系统:
[CreateAssetMenu]
class ItemBase : ScriptableObject(){
public string ItemName;
public Sprite ItemSprite;
void Spawn() {
//Spawn Item Using The Sprite
}
}
然后我使用CreateAssetMenu
在我的项目文件夹中右键单击要添加到游戏中的每个项目,然后在编辑器中分配它们的值。
[当我从编辑器中将对象拖到游戏对象上时,一切正常。
我遇到的问题是,我无法弄清楚如何在运行时从脚本中实例化这些实例。
[当我尝试像类一样引用它时,找不到该类,当我添加一个镜像所创建项目的脚本时,由编辑器设置的属性在实例化时为null。
理想情况下,id喜欢做什么:
右键单击并从编辑器中创建一个名为FishingRod的新ItemBase
在编辑器中分配名称和精灵
\\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
从您的用例描述来看,您似乎不需要在运行时创建ScriptableObject
的实例。您宁愿引用并使用您已经创建的内容。
所以您应该做的是
ItemBase
-> ItemBase)创建一个新的Create
实例现在要使用此资产的文件通过检查器中的字段对其进行引用:
// In the Inspector go to according GameObject
// and drag the ScriptableObject you created into this slot
[SerilaizeField] private ItemBase fishingRod;
然后您只需通过]使用此实例的值和方法
fishingRod.Spawn();
因此,如果您想在不同的项目之间切换,例如有一种控制器脚本,例如
[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();
}