3D RPG Course (七)实现敌人发现并追击玩家

本文介绍了如何在Unity3D中实现敌人检测玩家进入其可视范围的逻辑,通过OverlapSphere方法检测碰撞体,根据Tag判断是否为玩家。当检测到玩家时,切换敌人的状态至CHASE,设置其目标为玩家位置。同时,文章也涵盖了敌人追击和脱战的逻辑,包括设置动画层和状态转换,以及返回原点的行为。遇到返回原点后恢复朝向的问题,表示需要进一步解决。
摘要由CSDN通过智能技术生成

一、实现玩家进入敌人可视范围的检测

要实现该功能,我们可使用以下方法(也可以通过Distance判断距离)

 实现逻辑:设计一个方法,通过物理检测获取到球体范围内的碰撞体,如果其中有Tag为“Player"的物体,则返回true,并将当前状态设置为CHASE(追击)

先创建以下变量

private GameObject attackTarget;  //获取攻击目标
public float sightRadius;  //发现玩家可视距离

 方法设计如下

    /// <summary>
    /// 发现玩家检测
    /// </summary>
    /// <returns></returns>
    private bool FoundPlayer()
    {
        var CollidersInArea = Physics.OverlapSphere(transform.position,sightRadius);

        foreach(var collider in CollidersInArea)  //上面方法返回数组类型,所以使用foreach遍历
        {
            if(collider.CompareTag("Player"))
            {
                attackTarget = collider.gameObject;
                return true;
            }
        }
        
        //未检测到Player则返回false
        attackTarget = null;
        return false;
    }

在状态切换的SwitchState()方法中调用该检测即可

if (FoundPlayer())
 {
     enemyState = EnemyState.CHASE;
 }

注意:上述创建的sightRadius变量需要在Inspector窗口设置大小。记得要为Player添加Tag和collider,否则检测不了Tag

二、实现追击玩家与脱战的逻辑

首先,我们在Enemy的动画中添加一个攻击层(Attack Layer),将其权重设置为1(以便随时从其他状态层进入),并设置一个基本状态Basic State,当满足一定条件时将进入该动画层。然后在动画Transition中设置好转换条件即可

 

 当FoundPlayer()方法检测到玩家后,Enemy会进入CHASE状态,此时将Enemy的destination设置为玩家的坐标即可;当FoundPlayer()方法找不到玩家时,Enemy脱战并返回原点

注:为了能使Enemy能回到原点,我们需要在程序开始时获得原来的坐标OriginalPosition

private void ChaseMethod()
    {
        isWalk = false;
        isChase = true;

        if(attackTarget != null)  //防止空引用报错
        {
            isFollow = true;
            agent.SetDestination(attackTarget.transform.position);  //追击玩家
        }

        if (!FoundPlayer())  //找不到玩家,返回原点
        {
            isFollow = false;
            agent.SetDestination(transform.position);  //拉脱后立即停下          
            agent.SetDestination(OriginalPosition);
            //TODO:返回原点后转回原方向
     }

注:此处返回原点后,应该恢复原来的朝向,但目前没有想到解决方案,待日后解决

最后,在CHASE状态中调用该方法即可

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值