• 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的渲染层数减少;进行一个优化

  • 相关阅读:
    【slenium专题】Webdriver同步设置
    【Selenium专题】WebDriver启动firefox浏览器
    【Selenium专题】WebDriver启动Chrome浏览器(二)
    【Selenium专题】WebDriver启动Chrome浏览器(一)
    Jenkins邮件设置
    Jenkins安装笔记
    for循环输出i为同一值的问题,SetTimeOut
    const、let、var的区别
    浏览器title失去焦点时改变title
    clone对象或数组
  • 原文地址:https://www.cnblogs.com/fengjiulin110120/p/6841953.html
Copyright © 2020-2023  润新知