zoukankan      html  css  js  c++  java
  • Unity自动寻路Navmesh之入门

    • 实例

    我们要实现一个功能:点击场景中的一个位置,角色可以自动寻路过去。角色会绕过各种复杂的障碍,找到一条理论上”最短路径“。

    • 步骤

    1.创建地形
    2.添加角色
    3.创建多个障碍物,尽量摆的复杂一点,来检查Navmesh的可用性和效率。
    4.选中地形,在Navigation窗口中,设置Navigation Static

    5.依次选中障碍物,在avigation窗口中,设置Navigation Static
    7.Navigation窗口中,选择Bake(烘焙)界面,点击Bake按钮,进程场景烘焙,就可以烘焙出寻路网格了
    8.为角色添加NavMeshAgent组件。Component->Navigation->Nav Mesh Agent
    9.为角色新增一个脚本PlayerController.cs,实现点击目标,自动寻路功能

        using UnityEngine;  
        using System.Collections;  
          
        //Author:ken@iamcoding.com  
        public class PlayerController : MonoBehaviour  
        {  
            private NavMeshAgent agent;  
          
          
            void Start()  
            {  
                //获取组件  
                agent = GetComponent<NavMeshAgent>();  
            }  
          
          
            void Update()  
            {  
                //鼠标左键点击  
                if (Input.GetMouseButtonDown(0))  
                {  
                    //摄像机到点击位置的的射线  
                    Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);  
                    RaycastHit hit;  
                    if (Physics.Raycast(ray, out hit))  
                    {  
                        //判断点击的是否地形  
                        if (!hit.collider.name.Equals("Terrain"))  
                        {  
                            return;  
                        }  
                        //点击位置坐标  
                        Vector3 point = hit.point;  
                        //转向  
                        transform.LookAt(new Vector3(point.x, transform.position.y, point.z));  
                        //设置寻路的目标点  
                        agent.SetDestination(point);  
                    }  
                }  
          
          
                //播放动画,判断是否到达了目的地,播放空闲或者跑步动画  
                if (agent.remainingDistance == 0)  
                {  
                    animation.Play("idle");  
                }  
                else  
                {  
                    animation.Play("run");  
                }  
                  
            }  
        }  

    完成了,可以看看效果:

    • 相关知识

    1.角色身上的Nav Mesh Agent 组件

    Radius 半径: 代理的半径(仅用于寻路目的,可以跟实际对象的半径大小不一样,一般比实际对象的半径大)。
    Speed 速度: 代理可以周游世界,走向它的目的地的最大移动速度。
    Acceleration 加速度: 最大加速度。
    Angular Speed 角速度: 最高转速(度/秒)。
    Stopping distance 制动距离:制动距离。到目的地的距离小于这个值,代理减速。
    Auto Traverse OffMesh Link 自动遍历OffMesh链接:自动移动并关闭OffMeshLinks
    Auto Repath 自动重新寻路:如果现有的部分已失效,获得新的路径。
    Height 高度:代理的高度(用于调试图形)。
    Base offset 基本偏移:碰撞几何体相对于实际几何体垂直的偏移。
    Obstacle Avoidance Type 障碍躲避类型 :躲避的质量水平。
    NavMesh Walkable 导航网格行走:指定代理可以遍历的导航网格层类型

    2.障碍物一定要有Mesh Render,用于烘焙寻路网格。

  • 相关阅读:
    bzoj2143 飞飞侠
    Codeforces 543.B Destroying Roads
    Codeforces 666.B World Tour
    bzoj2441 [中山市选2011]小W的问题(debug中)
    bzoj2329 [HNOI2011]括号修复
    一些新发现的好东西
    < meta http-equiv = "X-UA-Compatible" content = "IE=edge,chrome=1" />的作用
    js经典代码技巧学习之一:使用三元运算符处理javascript兼容
    《javascript高级程序设计》笔记4.1.4:检测类型
    页面关闭和刷新事件
  • 原文地址:https://www.cnblogs.com/jiangshuai52511/p/5775600.html
Copyright © 2011-2022 走看看