设置巡逻路径的方法

一、巡逻地图
1、添加背景房间,命名。如:Level
2、生成地图

(1) Window-AI-Navigation(Obsolete)——(已淘汰。新的后面学会了再说)

 

(2) 选中Hierarchy面板上的Level,在它的Inspector面板右侧,勾选Static后,选择yes

物体被标记为Navigation Static后,Unity会在Bake过程中将这些物体的几何信息纳入导航网格中,从而使得游戏中的角色或其他可移动对象能够知道哪些区域是可行走的,哪些是不可行走的

(3) 点击右下角的Bake按钮,生成地图

(4) 可以根据需要,取消勾选Level的子物体(如天花板、地板下面一层的Plane等)上的Static,从而精准控制需要巡逻的位置。进行取消勾选的设置后需要重新生成地图(Bake)

二、巡逻对象
1、添加巡逻对象,命名。如Ghost
2、巡逻路径

(1) 思路:提供路径起点、途经占、终点、巡逻地图后,由Navigation系统自动计算巡逻路径。

(2) 方法:添加Navigation系统——给Ghost添加Nav Mesh Agent组件

Nav Mesh Agent组件:

① 作用:实现游戏角色的导航功能。使角色能够在场景中找到路径并朝目标移动

② 面板

 

Nav Mesh Agent组件中的Agent Type与Navigation中的Agent对应

Navigation中可以根据需要增加Agent类型

speed:巡逻速度改为1.5

Stopping Distance:一般不为0。可改为0.2

当靠近目标位置的距离达到此值时,代理将停止。

即:可以设置指定代理(Agent)在距离目标位置多远的地方停止移动

3、巡逻路径起止点

(1) Create Empty,命名为WayPoints。Reset

(2) 以WayPoints为父物体,Create Empty,2个,分别命名为WayPoint0,WayPoint1

(3) 设置二者的 Postion

4、给Ghost添加WayPointsCtrller.cs组件
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;

public class WayPointsCtrller : MonoBehaviour
{
    private int pointIndex = 0;//路径点索引
    public Transform[] wayPoint;//路径点数组
    public NavMeshAgent enemyAgent;//动态敌人的导航代理组件

    void Start()
    {
        // 确保至少有两个路径点
        if (wayPoint.Length > 1)
        {
            // 将enemyAgent的目标位置设置为wayPoint数组中的第一个元素的位置
            //一旦执行了这句代码,enemyAgent将会开始尝试移动到这个新的目标位置
            enemyAgent.SetDestination(wayPoint[pointIndex].position);//SetDestination:设置代理(动态敌人)的目标位置
        }
        else
        {
            Debug.LogError("至少需要两个路径点!");
        }
    }

   void Update()
    {
        if (enemyAgent.remainingDistance < enemyAgent.stoppingDistance) //enemyAgent到达 wayPoint[0]的位置
        {
            //在0和1两个点之间巡逻
            pointIndex = (pointIndex+1)%wayPoint.Length;
            enemyAgent.SetDestination(wayPoint[pointIndex].position);//向wayPoint[1]位置移动
        }
    }
}

pointIndex = (pointIndex + 1) % wayPoint.Length;

目的

更新pointIndex,使其指向wayPoint数组中的下一个路径点,如果已是最后一个路径点,则循环回到第一个路径点

解释

  • pointIndex + 1:将当前的索引值加1。
  • % wayPoint.Length

       作用:确保pointIndex的值不会超出wayPoint数组的范围。实现循环遍历数组的效果。

       解释:当pointIndex到达即数组的最后一个元素的索引时,加1后再取模将pointIndex重置为0

       取模:

enemyAgent.SetDestination(wayPoint[pointIndex].position);

目的

调用NavMeshAgent组件的SetDestination方法,设置enemyAgent(一个敌人的导航代理)的新目标位置

解释

  • wayPoint[pointIndex].position

       通过pointIndex索引访问wayPoint数组中的当前路径点,并获取其位置(position

  • enemyAgent.SetDestination(...)

       将enemyAgent的目标位置设置为上一步获取到的路径点位置。

       之后,enemyAgent开始计算到达这个新目标位置的路径,并尝试沿着路径移动。

pointIndex = (pointIndex + 1) % wayPoint.Length;
enemyAgent.SetDestination(wayPoint[pointIndex].position);

效果:敌人沿着预定义路径点循环移动

逻辑

更新pointIndex以指向下一个路径点(或如果已经是最后一个则回到第一个),然后将enemyAgent的目标位置设置为这个新的路径点的位置

5、赋值

  • 24
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值