Unity中实现简单的弹反小游戏
最近开发了一个小游戏,在其中实现了简单的弹反效果。
在敌人的剑上绑定一个box collider,同时勾选 is Trigger :
保证玩家有一个胶囊碰撞体。
1、敌人代码
随后我在控制敌人的代码(enemy.cs)中加入下面的函数控制弹反:
//进入剑触发器
void OnTriggerEnter(Collider collider)
{
if(collider.tag == "character" && isAttack == true)
{
//Character是玩家类,character是玩家对象,这里调用玩家类中的enemyAttack函数
if(character.GetComponent<Character>().enemyAttack())
{
//弹反
//下面代码仅测试用
animator.SetTrigger("AttackFalse");
}
}
}
OnTriggerEnter 在两个 Trigger 碰撞时会被调用。
首先判断碰撞到的 tag 是否是玩家角色,当前敌人是否是正在攻击的状态。
如果敌人当前正在攻击,isAttack变量会为true。
如果满足上面两个条件,说明当前敌人处于攻击状态,且敌人的剑已经碰到了玩家。
这时调用玩家类中的函数enemyAttack()。这个函数会返回bool,返回true表示弹反成功,false表示弹反失败。
如果弹反成功,就播放敌人被弹反的动画。
2、玩家代码
在玩家上挂载的代码中编辑函数enemyAttack():
//返回true表示弹反成功,返回false表示弹反失败,该扣血了
public bool enemyAttack()
{
if(defendTime < 0.3f && isDefend == true)
{
//按下时间合适
audioSource.clip = defendAudio;
audioSource.Play();
return true;
}
//按下时间不合适,受伤
animator.SetBool("Damage", true);
blood -= 0.03f;
slider.value = blood;
return false;
}
这个函数返回是否弹反成功。
弹反成功需要有下面的条件:
- 当前玩家正在按下防御按键
- 按下防御按键的时间小于一定长度
如果按下时间合适,就弹反成功,播放音频;如果按下时间不合适,则播放受伤动画,扣血、更改界面的UI。
函数Defend会被每帧调用,记录当前是否处于防御状态,以及按下防御按键的时长:
//每帧调用
private void Defend()
{
//按下右键,且当前没有处于受伤状态,可以防御
if (Input.GetMouseButton(1) && !animator.GetBool("Damage"))
{
//按下右键
isDefend = true;
defendTime += Time.deltaTime;
animator.SetTrigger("Defend");
}
else
{
isDefend = false;
defendTime = 0;
animator.SetTrigger("DefendEnd");
}
}
3、动画控制器
我设计的主角的动画控制器如下:
敌人的动画控制器如下: