Al导航、敌人巡逻以及追踪玩家的实现

调整敌人的大小以及血条的位置,设置好后将其Override

转到groundfloor,将下面的400子物体的Tag设置为floor

点击windows/AI/Navigation,选中这些物体,将它们Navigation.Static勾选后,再Bake好后,生成一个导航网格的地面,这样可以控制AI在上面移动。如下图所示:

在Enemy_01上添加Nav Mesh Agent组件(Nav Mesh Agent 组件可帮助您创建在朝目标移动时能够彼此避开的角色。代理 (Agent) 使用导航网格来推断游戏世界,并知道如何避开彼此以及其他移动障碍物。寻路和空间推断是使用导航网格代理的脚本 API 进行处理的。)

编写一个C#脚本,将其命名为Ryun_EnemyController,并将其赋给Enemy_01,具体代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;

public class Ryun_EnemyController : MonoBehaviour
{
   public NavMeshAgent enemyAgent;//编写一个NavMeshAgent 类型的enemyAgent对象
   public GameObject player;//声明一个Player对象

   public GameObject wayPointParent;//声明一个wayPointParent,这里场景中已经创建了一个wayPointParent以及它的子物体wayPoint,后面要将该物体拖给该公有变量
   public Transform[] wayPoints;//声明一个Transform[]的数组类型
   public int nextIndex = 0;//设置数组初始索引值为0
   public float mindistance = 10;//设置一个检测玩家的最小距离

   public Ryun_PlayerController PlayerController;//声明一个Ryun_PlayerController类型的变量
// Start is called before the first frame update
void Start()
{
   PlayerController = GameObject.FindObjectOfType<Ryun_PlayerController>();//让其获取其组件
   enemyAgent = this.GetComponent<NavMeshAgent>();//让其获取NavMeshAgent的组件
   player = GameObject.FindGameObjectWithTag("Player");//这里我们已经将玩家的Tag设为了“Player”
   enemyAgent.destination = player.transform.position;
   //设置enemyAgent.destination为玩家所在的position
  if (wayPointParent)//如果wayPointParent为true
  {

    wayPoints = wayPointParent.GetComponentsInChildren<Transform>();
   //让wayPoints获取wayPointParent下的含Transform组件的物体
 
    SetNextPoint();//调用SetNextPoint函数


   }
}

// Update is called once per frame
void Update()
{
   if (!enemyAgent.pathPending && enemyAgent.remainingDistance < 0.5f) {
      SetNextPoint();//调用寻迹函数进行巡逻


   }

   if (Vector3.Distance(enemyAgent.transform.position, PlayerController.transform.position) < mindistance)//用于检测玩家靠近后自动追踪
   {

      enemyAgent.destination = PlayerController.transform.position;
   }
   else {

      SetNextPoint();//否则就继续自动巡逻
   }
}

 private void SetNextPoint() //用于敌人巡逻的自动寻迹移动
 {

   if (wayPoints.Length <= 1) return;
   enemyAgent.destination = wayPoints[nextIndex].position;
   nextIndex=(nextIndex+1)%wayPoints.Length;//用于循环nextIndex变量


 }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嘿君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值