其实Unity3D 2D的寻路方式比较简单的,只要你做上几次寻路的地图,那寻路对你来说就是小kiss,下面我们就来说一下寻路的方法和详细的步骤,大家可以指正,或者有更好的办法是最好不过啦。

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

由于内容比较多,我们将分几次来系统学习。今天先通过学习一个最简单的例子来入门unity3d开发2d游戏。

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

步骤

1.创建地形
2.添加角色
3.创建多个障碍物,尽量摆的复杂一点,来检查Navmesh的可用性和效率。
4.选中地形,在Navigation窗口中,设置Navigation Static
5.依次选中障碍物,在avigation窗口中,设置Navigation Static
7.Navigation窗口中,选择Bake(烘焙)界面,点击Bake按钮,进程场景烘焙,就可以烘焙出寻路网格了
8.为角色添加NavMeshAgent组件。Component->Navigation->Nav Mesh Agent
9.为角色新增一个脚本PlayerController.cs,实现点击目标,自动寻路功能

using UnityEngine;
using System.Collections;
//Author:ken@iamcoding.com
public class PlayerController: MonoBehaviour
{
    private NavMeshAgent agent;
    void Start()
    {
        //获取组件
        agent = GetComponent();
    }
    void Update()
    {
        //鼠标左键点击
        if(Input.GetMouseButtonDown(0))
        {
            //摄像机到点击位置的的射线
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;
            if(Physics.Raycast(ray, out hit))
            {
                //判断点击的是否地形
                if(!hit.collider.name.Equals("Terrain"))
                {
                    return;
                }
                //点击位置坐标
                Vector3 point = hit.point;
                //转向
                transform.LookAt(new Vector3(point.x, transform.position.y, point.z));
                //设置寻路的目标点
                agent.SetDestination(point);
            }
        }
        //播放动画,判断是否到达了目的地,播放空闲或者跑步动画
        if(agent.remainingDistance == 0)
        {
            animation.Play("idle");
        }
        else
        {
            animation.Play("run");
        }
    }
}

到这里,Unity3D 2D的寻路方式就已经完成了!这个unity3d开发2d游戏实例可以很简单的让我们学会如何最基本的使用自动寻路组件Nav。但是,这个组件还提供了更加强大的功能,比如,起始点和目标点中间出现阻断了