1.画线脚本写法及地面调整

首先,新建脚本GridMap

新建绘制网格方法(初始数值为10*10)

在类中创建变量

//定义地图宽度

public int m_mapWidth = 10;

//地图高度

public int m_mapHeight = 10;

void OnDrawGizemos(){

         Gizmos.color = Color.blue;

    //绘制纵向线段

    for (int i = 0; i < m_mapWidth; i++)

    {

        Gizmos.DrawLine(new Vector3(i, 0, 0), new Vector3(i, 0, m_mapHeight));

    }

    //绘制横向的线

    for (int j = 0; j < m_mapWidth; j++)

    {

       Gizmos.DrawLine(new Vector3(0, 0, j), new Vector3(m_mapWidth, 0, j));

    }

}

在场景中新建空物体并把该脚本挂上去。

新建一个Plane(地面),把大小调整的与网格形状一致。宽高在unity界面中调整为30,

 

 

2.绘制路径图

在场景中新建Map空物体,在其下新建plane

 

颜色调为灰色,

 

 

为了使路线可见,路径的y轴position改为0.02。

3.节点编辑

1)写节点类

using UnityEngine;

using System.Collections;

//定义节点类型

public enum NodeType

{

    //可以放置炮塔的状态

    GuardPosition,

    //不能放置炮塔

    CannotStand

}

//网格节点的数据类

[System.Serializable]

//标记序列化,是一个标签,方便下面的类能够序列化,能从内存中获取对象。编辑器可直接使用。可以运用于类、枚举,对变量无效果

//NodeData是c#类,没有派生于mono

public class NodeData

{

    //这里注意设置初始值为可以放置炮塔状态

    public NodeType m_NodeType = NodeType.GuardPosition;

}

public class GridNode : MonoBehaviour

{

    //节点数据

    public NodeData m_gridNodeData;

    void OnDrawGizmos()

    {

        //gridnode.tif放在Gizmos文件夹中,注意不要写错

        Gizmos.DrawIcon(transform.position, "gridnode.tif");

    }

}

2)新建空物体GridNodeParent,在其下建空物体GridNode把GridNode脚本拖给它。

如果Gizmos文件夹中有名为gridnode.tif文件的话,出现的效果为

 

 

然后把节点放在网格中央的位置,保证灰色区域有该标识符。完成效果如图。

 

 

4.收集网格信息,对不可摆放炮台区域绘制立方体

1)在GridMap类中新建变量

//收集网格信息,初始值为null

public NodeData[,] m_mapData;

新建类BuildMap

//定义地图,收集地图的数据

    [ContextMenu("BuildMap")]

    public void BuildMap()

    {

        //对二维数组初始化

        m_mapData = new NodeData[m_mapWidth, m_mapHeight];

        //遍历二维数组

        for (int i = 0; i < m_mapWidth; i++)

        {

            for (int k = 0; k < m_mapHeight; k++)

            {

                //初始化后,每个网格节点的数据默认状态为GuardPosition

                m_mapData[i, k] = new NodeData();

            }

        }

        //通过标签查找

        GameObject[] objs = GameObject.FindGameObjectsWithTag("gridnode");

        Debug.Log("objs length" + objs.Length);

        for (int i = 0; i < objs.Length; i++)

        {

            //获取脚本组件

            GridNode node = objs[i].GetComponent<GridNode>();

            //用位置做下标,x坐标,(int)取整

            int ix = (int)objs[i].transform.position.x;

            int iz = (int)objs[i].transform.position.z;

            //枚举更新到单元网格中

            m_mapData[ix, iz].m_NodeType = node.m_gridNodeData.m_NodeType;

        }

}

然后在画线方法OnDrawGizmos中新增画方块方法

//设置画方块的高度(y值)

float height = 0;

//x坐标变化

for (int i = 0; i < m_mapWidth; i++)

{

     //z坐标变化

     for (int k = 0; k < m_mapHeight; k++)

     {

          //如果不能放置炮塔,绘制立方体

          if (m_mapData[i, k].m_NodeType == NodeType.CannotStand)

          {

             //定义颜色及透明度

             Gizmos.color = new Color(1, 0, 0, 0.5f);

             //设置立方体位置

             Gizmos.DrawCube(new Vector3(i + 0.5f, height, k + 0.5f), Vector3.one);

           }

     }

}

然后重新运行,会出现下面的效果

 

 

PS:

1.记得在GridMap类的Start方法中对BuildMap进行调用。

2.辅助点GridNode是通过gridnode标签进行查找的,如果用的不是标签查找,记得更换查找方式。

posted on 2017-01-09 21:23  木子微冷  阅读(608)  评论(0编辑  收藏  举报