BUFF系统

BUFF系统即为人物状态系统。根据不同的类型对人物进行一些属性值上的变更或者对其他系统的影响。

 

BUFF 系统设计为有时间限制的系统。比如道士的毒对实体的作用是有次数以及时间长度的。过了时间就失去效果。

 

BUFF 系统在实体LogicRun 内进行每一秒的检测。即buff 的最小单位时间为1。比如当策划想要一个500毫秒减少血量的buff 这个就无法实现。因为至少单位时间就是一秒。

 

Buff 系统类型参考buff类型作用.txt

         //¨´YbuffÁ¨¦°?¡ãbuff¤¨¤¨ª?¨?°??buff      

         inlineCDynamicBuff* GetBuff(constGAMEATTRTYPE buffType, constINT_PTR nGroup)

 

                                                梁凡2015-11-2

下线存储人物身上的buff.用人物德静态变量存储: CBuffSystem::SaveToScriptData()

人物上线加载静态变量中的buff: voidCBuffSystem::LoadFromScriptData()

检测人物身上buff是否过时,一秒一次: VOIDCBuffSystem::OnTimeCheck(TICKCOUNT nTickCount)

给人物加一个Buff的载入函数: constCDynamicBuffCBuffSystem::Append(INT_PTR buffType, constINT_PTR nGroup,

         GAMEATTRVALUE &value, INT_PTR dwTwice, INT_PTR btInterval ,LPCTSTR sBuffName,INT_PTR nAuxParam,bool timeOverlay,

         INT_PTR wActWait, EntityHandle giver,INT_PTR nEffectType,INT_PTR nEffectId,INT_PTR nColorPriority, INT_PTR nColor,bool bFullDel,byte nIcon)

Buff的属性计算: VOIDCBuffSystem::CalcAttributes(CAttrCalc &calc)(其属性不放在战力评分里面)

### 实现 Unity 中的 Buff 系统 在 Unity 中实现一个 Buff 系统,可以利用 C# 的反射机制(Reflection)、特性(Attribute)以及 ScriptableObject 来构建一个灵活、可扩展的系统。以下是一个基于引用内容和专业知识的详细实现方案。 #### 1. 设计原则与模式 在设计 Buff 系统时,遵循依赖倒置原则、合成复用原则和单一职责原则等软件设计原则[^1],同时结合单例模式和工厂模式来确保系统的模块化和可维护性。 #### 2. 数据结构设计 Buff 系统的核心数据结构包括以下字段: - `BuffTypeId`:Buff 类型 Id。 - `Caster`:Buff 施加者。 - `Parent`:Buff 当前挂载的目标。 - `Ability`:Buff 由哪个技能创建。 - `BuffLayer`:Buff 的层数。 - `BuffLevel`:Buff 的等级。 - `BuffDuration`:Buff 的持续时间。 - `BuffTag`:Buff 标签。 - `BuffImmuneTag`:免疫 Buff 标签。 - `Context`:Buff 创建时的相关上下文数据[^2]。 #### 3. 使用 ScriptableObject 存储 Buff 配置 ScriptableObject 是 Unity 提供的一种轻量级资源类型,适合存储配置数据。可以通过以下代码定义一个 Buff 数据类: ```csharp [CreateAssetMenu(menuName = "Buff/BuffData")] public class BuffData : ScriptableObject { public int BuffTypeId; public string BuffTag; public float Duration; public int Layers; public bool IsStackable; } ``` #### 4. Buff 系统的核心逻辑 Buff 系统的核心逻辑包括以下几个部分: - **Buff 初始化**:当被动技能初始化时,通过 `Ability::OnAbilityInit()` 接口为角色添加 Buff[^3]。 - **Buff 应用与移除**:通过事件监听机制触发 Buff 的效果。 - **Buff 持续时间管理**:使用协程或定时器管理 Buff 的持续时间。 以下是一个简单的 Buff 管理器实现: ```csharp public class BuffManager : MonoBehaviour { private Dictionary<int, Buff> activeBuffs = new Dictionary<int, Buff>(); public void AddBuff(BuffData buffData, GameObject caster, GameObject parent) { if (activeBuffs.ContainsKey(buffData.BuffTypeId)) { // 如果已经存在该 Buff,则根据规则叠加 activeBuffs[buffData.BuffTypeId].Stack(buffData); } else { // 否则创建一个新的 Buff 实例 var newBuff = Instantiate(new Buff(buffData, caster, parent)); activeBuffs.Add(buffData.BuffTypeId, newBuff); StartCoroutine(newBuff.Apply()); } } public void RemoveBuff(int buffTypeId) { if (activeBuffs.ContainsKey(buffTypeId)) { activeBuffs[buffTypeId].Remove(); activeBuffs.Remove(buffTypeId); } } private class Buff { public BuffData Data; public GameObject Caster; public GameObject Parent; public Buff(BuffData data, GameObject caster, GameObject parent) { Data = data; Caster = caster; Parent = parent; } public void Stack(BuffData newData) { if (newData.IsStackable) { Data.Layers += newData.Layers; } } public IEnumerator Apply() { // 应用 Buff 效果 Debug.Log($"Applying Buff {Data.BuffTypeId} to {Parent.name}"); yield return new WaitForSeconds(Data.Duration); // 移除 Buff Debug.Log($"Removing Buff {Data.BuffTypeId} from {Parent.name}"); } public void Remove() { // 移除 Buff 效果 Debug.Log($"Removed Buff {Data.BuffTypeId} from {Parent.name}"); } } } ``` #### 5. 配置文件加载 为了支持动态加载 Buff 配置,可以在游戏导演类中加载 XML 或 JSON 文件中的数据[^4]。例如: ```csharp public class GameDirector : MonoBehaviour { public string path; // 配置文件的位置 private void Awake() { LoadBuffConfigurations(path); } private void LoadBuffConfigurations(string filePath) { TextAsset textAsset = Resources.Load<TextAsset>(filePath); if (textAsset != null) { // 解析 XML 或 JSON 数据 List<BuffData> buffs = JsonUtility.FromJson<List<BuffData>>(textAsset.text); foreach (var buff in buffs) { // 加载 Buff 数据到系统中 Debug.Log($"Loaded Buff: {buff.BuffTypeId}"); } } } } ``` #### 6. 扩展与优化 - **反射与特性**:通过 Reflection 和 Attribute 动态加载 Buff 的行为逻辑[^1]。 - **性能优化**:使用池化技术减少频繁实例化和销毁对象带来的性能开销。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值