Unity手游:自动寻路Navmesh入门

本文介绍如何在Unity手游中使用内置的Navmesh寻路插件实现角色自动寻路功能,通过创建地形、添加障碍物、设置Navmesh等步骤,使角色能够自动绕过障碍物找到最短路径。同时,展示了如何通过代码实现点击目标自动寻路的交互功能,并提供了完整源码链接。

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

现在的大部分mmo游戏都有了自动寻路功能。点击场景上的一个位置,角色就会自动寻路过去。中间可能会有很多的障碍物,角色会自动绕过障碍物,最终达到终点。使用Unity来开发手游,自动寻路可以有很多种实现方式。第一种比较传统的是使用A星寻路,它是一种比较传统的人工智能算法,在游戏开发中比 较常用到。大部分的页游和端游都用到这种技术。在Unity游戏也可以用这种技术,Asset Store上面已经有相关的组件了,感兴趣的同学可以自己去了解。我在后面有机会再来详细介绍了。今天我们来学习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,实现点击目标,自动寻路功能
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
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,用于烘焙寻路网格。
  • 总结
这个实例可以很简单的让我们学会如何最基本的使用自动寻路组件Nav。但是,这个组件还提供了更加强大的功能,比如,起始点和目标点中间出现阻断了,
怎么办?在下面的文章中,我们将会继续探寻其他强大的功能。
  • 源码

http://pan.baidu.com/s/1hqC6v4o


原文链接:http://blog.csdn.net/janeky/article/details/17457533


其它链接: http://liweizhaolili.blog.163.com/blog/static/16230744201271210237616/

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值