Unity 导航系统Navigation

基于unity引擎的开发进阶之 导航系统

在游戏中常常有根据目标位置自动生成路线并自动寻路的功能,在3d导航中我们需要根据目的地生成到达目的地的可行路径。
Unity的Navigation导航功能通过设置平面、障碍物、循迹主体三种标签,自动生成可Nav Mesh导航网格
,给物体添加导航代理组件后,物体会根据目标位置和导航网格,寻找合适的路线,沿着该路线移动到目标位置,如果障碍物是移动的可以给障碍物添加NavMesh Obstacle导航网格障碍物组件,该组件可用于描述代理在世界中导航时应避开的移动障碍物。由物理系统控制的木桶或板条箱便是障碍物的典型例子。障碍物正在移动时,代理将尽力避开它,障碍物一旦变为静止涨停,便会在导航网格中雕刻一个孔,从而使代理能够改变自己的路径来绕过它,或者如果静止的障碍物阻挡了路径,则代理可寻找其他不同的路线。
###生成导航网格
1、标记用于生成导航网格的物体;
2、在Navigation视图中点击bake按钮生成导航网格
Unity 导航系统Navigation_第1张图片
Unity 导航系统Navigation_第2张图片

###为动态物体添加动态导航代理组件
选择需要导航的对象,点击Component-Navigation-Nav Mesh Agent

Unity 导航系统Navigation_第3张图片
下面我们给球添加一个脚本,通过脚本可以将角色发送到另一个游戏对象指定的目标

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;

public class AutoStart:MonoBehaviour
{
	public Transform target;
	protected UnityEngine.AI.NavMeshAgent agent;	
	void Start(){
	//获取游戏对象的导航组件
	agent = GetComponent<UnityEngine.AI.NavMeshAgent>();
	
	}
	void Update()
	{
		//检测用户鼠标点击
		if(Input.GetButtonDown("Fire1"))
			SetDestination();
	}
	//设置导航目的地
	protected void SetDestination()
	{
		//鼠标点击的位置,并用target标记目标位置
		var ray = Camera.main.ScreenPointToRay(Input.mousePosition);
		if(Physics.Raycast(ray,out hit))
		{
			target.position = hit.point;
			agent.destination = target.position;
		}

	}


}

总而言之,我们需要对取得导航网格代理组件的引用,然后为了将代理设置为运动状态,只需要将一个位置分配给其destination属性。、
导航代理组件的属性包括:导航代理的尺寸;导航代理的运动属性;闪避寻路等行为的属性。

Radius是导航代理的半径,Height是导航代理的高度,BaseOffset是导航物体相对于圆柱体导航代理的垂直偏移量
Steering控制属性:

  • Speed:最大移动速度
  • Augular Speed:最大转向速度
  • Acceleration:最大加速度
  • Stopping Distance:停止距离
  • Auto Barking:自动刹车
    导航代理组件中Obstacle Avoida 标签下的属性,和导航代理的躲避行为有关。
  • Quality:躲避的质量。
    Priority属性
  • Priority属性表示导航代理的优先级,范围从0-99,值越小优先级越高

###导航网格设置
Unity 导航系统Navigation_第4张图片

导航代理的设置方法:
导航代理组件计算导航物体的运动半径,控制导航物体移动到目标位置;
导航物体移动过程中,会避开障碍物,以及其他添加导航代理的导航物体。

你可能感兴趣的:(unity3d,unity3d,游戏开发)