Unity中实现简单的弹反小游戏

发布时间 2023-12-10 22:00:20作者: IDEA_W

最近开发了一个小游戏,在其中实现了简单的弹反效果。

在敌人的剑上绑定一个box collider,同时勾选 is Trigger :

image

保证玩家有一个胶囊碰撞体。

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、动画控制器

我设计的主角的动画控制器如下:

image

敌人的动画控制器如下:

image

4、实现效果

image