对于玩家可以收集的物品,我有一个 ScriptableObject。它可以是硬币、棍子、石头、椰子等等。这样的对象具有名称、精灵和类型:
public enum FancyItemType
{
Coin, Stick, Stone, Coconut
}
[CreateAssetMenu(fileName = "New Fancy Item", menuName = "New item", order = 51)]
public class FancyItem : ScriptableObject
{
public FancyItemType Type;
public Sprite Sprite;
public string Name;
}
我在单元中创建并配置了这些对象。我想通过枚举 Enum 来接收这样的 FancyItem。例如,我想给玩家 10 根棍子:
void ReceiveBonus (FancyItemType type, int amount) {
// Эта функция принимает ТИП предмета, который игроку надо выдать
// Функция должна каким-то образом узнать спрайт и название предмета по типу
}
...
ReceiveBonus(FancyItemType.Stick, 10); // Передаем тип предмета -- палка, 10 штук
如何从枚举中获取包含所有数据的 FancyItem:精灵和名称?
我有这个想法:创建一个类,我将在检查器中向其中抛出对 ScriptableObject 的引用,它将通过 Enum 发出必要的引用:
public class FancyItemHelper : MonoBehaviour {
[SerializeField] private FancyItem Coin, Stick, Stone, Coconut;
public FancyItem GetItem (FancyItemType type) {
switch (type) {
case FancyItemType.Coin:
return Coin;
case FancyItemType.Stick:
return Stick;
case FancyItemType.Stone:
return Stone;
case FancyItemType.Coconut:
return Coconut;
}
}
}
但是,这种方法对我来说太复杂了。我应该如何实现这个?
有两把椅子。
第一个是最简单的 - 与 switch 中的操作相同,仅使用字典:
第二个稍微难一些。重构代码并删除 enam。
闪烁界面:
在 SO 继任者中实现它:
然后只需通过装饰器扩展这些项目。例如,可以捡起和扔掉的物品。再次接口:
及其实施:
PickableItem 是穷人的装饰器,因为 MonoBehaviour 没有普通的构造函数,你必须这样做。_item 只是为了能够将这个可提升的物体推到舞台周围并在检查器中将其扔到所需的项目中。也是一个包含多个相同类型物品的箱子:容器:
盒子:
将引发一切的组件挂在播放器上:
玩家本人:
我的玩家自己也画了库存,所以他需要一个库存单元的预制件,这也是一个穷人的装饰器:
不需要任何单例/字典/返回 null 等。
我不知道为什么,但这 就是它的样子
有一个在舞台上创建对象的选项,可能使用单例从任何地方访问(由您自行决定),脚本将存储一个包含您需要的元素的列表,在检查器中填充和更改
也许这就是您需要的解决方案!