物品特性
除物品本身的性质外,物体的组成材料也会赋予物体一定的特性 甚至后续的一系列机制甚至能为给物体添加新的特性(如祷文) 所以我们需要一个强有力的系统去维护“性质” Unity本身的脚本组件系统就是一个很好的引子
Feature 的使用方式
对于物品,其统一需要挂载一个 Items.cs 脚本
我们新建一个名为 Feature 的 MonoBehaviour 继承类,其本身可以像正常脚本一样直接添加到物体上
所有具体的物品特性,都应当继承自 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 自己负责“该做什么”