4.6路点;创建菜单

在塔防游戏中,敌人是按照一条预设的路线进行行动的。

路线是由若干个路点组成的,下面为路点创建脚本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;

        }

    }
	
}

这里的代码只有在编辑状态下才可以执行。所有在这里使用的属性和函数均为static 类型。

Selection 是专门用在编辑状态模式下的一个静态类,通过它可以获取到当前选择的物体。

[MenuItem("PathTool/Set Next %q")]属性将在菜单中添加名为PathTool的自定义菜单,包括子菜单,Set Next, 快捷键为Ctrl  + q ;

4.6路点;创建菜单_第1张图片


第三步,在场景中清楚看见观察路点之间的连线。接下来添加代码,使得路点之间产生一条线。

先添加两个属性,

 public bool m_debug = false;     // 控制是否显示路点之间的连线
    public ArrayList m_PathNodes;    // 用来保存所有的路点

然后在Start()函数中调用

 [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);
        }
    }

继续添加OnDrawGizmos()函数

 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>
            }
        }
    }
4.6路点;创建菜单_第2张图片





你可能感兴趣的:(4.6路点;创建菜单)