Unit身上挂载Skill组件,Buff组件
Unit调用skill释放技能,skill计算命中产生DamageInfo,再调用防御方Unit的扣血方法. 这样产生了循环依赖.
DuckT 抛个事件不就完事了,按et的写法,儿子是不应该调用爸爸的方法的
famoliabl 首先我知道你说这种方式编辑器肯定是不会报错的.
但是从逻辑上讲Attack是有目标的,这个目标就是"防御方",技能释放命中信息里面已经拥有防御方,并且防御方的逻辑也是写在防御方的逻辑代码里面. 如果这样再去抛事件,把自己抛给自己,然后自己再调用自己得方法.绕这一圈有啥好处?
Unit扣血方法为什么非得放到UnitSystem中,另外搞个Helper文件就行了
egametang 扣血(受击)方法,里面有"受击"Buff触发,"死亡前"Buff触发,"反击"Buff触发等逻辑,这些可以通过Unit自身的Buff组件直接调用.
另外我觉得如果加个Helper.cs,其实无非是骗过编辑器而已,好像没有实际效果,因为这些逻辑实实在在的必须有Unit才能运作. Helper里面的代码想运行也是必须先持有相关Unit.
不知道是不是我理解错了,还是思路错了
egametang 我又试着去理解一下您说的意思, 您的意思是Helper是处理"流程"的吗?这个Helper要维护此次攻击的"上下文"信息,然后攻击的每个阶段都去修改这份"上下文"信息?
比如:攻击发起时,产生一个"atkInfo",然后传入Helper.Atk(atkInfo)里面,Atk里面分别调用以下方法: 筛选敌人(ref atkInfo)->攻击方攻击时Buff触发(ref atkInfo)->防御方受击Buff触发(ref atkInfo)->防御方扣血(ref atkInfo)->防御方扣血Buff触发(ref atkInfo)->攻击方结束攻击Buff触发(ref atkInfo).类似这种Helper吗?
egametang 最后再问一个问题,Unit扣血方法为什么不放到UnitSystem中,而需要另外搞个Helper呢? 我不懂这样有什么好处?
有Unit有啥问题,你依赖Unit数据 又不是说要依赖UnitSystem。
检查的是方法调用的循环,你任何方法中有Unit都不会造成循环依赖
DuckT 这不就不用调到UnitSystem了吗,不会循环调用依赖了啊
DuckT 我认为Helper是重复业务逻辑的抽离,因为你业务目前只有一处地方扣血可能感知不明显,例如传送,击飞,移动,这三个逻辑都会调用(ChangeUnitPosition)这个函数,你可以简单的理解这个Helper就是一个复用的业务逻辑抽离
2z7i 其实不是,你想想,你首先是不是已经把游戏中"单位"抽象成了Unit,如果已经抽象成了Unit,那传送,击飞,移动,这三个都是针对Unit的,复用就直接添加一个MoveComponent组件,访问Unit再直接调用MoveComponent的方法即可. 这种逻辑是不会脱离对象存在的, 我理解中所有的游戏世界可交互物体全都是Unit, 所以MoveComponent组件已经可以做到赋予Unit一种"能力"且代码是高度可重用的.
Helper只是个名字,随便叫什么,unitsystem攻击->Buff->UnitSystem扣血,这就循环了。改成unitsystem攻击->Buff->DamageHelper扣血不就行了吗
DuckT 有时候一个业务逻辑是多Component共同完成的,例如,击飞效果是扣血+位移的话,你把这个击飞函数放在HealthComponent或者MoveComponent都不适合,我在项目中基本不使用静态拓展函数(除非这个函数100%只修改我这个Component里的数据),其他情况基本全是XXhelper,当然以上只是我个人的理解.每个人用法不同.
2z7i 你这种做法是对的,一个system只能修改这个component,其它都放到其它的类似helper这种静态类中
2z7i 你的意思是
class HealthComponent: UpdateHp();
class MoveComponent:UpdatePosition();
class XXHelper:击飞(Unit);
其中XXHelper是静态类,不是静态扩展类.然后"击飞(Unit)"里面去调用UpdateHp()和UpdatePosition()?
这样貌似是不错
DuckT 是的,我是这么用的,这样的好处就是调用方不用太关心这个unit是否包含了MoveComponent和HealthComponent这个组件,使用者只管调用Helper中的击飞函数,具体执行逻辑由Helper决定,例如(这个单位的MoveComponent的被移除了,那我就只扣血就行,HealthComponent被移除,那我就只击飞),否则按你之前的说法就会导致我得先拿到MoveComponent这个组件我才能调用他的击飞函数,那没有这个组件连扣血的业务都做不了了,所以我认为组件都是状态,由业务逻辑调用,System里的静态拓展方法也不过只是帮你省下写一个Helper类罢了,具体的业务逻辑一般还是抽成Helper会好一些。
2z7i 说的对,这样写代码确实写起来很爽, 我以后也这么搞.
貌似挺不错的,试试