- 最后登录
- 2019-12-25
- 注册时间
- 2012-8-24
- 阅读权限
- 90
- 积分
- 71088
 
- 纳金币
- 52344
- 精华
- 343
|
打击感两大神器,震屏和顿帧,最近做的游戏总感觉像是打棉花,到网上查了下打击感实现方法,就自己弄了一下顿帧,顾名思义,就是当你打到敌人的时候动画会稍微暂停一会,如果你用多边形碰撞检测的方式来进行伤害判定,打击多个敌人时就会有横扫千军的快感
但是如果是手游,一般就aabb或射线检测了,但即使如此,也会带来强大的打击感
我以手游,animation为例说下自己的思路
首先,每个人物都要实现一个检测自己是否受到伤害的函数,public virtual void DamageCheck(object sender,DamageCheckEventArgs e)
这里sender指的是谁调用了这个函数,DamageCheckEventArgs派生自EventArgs,存放一些信息,如攻击方的攻击范围,朝向等
用这种方式几乎涵盖了我们需要的所有信息,而且十分灵活,如果我们需要多获取某个信息,直接修改EventArgs即可,比把每个信息单独作为参数传递要方便许多
public class DamageCheckEventArgs : EventArgs {
public enum DamageType
{
Instant = 0,
Delay = 1,
}
public DamageType damageType;
public EquipmentStatus senderEquip;
public Vector3 senderPos;
public int senderDirect;
public int senderCamp;
}
和设置顿帧时间的函数,由于animation没办法获取播放动画的string,所以我就把这个string存在了playingAnimString这个变量里,
当需要顿帧时,设置下播放速度,然后在update里不断-time,到0后速度复原
public void StandStill(float time)
{
UpperAnim [playingAnimString].speed = 0f;
standAnimString = playingAnimString;
standstillTime = time;
Debug.Log (playingAnimString);
}
如果项目比较大的话,我建议把这个函数单独写成一个类,
定义一个EventManager单例类,用来管理各种事件,向下面这样,至于怎么弄单例我就不写了,网上很多资料
public class EventManager:UnitySingleton<EventManager>{
public delegate void EventHandler(object sender,DamageCheckEventArgs e);
public event EventHandler DamageCheckEvent;
public void DamageCheck(object sender,DamageCheckEventArgs e) { DamageCheckEvent(sender,e); }
}
在游戏运行初,把各个人物的DamageCheck注册到这个单例的DamageCheckEvent事件上
然后,我们就可以在攻击动画适当的时候调用EventManager.Instance. DamageCheck
这里的sender我给他赋的是This,即这个脚本本身,这样当伤害检测为真时,直接调用((CharacterBase) sender).StandStill(0.2f)即可
|
|