Unity导航

  在如今当下的互联网时代背景下,Unity3D作为游戏开发的主要工具,为我们游戏开发提供了诸多便利.

  说到游戏我们不得不提到一个不可或缺的组成部分:导航系统;

NavMesh(导航网格)是3D游戏世界中用于实现动态物体自动寻路的一种技术,从而实现游戏自动寻路的功效.

那我们今天就来搭建一个简单的自动寻路的导航系统:

首先:我们要有一个可以供我们游戏物体移动的游戏场景,如:一个Plane或者一个Scene;

这里,作者使用了一个简单的塔防场景;

游戏场景设置好了,我们下一步做什么呢?

  找到检视窗口点击Navigation烘焙路径; 当然我们这里要将我们要烘焙的游戏物体呢,设置为Static;当然不需要有路径的地方就不需要设置Static了;

设置好了以后一定要记得点击下方的Bake烘焙;

第二步: 给我们的player设置一个StartPoint(起始点)和EndPoint(目标点);  

这里使用空物体来创建起始点和目标点,并为了方便查看给它们添加标记;

好了,起始点和目标点设置好了,那我们就要对player进行操作了;

因为我们这里要让player在行进的途中有行走操作,所以我们要用到动画; 动画还记得吗? idle,walk

第三步:拖一个player模型到参差视图中,添加Nav Mesh Agent组件,并为它设置Animator中的Controller(动画状态机);

双击打开进行编辑状态机; 将idle状态和walk状态拖到状态机里面,并设置idle为最初始状态 ,并设置状态参数,这里我们使用的是int;

然后将我们设置好的状态机设置给我们的Player;

第四步:添加让player移动和播放动画的脚本;然后将player拖成预设体,将原来层次视图中的player删除;

 1 using System.Collections;
 2 using System.Collections.Generic;
 3 using UnityEngine;
 4 using UnityEngine.AI;
 5
 6 public class PlayerMoveScript : MonoBehaviour {
 7
 8     private Animator playerAnimator;
 9     private NavMeshAgent agent;  // 用来接收获得的组件
10     private float time; // 计时
11     private int index;
12     private int move; // 用来转换哈希值
13
14 //    public Transform[] targetPoint;
15     public Transform endPoint;  // 设置目的地
16
17     void Start () {
18         // 获得自动寻路的组件
19         agent = GetComponent<NavMeshAgent> ();
20         // 获得动画的组件
21         playerAnimator = GetComponent<Animator> ();
22         //转换哈希值
23         move = Animator.StringToHash ("Move");
24
25     }
26
27     void Update () {
28
29         time+=Time.deltaTime;
30         // 一开始有1秒的idle时间
31         if (time >= 1.0f) {
32             // 如果开始生成的时候处于idle状态
33             if (playerAnimator.GetCurrentAnimatorStateInfo (0).shortNameHash == Animator.StringToHash ("idle")) {
34                 //设置状态参数,并开始移动的动画;
35                 playerAnimator.SetInteger (move,1);
36                 // 设置目标点
37                 agent.destination = endPoint.position;
38             }
39         }
40         //如果起始点和终止点的位置距离为0
41         if (agent.remainingDistance == 0) {
42             //并且现在的游戏物体处于walk状态
43             if (playerAnimator.GetCurrentAnimatorStateInfo (0).shortNameHash == Animator.StringToHash ("walk")) {
44                 //那么执行下一步动画操作,设置状态参数
45                 playerAnimator.SetInteger (move, 0);
46                 //删除游戏物体
47                 Destroy (gameObject);
48             }
49         }
50     }
51
52 }

这样player的一切组件和脚本准备就绪,那么下一步我们是不是就要生成player!(因为我们player是预设体);

第五步:生成player(在StartPiont位置生成);建立一个空物体来放置脚本

 1 using System.Collections;
 2 using System.Collections.Generic;
 3 using UnityEngine;
 4
 5 public class CreatPlayerScript : MonoBehaviour {
 6
 7     public GameObject PlayerPerfabs; // 预设体
 8     public Transform startPoint; // 开始生成预设体的位置
 9     public Transform endPoint; //目标位置
10
11     void Start () {
12
13     }
14
15     void Update () {
16         //按下鼠标左键做什么事情
17         if (Input.GetMouseButtonDown (0)) {
18             //在startPoint位置生成预设体,并让预设体不能旋转;
19             GameObject Player = Instantiate (PlayerPerfabs, startPoint.position, Quaternion.identity)as GameObject;
20             // 设置目标点
21             Player.GetComponent<PlayerMoveScript> ().endPoint = endPoint;
22         }
23
24     }
25 }

然后将我们外联进行设置;

我们可以创建一个Camera给我们的player,设置好位置,就可以去Game场景去查看我们的效果了.

好了,一个简单的导航就实现了,当然了小伙伴们可以去试试给游戏场景添加一个MiniMap(小地图);

注意:我们在做小地图的时候呢,为了不占用过多资源(就是优化嘛);可以将我们的小地图的Camera的渲染层数减少;进行一个优化

时间: 2024-08-28 12:52:53

Unity导航的相关文章

Unity导航网格参数

Navigation Object:物体参数面板 Navigation Static:勾选后表示该对象参与导航网格的烘培. OffMeshLink Generation:勾选后可跳跃(Jump)导航网格和下落(Drop). Bake:烘培参数面板 Radius:具有代表性的物体半径,半径越小生成的网格面积越大. Height:具有代表性的物体的高度. Max Slope:斜坡的坡度. Ste Height:台阶高度. Drop Height:允许最大的下落距离. Jump Distance:允许

Unity导航 (寻路系统Nav Mesh Agent)

第一种 简单寻路  地面接触到的.到达目标点不用跳跃能够一直走路到达. 场景视图中简单搭设几个物体.如图1 胶囊体为寻路者,黄球为目标点 红地板,绿色障碍物. 现将地板以及障碍物选中 在检视面板设置静态为Navigation Static 如图2 然后菜单栏选择窗口 Window –Navigation 然后选择All-Bake烘焙如图 有三个页面参数可以调节烘焙效果,参数具体参照圣典解释. 注意 胶囊体和目标物都要烘焙在蓝色格子里面.否则不能实现,可以调节第二个页面里的参数调节烘焙大小. 然后

Unity 脚本的执行顺序

在Unity脚本中常用到的函数就是下面这些,他们的顺序也是按照箭头的方向执行的. Awake ->OnEable-> Start -> FixedUpdate-> Update  -> LateUpdate ->OnGUI ->OnDisable ->OnDestroy 1.Awake 用于在游戏开始之前初始化变量或游戏状态.在脚本整个生命周期内它仅被调用一次.Awake在所有对象被初始化之后调用,所以你可以安全的与其他对象对话或用诸如GameObject.

unity脚本执行顺序

Awake ->OnEable-> Start ->-> FixedUpdate-> Update  -> LateUpdate ->OnGUI ->Reset -> OnDisable ->OnDestroy using UnityEngine; using System.Collections; public class timetest : MonoBehaviour { void LateUpdate() { print("La

【Unity 3D】学习笔记三十六:物理引擎——刚体

物理引擎就是游戏中模拟真是的物理效果.如两个物体发生碰撞,物体自由落体等.在unity中使用的是NVIDIA的physX,它渲染的游戏画面很逼真. 刚体 刚体是一个很很中要的组件. 默认情况下,新创的物体是不具备物理效果的,而刚体组件能够给物体加入一些常见的物理属性.比方说:质量.摩擦力.碰撞等. 假设对象加入了刚体组件.那么它将感应物理引擎中的一切物理效果. 简单的使用下 首先穿件一个游戏对象,接着在hierarchy视图中选择创建的游戏对象.然后在unity导航菜单条中选择component

unity自带的方法

就像我们定义的方法名一样.在哪里调用.Unity  MonoBehaviour  脚本文件默认集成的类名,他做了一些设置能识别某些方法.就像tostring()一样. MonoBehaviour 里面也有一些他能识别的方法名. UNITY 中系统由自身调用几个比较重要的方法 Update()  正常更新,用于更新逻辑.此方法每帧都会系统调用一次. LATEUPDTE()  推迟更新,此方法在Update()方法执行完毕后调用,同样每一帧都调用. Awake()  脚本唤醒 ,此方法为系统执行的第

unity脚本执行顺序详解

unity脚本自带函数执行顺序如下:将下面脚本挂在任意物体运行即可得到 Awake ->OnEable-> Start ->-> FixedUpdate-> Update  -> LateUpdate ->OnGUI ->Reset -> OnDisable ->OnDestroy using UnityEngine; using System.Collections; public class timetest : MonoBehaviour

unity脚本运行顺序具体的解释

unity脚本自带函数执行顺序例如以下:将以下脚本挂在随意物体执行就可以得到 Awake ->OnEable-> Start ->-> FixedUpdate-> Update  -> LateUpdate ->OnGUI ->Reset -> OnDisable ->OnDestroy using UnityEngine; using System.Collections; public class timetest : MonoBehavio

Unity 脚本中的主要函数的 执行顺序及其介绍

Awake ->OnEable-> Start -> FixedUpdate-> Update  -> LateUpdate ->OnGUI ->OnDisable ->OnDestroy 1.Awake 用于在游戏开始之前初始化变量或游戏状态.在脚本整个生命周期内它仅被调用一次.Awake在所有对象被初始化之后调用,所以你可以安全的与其他对象对话或用诸如GameObject.FindWithTag()这样的函数搜索它们.每个游戏物体上的Awake以随机的顺