个人项目(3):敌人1

个人项目(3):敌人1

有了主体角色,要实现动作交互以及增加游戏趣味性,就务必要增加敌人。

敌人的行动逻辑

第一种类型敌人(即敌人1)当主角位于其发觉范围之外时并不会做任何行动,当主角位于其发觉范围之内时便会向主角移动,当主角进入其攻击范围时便会发动攻击,该行动逻辑的部分实现代码如下:

Vector3 x=follow.position;
       Vector3 y=this.GetComponent<Transform>().position;
       float distances=Vector3.Distance(x,y);
       if(distances<=maxdistance&&distances>mindistance){//当主体对象位于该对象发觉范围内时
           if(musicplaying==true){
           as1.Play();
           }//脚步声音效播放
           musicplaying=false;//音效已在播放
           isfighting=false;
           movement=this.GetComponent<Transform>().position-follow.position;
           movement.x*=-1;
           movement.z*=-1;
           movement.Normalize();
           Animator.SetBool("isrunning",true);
           Animator.SetBool("isattacking",false);
       }
       else if(distances<=mindistance){//当主体对象位于该对象攻击范围内时
           as1.Stop();
           musicplaying=true;//脚步声音效暂停
           isfighting=true;
           movement.Set(0.0f,0.0f,0.0f);
           Animator.SetBool("isrunning",false);
           Animator.SetBool("isattacking",true);
       }
        else if(distances>maxdistance){//当主体对象位于该对象发觉范围外时
           as1.Stop();
           musicplaying=true;
           movement.Set(0.0f,0.0f,0.0f);
           Animator.SetBool("isrunning",false);
           Animator.SetBool("isattacking",false);
       }

其中的运动与转向方法与主体角色类似,这里就不再赘述。而动画控制器的设计也与主体角色类似,主要是通过调整一些参数的布尔值来实现动画的播放与否。

image-20220824102327493

这里的walking动画并没有应用到,本来是想用于制作一个敌人的AI实现定向巡逻的效果,以后可以再加以完善。

攻击的触发器

本篇我想主要讲一下敌人1攻击时造成主角扣血的触发器逻辑,如图,除了碰撞体(小胶囊)外,我还为该敌人角色添加了一个触发器(大胶囊)。

image-20220824102837369

image-20220824102953500

其中的具体逻辑如下:

private void OnTriggerStay(Collider other){//判断玩家是否处在触发器范围中
        if(other.transform==follow&&isfighting==true){
            isplayerinrange=true;
        }
    }

    private void OnTriggerExit(Collider other){//判断玩家是否不在或离开触发器范围
        if(other.transform==follow){
            isplayerinrange=false;
        }
    }
if(isplayerinrange==true){//触发器触发,主体角色掉血
           if(player.invincibility==false){
               player.hp--;
               player.ishit=true;
           }
       }

当主体角色为于该攻击范围触发器中并且敌人角色正在攻击,则isplayerinrange布尔值为真,表示主体角色可被攻击,当主体角色不在无敌时间时,就会触发主体角色掉血的逻辑。其中player获取的是为主体角色添加的脚本组件。

当然也可以选择为角色手中的大剑模型添加触发器,具体的实现方法类似,当敌人攻击并打到主体角色是会执行主体角色掉血逻辑。(这里不采用这种方法是因为一开始使用的敌人1模型并没有武器,所以直接添加了一个胶囊体触发器,这里的敌人1模型是将原来敌人1模型的部分组件转移过来的,这也是可以完善的一点。当然后续主体角色的攻击逻辑则是使用了这种方法)。

猜你喜欢

转载自blog.csdn.net/m0_54119099/article/details/126503305
今日推荐