学堂 学堂 学堂公众号手机端

Unity的自动寻路NavMessAgent系统(一)

lewis 4年前 (2021-10-16) 阅读数 5 #技术


欢迎加入Unity业内qq交流群:956187480




自动寻路已经很久没有用到了,自从学习unity的时候了解接触了一下NavMessAgent组件,至今再也没有研究过。没办法,经手的项目很少用到这个组件的。趁着最近手上闲下来了想重新稳固一遍,生怕将来用到的时候还得浪费时间

先从简单的了解NavMessAgent开始

一,建立NavMessAgent环境

新建plane,打开Window>Navigation,在Inspector面板右侧有一个navigation面板,不同的Unity版本这个界面可能不太一样。选中plane打开Navigation。在Navigation面板里面里面勾选Navigation Static选项,其他的默认不改动。然后点击左边Bake面板。这时候会有一个计算的过程,曾经用过烘焙或者遮挡剔除的朋友应该对这个过程很熟悉了。不过和之前两个功能一样,如果你没有保存场景level,unity会提示你先保存,然后再bake。由于现在场景里面的物体很少,所以Bake的过程很快就结束了。Navigation Area的选项可以自己自定义添加。

bake结束后scene界面就会发生变化,新建控制物体cube,并添加Navmessagent组件。新建脚本编写控制逻辑

#region 模块信息
// **********************************************************************
// Copyright (C) 2019 The company name
//
// 文件名(File Name): Tese01.cs
// 作者(Author): #AuthorName#
// 创建时间(CreateTime): #CreateTime#
// 团队成员(TeamMembers):
// 脚本描述(Module description):
// **********************************************************************
#endregion

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

public class Tese01 : MonoBehaviour {
Vector3 screenPosition;//将物体从世界坐标转换为屏幕坐标
Vector3 mousePositionOnScreen;//获取到点击屏幕的屏幕坐标
Vector3 mousePositionInWorld;//将点击屏幕的屏幕坐标转换为世界坐标

public GameObject target;
private NavMeshAgent nav;
// Use this for initialization
void Start () {
nav = gameObject.GetComponent<NavMeshAgent>();
}

// Update is called once per frame
void Update () {

nav.SetDestination(target.transform.position);
if (Input.GetMouseButtonDown(0))
{
MouseFollow();
}
}
void MouseFollow()
{
//获取鼠标在相机中(世界中)的位置,转换为屏幕坐标;
screenPosition = Camera.main.WorldToScreenPoint(transform.position);
//获取鼠标在场景中坐标
mousePositionOnScreen = Input.mousePosition;
//让场景中的Z=鼠标坐标的Z
mousePositionOnScreen.z = screenPosition.z;
//将相机中的坐标转化为世界坐标
mousePositionInWorld = Camera.main.ScreenToWorldPoint(mousePositionOnScreen);
//物体跟随鼠标移动
target.transform.position = mousePositionInWorld;
//物体跟随鼠标X轴移动
//transform.position = new Vector3(mousePositionInWorld.x, transform.position.y, transform.position.z);
}

}

运行工程点击鼠标演示结果

二.添加障碍物,绕过障碍物

新建适当大小的障碍物,打开障碍物的Navigation面板,勾选Navigation Static。选Notwalkable,然后再bake一下

演示结果


欢迎加入Unity业内qq交流群:956187480


版权声明

本文仅代表作者观点,不代表博信信息网立场。

热门