意见箱
恒创运营部门将仔细参阅您的意见和建议,必要时将通过预留邮箱与您保持联络。感谢您的支持!
意见/建议
提交建议

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

来源:恒创科技 编辑:恒创科技编辑部
2022-10-01 19:03:04


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



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


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

先从简单的了解NavMessAgent开始

一,建立NavMessAgent环境

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

Unity的自动寻路NavMessAgent系统(一)_屏幕坐标

Unity的自动寻路NavMessAgent系统(一)_世界坐标_02

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

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

#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);
}

}

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

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

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

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

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

Unity的自动寻路NavMessAgent系统(一)_屏幕坐标_06

演示结果

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


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


上一篇: 租用美国服务器:潜在的风险与应对策略。 下一篇: MongoDB 5.0 扩展开源文档数据库操作