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

Gizmos绘制塔防游戏网格的更多相关文章

  1. [译]终极塔防——运用HTML5从头创建一个塔防游戏

    翻译共享一篇CodeProject的高星力作,原文地址:http://www.codeproject.com/Articles/737238/Ultimate-Tower-Defense 下载演示项目 ...

  2. 制作一个塔防游戏 Cocos2d-x 2.1.4 (一)

    在这篇文章,将会学习到怎样制作一个塔防游戏.在这其中,学习怎样在设定的时间内出现一波波的敌人,使这些敌人沿着指定的路点前进.怎样在地图上指定的位置创建炮塔.怎样使炮塔射击敌人,怎样可视化调试路点和炮塔 ...

  3. Cocos2d-x3.x塔防游戏(保卫萝卜)从零开始(三)

    一.前提: 完成前一篇的内容. 具体参考:Cocos2d-x3.x塔防游戏(保卫萝卜)从零开始(二)篇 二.本篇目标: l  说说游戏中各种角色的动作.属性以及重构思路 l  进行代码重构让色狼大叔和 ...

  4. Cocos2d-x3.x塔防游戏(保卫萝卜)从零开始(二)

    一.前提: 完成前一篇的内容. 具体参考:Cocos2d-x3.x塔防游戏(保卫萝卜)从零开始(一)篇 二.本篇目标: l  说说关于cocos2dx手机分辨率适配 l  对前一篇完成的塔防游戏原型进 ...

  5. Cocos2d-x3.x塔防游戏(保卫萝卜)从零开始(一)

    一.前提: 完成Hello Game项目的创建编译. 具体参考:Cocos2dx.3x_Hello Game项目创建篇 二.本篇目标: l  说说关于塔防游戏的想法和思路 l  实现一个简单的塔防游戏 ...

  6. 三国塔防游戏android源码

    三国塔防游戏源码,这个游戏源码比较完整的,因为上传有20M限制,把代码工程包分开了,主文件是TFGame,其他res大家按照安卓包加进去就行,欢迎下载并交流 ,大家可以参考一下吧.<ignore ...

  7. HTML5塔防游戏——《三国塔防》 - Yorhom's Game Box

    h3{ font-size:20px; } HTML5塔防游戏--<三国塔防> 游戏介绍: <三国塔防>是一款基于HTML5和Javascript的2D塔防游戏.游戏中除了塔防 ...

  8. HTML5另类塔防游戏 -《三国战线》公布

    关于本作 游戏介绍 本游戏是一款另类塔防游戏.本作以三国这段历史为题材,提供了从颍川之战到官渡之战.官渡之战到夷陵之战.夷陵之战到五丈原之战等15个关卡.在每一个关卡中,你会控制一名三国武将与出现的敌 ...

  9. 使用Unity创建塔防游戏(Part2)

    How to Create a Tower Defense Game in Unity – Part 2 原文地址:https://www.raywenderlich.com/107529/unity ...

随机推荐

  1. java实现双端链表

    PS:双端链表(持有对最后一个节点的引用,允许表尾操作与表头操作等效的功能) public class DoubleLinkedList { //节点类 static class Node { pub ...

  2. cf D. Pair of Numbers

    http://codeforces.com/contest/359/problem/D 题意:给你n个数,然后找出在[l,r]中有一个数a[j],l<=j<=r,在[l,r]中的所有数都是 ...

  3. KEIL中的变量相关

    例:sfr P0=0x80表示P0口地址为80H:(sfr是字节操作) sfr16 T2=0xCC表示T2口地址的低地址为TL2=0XCC,高地址为TH2=0XCD(sfr16是字操作) 头文件reg ...

  4. 用keil怎么像makefile那样选择哪些文件进行编译?

    因为设备有多种不同的型号的硬件,所以就有不同的驱动,我想在编译的时候,像在linux下的makeile那样,自己写一个编译连接的东西,来控制我哪些文件进行编译链接,不知道在keil下有没有这样的方法. ...

  5. windows下的用户态调试的底层与上层实现

    操作系统:windows XP 调试器通过CreateProcess传入带有DEBUG_PROCESS和DEBUG_ONLY_THIS_PROCESS的dwCreationFlags创建被调试进程.这 ...

  6. poj 2229 Ultra-QuickSort(树状数组求逆序数)

    题目链接:http://poj.org/problem?id=2299 题目大意:给定n个数,要求这些数构成的逆序对的个数. 可以采用归并排序,也可以使用树状数组 可以把数一个个插入到树状数组中, 每 ...

  7. 【C++模版之旅】静态多态的讨论

    说到面向对象特性之一“多态”,以我的水平已经说不出太多新意了.相信很多程序员代码K多了,做梦都在“多态中”运行着.常规的多态是C++语义内置支持的一种特性,通过虚函数可以实现这个特性,为了后面以示区别 ...

  8. .net中将DataTable导出到word、Excel、txt、htm的方法

    dt:DataTable strFile:fileName strExt:type private void GridExport(DataTable dt, string strFile, stri ...

  9. HashSet的分析(转)

    一.  HashSet概述: HashSet实现Set接口,由哈希表(实际上是一个HashMap实例)支持.它不保证set 的迭代顺序:特别是它不保证该顺序恒久不变.此类允许使用null元素. 二.  ...

  10. Python进阶之路---1.4python数据类型-数字

    python入门基础 声明:以后python代码未注明情况下,默认使用python3.x版本 1.python代码基础:print     print('hello,python')   1.1pyt ...