Unity3D手机游戏开发4.5 路点_Unity3D手机游戏开发4.5 路点试读-查字典图书网
查字典图书网
当前位置: 查字典 > 图书网 > 编程 > Unity3D手机游戏开发 > 4.5 路点

Unity3D手机游戏开发——4.5 路点

在前一章,我们使用Unity提供的寻路功能实现敌人的行动,但在塔防游戏中,敌人通常不需要智能寻路,而是按照一条预设的路线行动。接下来我们将为敌人创建一条前进路线,这条路线是预设的,敌人将从游戏场景的左侧沿着通道一直走到右侧。 路线是由若干个路点组成,首先为路点创建脚本PathNode.cs: using UnityEngine; using System.Collections; public class PathNode : MonoBehaviour { // 父路点 public PathNode m_parent; // 子路点 public PathNode m_next; // 设置子节点 public void SetNext(PathNode node) { if (m_next != null) m_next.m_parent = null; m_next = node; node.m_parent = this; } // 显示路点图标 void OnDrawGizmos() { Gizmos.DrawIcon(this.transform.position, "Node.tif"); } } 在游戏中,敌人将从一个路点到达另一个路点,即到达当前路点的子路点。在PathNode脚本中,主要是通过SetNext函数设置它的子路点。 创建一个空游戏体作为路点,指定PathNode.cs脚本,并设置Tag为“pathnode”。为了能使后面的操作正确,请不要将路点制作为prefab。 沿着场景中的通道摆放路点,为了显示方便,可以将之前设置的单元格节点暂时隐藏,如图4-9所示。 图4-9 设置路点 接下来我们将为每个路点设置子路点,为了设置方便,我们将添加一个菜单功能,加速设置路点的操作。 在Project窗口内的Assets目录下创建一个名为Editor的文件夹,名称是特定的,不能改变,所有需要在编辑状态下执行的脚本都应当被存放到这里。 在Editor文件夹内创建脚本PathTool.cs,它将提供一个自定义的菜单,帮助我们设置路点,代码如下: using UnityEngine; using UnityEditor; using System.Collections; public class PathTool : ScriptableObject { // 父路点 static PathNode m_parent=null; // 菜单SetParent,用来设置父路点,快捷键Ctrl+q [MenuItem("PathTool/Set Parent %q")] static void SetParent() { // 如果没有选中任何物体,或选择物体数量大于1,返回 if (!Selection.activeGameObject || Selection.GetTransforms(SelectionMode. Unfiltered).Length>1) return; // 如果选中的物体Tag设为pathnode if (Selection.activeGameObject.tag.CompareTo("pathnode") == 0) { // 保存当前选中的路点 m_parent = Selection.activeGameObject.GetComponent<PathNode>(); } } // 菜单SetNextChild,用来设置子路点,快捷键Ctrl+w [MenuItem("PathTool/Set Next %w")] static void SetNextChild() { if (!Selection.activeGameObject || m_parent==null || Selection.GetTransforms(SelectionMode.Unfiltered).Length>1) return; if (Selection.activeGameObject.tag.CompareTo("pathnode") == 0) { // 设置子路点 m_parent.SetNext( Selection.activeGameObject.GetComponent<PathNode>() ); m_parent = null; } } } 这里的代码只有在编辑状态才能被执行,注意PathTool继承自ScriptableObject,并在最前面引用了UnityEditor。所有在这里使用的属性和函数均为static类型。 [MenuItem("PathTool/Set Parent %q")]属性将在菜单中添加名为PathTool的自定义菜单,并包括子菜单Set Parent,快捷键为Ctrl+q。菜单Set Parent执行的功能即是SetParent函数中的功能,将当前选中的节点作为父路点。 相应的SetNextChild函数将当前选中的路点作为父路点的子路点。 选中场景中的第一个路点,按快捷键Ctrl+q将其设为父路点,然后选择下一个路点按Ctrl+w设为子路点,再按Ctrl+q将它设为父路点,再选择子路点,反复这个操作,直到将所有路点设置完毕,注意,最后一个路点没有子路点。 虽然我们设置好路点,但还无法在场景中清楚地观察路点之间的联系,接下来我们将在GameManager.cs中添加代码,使路点之间产生一条连线。 打开脚本GameManager.cs,添加两个属性如下。m_debug是一个开关,控制是否显示路点之间的连线,m_PathNodes是一个ArrayList,它用来保存所有的路点。 public bool m_debug = false; public ArrayList m_PathNodes; 继续在GameManager.cs中添加函数BuildPath,并在Start函数中调用它,它的作用是将所有场景中的路点装入m_PathNodes。 [ContextMenu("BuildPath")] void BuildPath() { m_PathNodes = new ArrayList(); GameObject[] objs = GameObject.FindGameObjectsWithTag("pathnode"); for (int i = 0; i < objs.Length; i++) { PathNode node = objs[i].GetComponent<PathNode>(); m_PathNodes.Add(node); } } 继续在GameManager.cs中添加函数OnDrawGizmos,它的作用是当m_debug属性为真时显示路点之间的连线。 void OnDrawGizmos() { if (!m_debug || m_PathNodes==null ) return; Gizmos.color = Color.blue; foreach (PathNode node in m_PathNodes) { if (node.m_next != null) { Gizmos.DrawLine(node.transform.position, node.m_next.transform.position); } } } 选择游戏管理器,在GameManager组件设置m_debug属性为真,选择右上方的齿轮按钮,在子菜单中选择【BuildPath】,这是我们自定义的菜单,执行后将在场景中看到路点之间的连线,如图4-10所示。 图4-10 路点之间的连线

展开全文


推荐文章

猜你喜欢

附近的人在看

推荐阅读

拓展阅读

《Unity3D手机游戏开发》其他试读目录

• 3.1 策划
• 3.2 游戏场景
• 3.3 主角
• 3.4 敌人
• 3.5 UI界面
• 3.6 交互
• 3.7 出生点
• 小结
• 4.1 策划
• 4.2 游戏场景
• 4.3 摄像机
• 4.4 游戏管理器
• 4.5 路点 [当前]
• 4.6 敌人
• 4.7 敌人生成器
• 4.8 防守单位
• 4.9 生命条
• 4.10 自定义按钮
• 小结
  • 大家都在看
  • 小编推荐
  • 猜你喜欢
  •