拆分变化或有规律部分为单独类且统一接口

架构能力要好,写出拓展性强的代码。一定要用好抽象细分逻辑,参数化,单一职责。
好的分层,好的归纳细节抽象为一个模块,利用好封装 继承 多态 接口 单一职责 中介者通信。
合理的扇入扇出数。

通信中的参数,可以设计为参数类。

通过发送消息的形式进行通信。
对于频繁的逻辑状态操作封装,对发送的消息,需要有一个状态类型,状态值,状态值参数列表;状态值参数指明的是状态值。
里面一系列的操作都要基于状态参数列表进行跳转和设置。
if args.stateID == gs_u1.UNITSS_CANT_BE_TARGET then
            local appear = true
            if args.op == CSConst.BUFF_OP_ADD then --指明添加gs_u1.UNITSS_CANT_BE_TARGET状态
                appear = false
            end


行为树隔一段时间更新;无论是服务器还是客户端都用了Object->组件架构由组件发送或接收消息Object管理,组件内发送消息或AddComponent表现逻辑;Object内部可以创建很多个技能实例,技能实例又有很多的表现事件Event,实例又引用了模板技能池方便重用。

战斗技能的释放过程:
function BGUMain 单位的出生死亡,攻击被击都是这个模块处理的。
msgID == CSConst.CSEID_ATTACK
U1G.SkillMgr:BeginSkillInst(args.skillID, args.skillInstIdx, args.casterID, args.targetID, U1Helper.ToVector3(args.targetPos))
每个技能模板都是一个工厂,产生技能时候会创建一个单独的技能实例。
skillInst = fac.CreateInst(skillID)
技能模板里面有N多的事件组合,包括动画和特效,曲线运动;攻击和被击特效都在里面做了, 技能模板的OnUpdate主要就是事件的Update。

BGUMain和BGUBuffDisplay都是BattleUnit的组件:
SkillMgr去管理每个技能模板实例,创建,OnUpdate,打断和删除; SkillMgr被BGUMain组件持有,通过BGUMain收到服务器的消息进行表现。
buffer是通过BGUBuffDisplay组件持有,通过BGUBuffDisplay收到服务器的消息进行表现。
法术场是通过BGSMain:CreateSpellField 游戏组件创建的, 也是个游戏实体看得到或看不到的召唤物,也是通过SkillMgr和BGUBuffDisplay组件来表现技能。
通过一堆的GameObject内部SendMessage和AddComponnet来做客户端的相应表现。

客户端的表现都是通过服务器的OnUpdate和AI触发的(AI根据OnUpdate 行为树,行为树是有条件的,例如到敌人的距离做出攻击判断,攻击时候AI根据单位的技能CD来选择技能ID)。
CSBUCSkillInstPool:BeginSkill
触发技能ID时候,也可以根据对方的类型来优先选择技能,例如CalcMappingSkill,再计算一次获取正确的技能ID; 也可以随机获得相应的技能ID。

-- 行为树有三个层次,一个是Action和Condition的节点行为函数和触发的条件绑定(条件运行通过了才会运行行为),
--二是节点的类型有选择顺序并行类型,
-- 三是行为树AI作为一个组件添加到服务器战斗单位中,隔一段时间0.5秒或1.3秒更新一次行为或者被击时候更新一次行为树。  行进或是攻击,或是奔跑,或撤退都是行为树规定的。

CSBUCSkillInstPool管理了很多技能实例,技能实例又使用了全局的CSSkillProc技能模板配置, CSBUCSkillInstPool是服务器的一个CSBattleUnit实例。
CSBUCAI组件会用self.parent:GetSkillInstPool():BeginSkill(v.skillID, target, targetPos) 释放技能, 封装了改功能的函数刚好是一个AI Action函数来调用ActFuns[1] = CastBestSkill



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值