在塔防游戏中,敌人是按照一条预设的路线进行行动的。
路线是由若干个路点组成的,下面为路点创建脚本PathNode.cs
在Hierachy中,新建一个空物体,然后加载PathNode.cs
/* * PahtNode Definition * Created by taotao man on 2015-8-2 * brief: 路点 * // 修改记录 * date: * add SetA(); * change GetA(); */ 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_next = this; } // 显示路点图标 public void OnDrawGizmos() { Gizmos.DrawIcon(this.transform.position, "Node.tif"); } }
第二步,在Project内的Assets目录下创建一个名为Editor的文件夹,名称是特定的,记住:所有需要在编辑状态相爱执行的脚本都应当存放到这里,
它将提供一个自定义的菜单帮助我们设置路点。
/* PathTool Definition Created by taotao man on 2015-9-16 brief: 提供一个自定义的菜单,帮助我们设置路点 //修改记录: date: add SetA(); change GetA(); */ using UnityEngine; using System.Collections; // <span style="color:#ff0000;">using UnityEditor;</span> public class PathTool : <span style="color:#ff0000;">ScriptableObject </span> { static PathNode m_parent=null; [MenuItem("PathTool/Create PathNode")] // Use this for initialization static void CreatePathNode() { // 创建一个新的路点 GameObject go = new GameObject(); go.AddComponent<PathNode>(); go.name = "pathnode"; go.tag = "pathnode"; // 设置tag Selection.activeTransform = go.transform; // 使该路点处于选择状态 } // 菜单SetParent, 用来设置父路点,快捷键Ctrl + Q [MenuItem("PathTool/SetParent %q")] static void SetParent() { // 若没有选中任何物体,或者选择物体数量大于1,返回 if (!Selection.activeGameObject || Selection.GetTransforms(SelectionMode.Unfiltered).Length > 1) return; // 若选中的物体Tag设置为pathnode if(Selection.activeGameObject.tag.CompareTo("pathnode") == 0) { //Debug.Log("sjt"); // 保存当前选中的路点 m_parent = Selection.activeGameObject.GetComponent<PathNode>(); } } // 菜单SetNextChild,用来设置子路点,<span style="background-color: rgb(255, 0, 0);">快捷键Ctrl + w</span> [MenuItem("PathTool/Set Next %w")] static void SetNextChild() { if(!Selection.activeGameObject || m_parent == null) return; if(Selection.activeGameObject.tag.CompareTo("pathnode") == 0) { // 设置子路点 m_parent.SetNext(Selection.activeGameObject.GetComponent<PathNode>()); m_parent = null; } } }
Selection 是专门用在编辑状态模式下的一个静态类,通过它可以获取到当前选择的物体。
[MenuItem("PathTool/Set Next %q")]属性将在菜单中添加名为PathTool的自定义菜单,包括子菜单,Set Next, 快捷键为Ctrl + q ;
第三步,在场景中清楚看见观察路点之间的连线。接下来添加代码,使得路点之间产生一条线。
先添加两个属性,
public bool m_debug = false; // 控制是否显示路点之间的连线 public ArrayList m_PathNodes; // 用来保存所有的路点
[ContextMenu("BuildPath")] //在其程序窗口的不同位置单击右键,会出现不同弹出菜单, void BuildPath() // 将所有场景中的路点装入m_PathNodes { m_PathNodes = new ArrayList(); <span style="color:#ff0000;"> // 查找所有 tag 为 pathnode 的 GameObject</span> GameObject[] objs = GameObject.FindGameObjectsWithTag("pathnode"); for (int i = 0; i < objs.Length; i++) { PathNode node = objs[i].GetComponent<PathNode>(); m_PathNodes.Add(node); } }
void OnDrawGizmos() // 当m_debug为真时,显示路点之间的连线 { if(!m_debug || m_PathNodes == null) return; Gizmos.color = Color.blue; foreach(PathNode node in m_PathNodes) { if(node.m_next != null) { <span style="color:#ff0000;"> // 画线 Gizmos.DrawLine(node.transform.position, node.m_next.transform.position);</span> } } }