个人项目(3):敌人1

本文介绍了在Unity游戏中如何创建敌人的行动逻辑,包括敌人在主角进入不同范围时的行为,如移动和攻击。同时详细讲解了攻击触发器的设置,通过Collider和OnTriggerStay/OnTriggerExit方法判断玩家是否在攻击范围内,从而实现主角扣血的逻辑。此外,还探讨了如何优化敌人的AI行为,例如未来可能的定向巡逻功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

个人项目(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模型的部分组件转移过来的,这也是可以完善的一点。当然后续主体角色的攻击逻辑则是使用了这种方法)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值