Unity3D 2D的寻路方式
在Unity3D 2D开发中,寻路功能的实现其实并不复杂。只要你实践过几次寻路地图的制作,寻路对你来说将是小菜一碟。下面,我们将详细介绍寻路的方法和步骤,欢迎大家指正,若你有更好的办法,那就再好不过了。
如今,大部分MMO游戏都具备自动寻路功能。玩家点击场景中的某个位置,角色便会自动寻路前往,途中即便存在诸多障碍物,角色也能自动绕过,最终抵达终点。在使用Unity3D开发2D游戏时,自动寻路有多种实现方式。其中,比较传统的是A星寻路算法,它是一种经典的人工智能算法,在游戏开发领域应用广泛,大部分页游和端游都采用了这项技术。在Unity游戏中同样可以使用该技术,Asset Store上已有相关组件,感兴趣的同学可以自行了解,后续有机会我会再详细介绍。今天,我们将学习Unity官方内置的寻路插件——Navmesh。
由于内容较多,我们将分几次进行系统学习。今天,我们先通过一个最简单的例子,来开启Unity3D开发2D游戏的寻路学习之旅。
实例目标
我们要实现这样一个功能:当玩家点击场景中的某个位置时,角色能够自动寻路前往,并且会绕过各种复杂的障碍,找到理论上的“最短路径”。
实现步骤
- 创建地形:在Unity场景中创建地形,作为角色活动的基础场景。
- 添加角色:将角色模型添加到场景中,该角色将是实现寻路功能的主体。
- 创建障碍物:创建多个障碍物,并尽量将它们摆放得复杂一些,以此来检验Navmesh的可用性和效率。
- 设置地形导航静态属性:选中地形,在Navigation窗口中,设置Navigation Static。这一步是为了让Unity知道该地形在寻路计算中是静态的。
- 设置障碍物导航静态属性:依次选中各个障碍物,在Navigation窗口中,设置Navigation Static。同样,这是为了告知Unity障碍物在寻路计算中的静态性质。
- 烘焙寻路网格:在Navigation窗口中,选择Bake(烘焙)界面,点击Bake按钮,对场景进行烘焙,从而生成寻路网格。
- 添加NavMeshAgent组件:为角色添加NavMeshAgent组件,路径为Component -> Navigation -> Nav Mesh Agent。该组件是实现自动寻路的关键。
- 编写脚本实现寻路功能:为角色新增一个脚本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。不过,该组件还有着更强大的功能,例如当起始点和目标点之间出现阻断时的处理等,后续我们可以进一步深入探索。