zoukankan      html  css  js  c++  java
  • Gizmos绘制塔防游戏网格

    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标签进行查找的,如果用的不是标签查找,记得更换查找方式。

  • 相关阅读:
    选择器
    asp.net 操作ftp类
    女装类视觉设计感悟
    跨域读取js变色
    关于jQuery的ajax初级应用
    打造前端自动化编译环境(思路)
    <base>标签在ie6下的问题
    通过压缩图片 来提升页面加载速度
    原来我一直不懂cookie
    去处浏览器的默认效果(autocomplete, outline)
  • 原文地址:https://www.cnblogs.com/mzwl/p/6266618.html
Copyright © 2011-2022 走看看