Unity3D 自动寻路

发表于2017-06-10
评论0 2.8k浏览

在游戏中,不能所有物体都要求它按照一条定向的路径移动,还需要给玩家一定的操作空间,让玩家点到哪儿就可以移动到那儿。考虑到这方面,下面就给大家介绍下Unity3D自带的自动寻路功能,实现这个需求。

如下图,摆了4个cube当作墙,然后摆一个球,当作游戏的主角,鼠标点哪走哪,但关键是不会出现穿墙的情况。


具体做法如下:

一、场景布置

1、如下图所示,没什么好说的。


2、之后先将这个场景保存为Navmesh,然后如下图打开自动寻路设置界面。


如下图所示,在Navigation界面,对所有代表墙的Cube和地板Plane都勾上Navigation Static。表示这些都是寻路的阻碍物。

都设置好再点击Bake。烘培之后就会出现如下图的淡蓝色的,可移动的区域。这是unity3d自己能计算出来的。


3、给球加上Nav Mesh Agent这个组件,表示它是一个被导航体。里面的半径、速度等,Unity3D给你上这个组件的时候,基本会给你计算好的,如果你是自己导入的3D模型估计需要将半径改到和你的3D模型基本匹配的程度。


4、之后再给Plane上一个plane标签,用于碰撞检测。因为Unity3D中,鼠标点击Plane,需要是在鼠标点击的屏幕像素点,发出一条直线和Unity3D世界中物体碰撞,才能找到准确的点击的。这在《【Unity3D】判断是否鼠标点击物体与血条制作》(点击打开链接)已经说了,这里不再赘述了。毕竟这个plane注定要会被我们一会儿疯狂点击的。


二、脚本设置

给球sphere赋予如下的Navigation.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
using UnityEngine; 
using System.Collections; 
   
public class Navigation : MonoBehaviour 
    private NavMeshAgent navMeshAgent; 
    void Start() 
    
        navMeshAgent = gameObject.GetComponent();//初始化navMeshAgent 
    
    void Update() 
    
        if (Input.GetMouseButtonDown(0))//鼠标左键点下   
        
            Ray mRay = Camera.main.ScreenPointToRay(Input.mousePosition);//住摄像机向鼠标位置发射射线  
            RaycastHit mHit; 
            if (Physics.Raycast(mRay, out mHit))//射线检验  
            
                if (mHit.collider.gameObject.tag == "plane"
                
                    navMeshAgent.SetDestination(mHit.point);//mHit.point就是射线和plane的相交点,实为碰撞点 
                
            
        
    


则能够享受NavMeshAgent带来的Unity3D自动寻路的欢乐~(*^_^*)

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引

0个评论