所以,顺着我上面说的正确做法,你应该能打该看出问题了:
Unity的很多插件碰撞判定是有问题的,尤其当你用他的碰撞做过快速子弹的Top Down Shooter游戏,会发现子弹会穿过人之后。Unity的很多处理都是特殊处理,也就是根据“大多情况”来写死的,比如这个cube落地之前很难命中等,都是人家辛苦写出来的代码,你还嫌不好?不好就别用(内行都不会用这个)。在空中的处理都是“加一点力”,不过看问题,题主理解的“加一点力”和我上面说的“加一点力”只是恰好相似了,happy accident。既然做游戏,逻辑层就没有物理,没有状态机,当然除非你想做搞笑游戏。状态机仅仅是在写UI的时候有可能会用到的东西,游戏逻辑里根本不该存在状态机这样的东西,尤其是动作游戏。比如你说浮空是个状态吧,那浮空的时候“爆气回复平衡”又是个什么状态呢?爆气回复平衡以后又被升龙打中继续浮空了又是什么状态呢?或者像侍魂3之后很多格斗游戏可以空中防御,爆气了空中防御又是什么状态呢?哇,状态机哎,状态机可是有限状态机,怎么能动不动就扩展呢?是吧,没听过无限状态机把?也只有外行做游戏会想着用有限状态机来解决无限多的情况。话说回来,“浮空”和“跳跃”在受到“下一次挑空攻击”的时候有什么区别呢?
public attacker:CharacterComponent; //攻击者角色的标记(含属性)
public defender:CharacterComponent; //挨打角色
public attackFrameInfo:FrameInfo; //攻击者在命中时的“动作当前帧”,汉语叫“状态”,计算机程序不叫“状态”
public defenderFrameInfo:FrameInfo; //挨打的“当前动作帧”
}
复制代码
CharacterComponent的作用是为了证明entity是一个“角色对象”数据,同时也会记录一些基础的属性,但是其中不包含“当前动作”相关的信息。在创建角色entity的时候应该被加上。
VelocityComponent是“移动力”数据,当然这个移动力不是SLG里面的角色移动力,而是汉语语义下的,移动所需要的力。在创建角色entity的时候应该被加上,因为这是个动作游戏,如果是个回合制游戏,可以不直接加上,这是因为业务带来的特殊操作。
GravyComponent是“重力”数据,这个数据当且仅当需要的时候加上,比如策划设计了“在普通世界里跳起来的时候要加上”,这是最常见的设计。这里的“跳起来”是有二义性的,策划要说的是逻辑上的跳起来,但是很多外行程序员会理解为“看起来跳起来”,事实上角色在地面上三连击之类的动作,其中有些也会“看起来是跳起来了”,所以这是需要策划明确定义规则的,那么真的“跳起来”就“跳起来”了吗?这个逻辑Maze绕不过去的话,ECS是掌握不了的。
BeHurtComponent是受到打击的时候才添加的component,处理完之后就会丢掉。这个component的存在代表着角色正在挨揍。
Systems