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标签进行查找的,如果用的不是标签查找,记得更换查找方式。
Gizmos绘制塔防游戏网格的更多相关文章
- [译]终极塔防——运用HTML5从头创建一个塔防游戏
翻译共享一篇CodeProject的高星力作,原文地址:http://www.codeproject.com/Articles/737238/Ultimate-Tower-Defense 下载演示项目 ...
- 制作一个塔防游戏 Cocos2d-x 2.1.4 (一)
在这篇文章,将会学习到怎样制作一个塔防游戏.在这其中,学习怎样在设定的时间内出现一波波的敌人,使这些敌人沿着指定的路点前进.怎样在地图上指定的位置创建炮塔.怎样使炮塔射击敌人,怎样可视化调试路点和炮塔 ...
- Cocos2d-x3.x塔防游戏(保卫萝卜)从零开始(三)
一.前提: 完成前一篇的内容. 具体参考:Cocos2d-x3.x塔防游戏(保卫萝卜)从零开始(二)篇 二.本篇目标: l 说说游戏中各种角色的动作.属性以及重构思路 l 进行代码重构让色狼大叔和 ...
- Cocos2d-x3.x塔防游戏(保卫萝卜)从零开始(二)
一.前提: 完成前一篇的内容. 具体参考:Cocos2d-x3.x塔防游戏(保卫萝卜)从零开始(一)篇 二.本篇目标: l 说说关于cocos2dx手机分辨率适配 l 对前一篇完成的塔防游戏原型进 ...
- Cocos2d-x3.x塔防游戏(保卫萝卜)从零开始(一)
一.前提: 完成Hello Game项目的创建编译. 具体参考:Cocos2dx.3x_Hello Game项目创建篇 二.本篇目标: l 说说关于塔防游戏的想法和思路 l 实现一个简单的塔防游戏 ...
- 三国塔防游戏android源码
三国塔防游戏源码,这个游戏源码比较完整的,因为上传有20M限制,把代码工程包分开了,主文件是TFGame,其他res大家按照安卓包加进去就行,欢迎下载并交流 ,大家可以参考一下吧.<ignore ...
- HTML5塔防游戏——《三国塔防》 - Yorhom's Game Box
h3{ font-size:20px; } HTML5塔防游戏--<三国塔防> 游戏介绍: <三国塔防>是一款基于HTML5和Javascript的2D塔防游戏.游戏中除了塔防 ...
- HTML5另类塔防游戏 -《三国战线》公布
关于本作 游戏介绍 本游戏是一款另类塔防游戏.本作以三国这段历史为题材,提供了从颍川之战到官渡之战.官渡之战到夷陵之战.夷陵之战到五丈原之战等15个关卡.在每一个关卡中,你会控制一名三国武将与出现的敌 ...
- 使用Unity创建塔防游戏(Part2)
How to Create a Tower Defense Game in Unity – Part 2 原文地址:https://www.raywenderlich.com/107529/unity ...
随机推荐
- KEIL段协定
段名转换 Cx51编译器生成的目标代码(程序代码.程序数据和常数数据)保存在代码段或数据段中,一个段可以是可重定位的或绝对的,每个可重定位段有一个类型和一个名称.本节说明Cx51编译器命名这些段的惯例 ...
- spring注解方式 idea报could not autowire,eclipse却没有问题
解决办法1: 从根本上解决: File-Project Structure 页面 Facets下删掉 Spring(直接右键Delete) 这个解答是对的.并不会降低安全性!!因为创建项目的时候,都是 ...
- linux下的shell和脚本
1.各种Unix shell linux下的shell基本是从unix环境中的shell发展而来,贴一下wiki:其中我们常用的,可归类为Bourne Shell(/usr/bin/sh或/bin/s ...
- 【转】深入理解Android的startservice和bindservice--不错
原文网址:http://www.cnblogs.com/yejiurui/p/3429451.html 一.首先,让我们确认下什么是service? service就是android系 ...
- Android 使用HorizontalScrollView 实现Gallery效果
Gallery(画廊)是一个锁定中心条目并且拥有水平滚动列表的视图,一般用来浏览图片,并且可以响应事件显示信息:Gallery还可以和ImageSwitcher组件结合使用来实现一个通过缩略图来浏览图 ...
- VMWare 虚拟机
http://pan.baidu.com/share/link?shareid=5873&uk=941708466 VMWare是虚拟化解决方案厂商,旗下有多款虚拟机软件产品,其中最知名的要数 ...
- 免费 Bootstrap 管理后台模块下载
在这文章中我们将分享17+个最好的免费 Bootstrap 管理模板.你可以免费下载这些Twitter bootstrap 框架来开发网站后台. SB Admin 2 SB Admin is a fr ...
- python高级编程:有用的设计模式2
# -*- coding: utf-8 -*- __author__ = 'Administrator' #python高级编程:有用的设计模式 #代理 """ 代理对一 ...
- 【ArcGIS 10.2新特性】ArcGIS Online新特性(上)
概述 7月,ArcGIS Online发布了很多更新.主要内容有:新的网站设计,增强了Web制图,数据分析,应用程序创建,以及机构管理等功能. 更新的大致内容总结如下: 地图查看器:新的分析工具.获取 ...
- Canvas制作排序算法演示动画
tips: 形象化演示排序算法可以让初学者快速理解,比较好的例子:jun-lu的SortAnimate,旧金山大学的David Galles教授的算法演示课件.最近在看canvas,试着用js+can ...