Skip to content

物品特性

除物品本身的性质外,物体的组成材料也会赋予物体一定的特性 甚至后续的一系列机制甚至能为给物体添加新的特性(如祷文) 所以我们需要一个强有力的系统去维护“性质” Unity本身的脚本组件系统就是一个很好的引子

Feature 的使用方式

对于物品,其统一需要挂载一个 Items.cs 脚本

我们新建一个名为 FeatureMonoBehaviour 继承类,其本身可以像正常脚本一样直接添加到物体上
所有具体的物品特性,都应当继承自 Feature

与传统的“在 Items.cs 中遍历所有特性并调用接口”不同,当前结构采用的是“注册制”
也就是说,Items.cs 内部会维护若干个函数调用列表,而 Feature 则负责在启用时将自己需要执行的函数注册进去

目前,Items.cs 主要维护两个列表:

  • Start 队列:物品初始化时调用一次
  • Update 队列:物品每帧调用一次

注册方式

Feature 脚本中可以通过如下函数,将自己的逻辑注册到 Items.cs 中:

  • RegisterStartFeature(SomeMethod, rank)
  • RegisterUpdateFeature(SomeMethod, rank)

其中,rank 用于控制调用顺序,数值越小,越优先执行

例如:

using UnityEngine;

// Author: YourName
public class Flammability : Feature
{
    public int startRank = 0;
    public int updateRank = 10;
    public bool isBurning;

    public override void RegisterFeatureHooks()
    {
        RegisterStartFeature(OnItemStart, startRank);
        RegisterUpdateFeature(OnItemUpdate, updateRank);
    }

    public override void UnregisterFeatureHooks()
    {
        UnregisterStartFeature(OnItemStart);
        UnregisterUpdateFeature(OnItemUpdate);
    }

    public override void OnItemStart()
    {
        isBurning = false;
    }

    public override void OnItemUpdate()
    {
        if (isBurning)
        {
            Debug.Log(name + " is burning");
        }
    }
}

当该脚本与 Items.cs 挂载在同一个物体上时,Items.cs 会自动成为其宿主
随后在物体启动时调用 OnItemStart(),并在每帧调用 OnItemUpdate()

使用建议

请将每一种“性质”尽量拆分为独立的 Feature 脚本
例如:

  • 可燃性:Flammability
  • 导电性:Conductivity
  • 腐蚀性:Corrosiveness

这样做的好处是:

  • 各性质之间相互独立,方便多人协作
  • 便于后续通过材料、法术、祷文等方式动态添加性质
  • 避免将大量逻辑堆积在 Items.cs

注意事项

请勿随意更改 Items.cs 的整体调度结构,如需修改,请先沟通

当前设计中,不再为每一种性质单独提供统一事件接口
若某种性质需要持续判断或触发效果,请直接在其注册到 Update 队列中的函数内自行处理

也就是说,Items.cs 只负责“按顺序调用已注册函数”
而每个 Feature 自己负责“该做什么”