码迷,mamicode.com
首页 > 其他好文 > 详细

自动寻路Navmesh基础入门

时间:2015-03-15 09:39:47      阅读:230      评论:0      收藏:0      [点我收藏+]

标签:

自动寻路Navmesh

现在的大部分游戏都有了自动寻路功能。点击场景上的一个位置,角色就会自动寻路过去。中间可能会有很多的障碍物,角色会自动绕过障碍物,最终达到终点。使用Unity来开发手游,自动寻路可以有很多种实现方式。第一种比较传统的是使用A星寻路,它是一种比较传统的人工智能算法,在游戏开发中比较常用到。大部分的页游和端游都用到这种技术。在Unity游戏也可以用这种技术,Asset Store上面已经有相关的组件了,感兴趣的同学可以自己去了解。我在后面有机会再来详细介绍了。今天我们来学习Unity官方内置的寻路插件-Navmesh。今天先通过学习一个最简单的例子来入门。

 

 

一个物体只要有了transform就可以使用寻路功能。

?   实例

?               我们要实现一个功能:点击场景中的一个位置,角色可以自动寻路过去。角色会绕过各种复杂的障碍,找到一条理论上”最短路径“。

?   步骤

?               1.创建地形

?               2.添加角色

?               3.创建多个障碍物,尽量摆的复杂一点,来检查Navmesh的可用性和效率。

?               4.选中地形,在Navigation窗口中,设置Navigation Static

技术分享

?               5.依次选中障碍物,在avigation窗口中,设置Navigation Static

?               7.Navigation窗口中,选择Bake(烘焙)界面,点击Bake按钮,进程场景烘焙,就可以烘焙出寻路网格了

?               8.为角色添加NavMeshAgent(网格代理寻路)组件。Component->Navigation->NavMesh Agent

9.为角色新增一个脚本PlayerController.cs,实现点击目标,自动寻路功能

 

 

相关知识

1.角色身上的Nav Mesh Agent 组件

技术分享

Radius 半径: 代理的半径(仅用于寻路目的,可以跟实际对象的半径大小不一样,一般比实际对象的半径大)。

Speed 速度: 代理可以周游世界,走向它的目的地的最大移动速度。

Acceleration 加速度: 最大加速度。

Angular Speed 角速度: 最高转速(度/秒)。

Stoppingdistance 制动距离:制动距离。到目的地的距离小于这个值,代理减速。

Auto TraverseOffMesh Link 自动遍历OffMesh链接:自动移动并关闭OffMeshLinks

Auto Repath 自动重新寻路:如果现有的部分已失效,获得新的路径。

Height 高度:代理的高度(用于调试图形)。

Base offset 基本偏移:碰撞几何体相对于实际几何体垂直的偏移。

ObstacleAvoidance Type 障碍躲避类型 :躲避的质量水平。

NavMeshWalkable 导航网格行走:指定代理可以遍历的导航网格层类型。这个参数很有用,在接下来的实例中可以用到

 

 

 

2.障碍物一定要有Mesh Render,用于烘焙寻路网格。

?   总结

这个实例可以很简单的让我们学会如何最基本的使用自动寻路组件Nav。但是,这个组件还提供了更加强大的功能,比如,起始点和目标点中间出现阻断了,

怎么办?在下面的文章中,我们将会继续探寻其他强大的功能。

实例:

技术分享

using UnityEngine;
using System.Collections;

public class walk : MonoBehaviour {
    public Animator aa;
    public Camera cc;
    public Vector3 targetposition;
    public NavMeshAgent nav;
    void Start () {
        targetposition=this.transform.position;
        aa=this.GetComponent<Animator>();
        nav=this.GetComponent<NavMeshAgent>();
    }
    

    void Update () {
        nav.SetDestination(targetposition);
        if(Input.GetMouseButtonDown(0)){
            aa.Play("Skeleton_walk");
            getpoint();
        }
        if(nav.remainingDistance<0.3f){
            aa.Play("Skeleton_Idle");
            nav.Stop();
        }
    }

    void getpoint(){
        Ray ray;
        RaycastHit hit;
        ray=cc.ScreenPointToRay(Input.mousePosition);
        if(Physics.Raycast(ray,out hit)){
            if(hit.collider.gameObject.tag=="Road"){
                //Debug.Log(hit.point);
                targetposition=hit.point;
            }
        }
    }
}

自动寻路Navmesh基础入门

标签:

原文地址:http://blog.csdn.net/wy_boke/article/details/44261609

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!