Unity3D 2D的寻路方式

2015年01月26日 09:17 1 点赞 2 评论 更新于 2020-01-16 15:27

在Unity3D 2D开发中,寻路功能的实现其实并不复杂。只要你实践过几次寻路地图的制作,寻路对你来说将是小菜一碟。下面,我们将详细介绍寻路的方法和步骤,欢迎大家指正,若你有更好的办法,那就再好不过了。

如今,大部分MMO游戏都具备自动寻路功能。玩家点击场景中的某个位置,角色便会自动寻路前往,途中即便存在诸多障碍物,角色也能自动绕过,最终抵达终点。在使用Unity3D开发2D游戏时,自动寻路有多种实现方式。其中,比较传统的是A星寻路算法,它是一种经典的人工智能算法,在游戏开发领域应用广泛,大部分页游和端游都采用了这项技术。在Unity游戏中同样可以使用该技术,Asset Store上已有相关组件,感兴趣的同学可以自行了解,后续有机会我会再详细介绍。今天,我们将学习Unity官方内置的寻路插件——Navmesh。

由于内容较多,我们将分几次进行系统学习。今天,我们先通过一个最简单的例子,来开启Unity3D开发2D游戏的寻路学习之旅。

实例目标

我们要实现这样一个功能:当玩家点击场景中的某个位置时,角色能够自动寻路前往,并且会绕过各种复杂的障碍,找到理论上的“最短路径”。

实现步骤

  1. 创建地形:在Unity场景中创建地形,作为角色活动的基础场景。
  2. 添加角色:将角色模型添加到场景中,该角色将是实现寻路功能的主体。
  3. 创建障碍物:创建多个障碍物,并尽量将它们摆放得复杂一些,以此来检验Navmesh的可用性和效率。
  4. 设置地形导航静态属性:选中地形,在Navigation窗口中,设置Navigation Static。这一步是为了让Unity知道该地形在寻路计算中是静态的。
  5. 设置障碍物导航静态属性:依次选中各个障碍物,在Navigation窗口中,设置Navigation Static。同样,这是为了告知Unity障碍物在寻路计算中的静态性质。
  6. 烘焙寻路网格:在Navigation窗口中,选择Bake(烘焙)界面,点击Bake按钮,对场景进行烘焙,从而生成寻路网格。
  7. 添加NavMeshAgent组件:为角色添加NavMeshAgent组件,路径为Component -> Navigation -> Nav Mesh Agent。该组件是实现自动寻路的关键。
  8. 编写脚本实现寻路功能:为角色新增一个脚本PlayerController.cs,用于实现点击目标后自动寻路的功能。以下是脚本的详细代码:
    using UnityEngine;
    using System.Collections;
    //Author:ken@iamcoding.com
    public class PlayerController : MonoBehaviour
    {
    private NavMeshAgent agent;
    void Start()
    {
    //获取组件
    agent = GetComponent<NavMeshAgent>();
    }
    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)
    {
    GetComponent<Animation>().Play("idle");
    }
    else
    {
    GetComponent<Animation>().Play("run");
    }
    }
    }
    

至此,Unity3D 2D的寻路功能就已经实现了!通过这个简单的Unity3D开发2D游戏实例,我们学会了如何基本使用自动寻路组件Navmesh。不过,该组件还有着更强大的功能,例如当起始点和目标点之间出现阻断时的处理等,后续我们可以进一步深入探索。

作者信息

boke

boke

共发布了 1025 篇文章