【跟我一起学Unity3D】做一个2D的90坦克大战之地图编辑器
从10月20号到现在,Unity3D也学了10天了,对于Unity3D也有了一个大致的了解,有必要做一个小游戏来检测一下自己的学习成果了。经过两天的努力,终于总算是做出来了一个可以玩的坦克大战了。首先讲讲我的设计目标:
1.地图编辑器
2.道具系统
3.简单AI系统
4.计分器
其中,最重要的就是地图编辑器了,其次到AI系统,其他几个都挺简单的。
------------------------------------------------------------------------------------------------------------------------------------------
地图编辑器
我的想法是在编辑器中编辑好地图后,直接打开游戏就可以玩。这样的话,就需要一个文件来存储这些地图元素。鉴于xml在C#上支持非常好,简单易用,就选它了。
然后我们规定一下地图的格式,首先地图是由一个一个item组成的,原版的item有普通的墙,坚固的墙,水和草丛(德玛西亚)。为了方便读取,就用一个名字来规定他们,其次,由于我们是2D的场景,所以存入的坐标是x与y。最后得到的数据存储格式如下:
<item><name>gras</name><position_x>-1.2</position_x><position_y>-3</position_y></item>
整个文件大概是下面这样的结构:
<data><items><item><name>gras</name><position_x>-1.2</position_x><position_y>-3</position_y></item></items>
</data>
对应的文件存入的函数为:
bool SaveInXml(){if (File.Exists(m_sXmlPath)){File.Delete(m_sXmlPath);}XmlDocument xmlDoc = new XmlDocument();XmlElement data = xmlDoc.CreateElement("data");xmlDoc.AppendChild(data);//地图数据XmlElement xml_items = xmlDoc.CreateElement("items");data.AppendChild(xml_items);foreach (GameObject item in m_Items){Debug.Log("要保存的数据:" + item.name + "位置:" + item.transform.position.x + "," + item.transform.position.y);//save in xml fileXmlElement xml_item = xmlDoc.CreateElement("item");xml_items.AppendChild(xml_item);XmlElement name = xmlDoc.CreateElement("name");name.InnerText = item.name;xml_item.AppendChild(name);XmlElement position_x = xmlDoc.CreateElement("position_x");position_x.InnerText = item.transform.position.x.ToString();xml_item.AppendChild(position_x);XmlElement position_y = xmlDoc.CreateElement("position_y");position_y.InnerText = item.transform.position.y.ToString();xml_item.AppendChild(position_y);}xmlDoc.Save(m_sXmlPath);Debug.Log("创建XML完毕");m_Items.Clear();return true;}
然后就是对应的读取函数了(读取完直接实例化显示的):
void ReadMap(XmlNode xml_items){XmlNodeList items = xml_items.SelectNodes("item");foreach (XmlNode current_node in items){XmlNode current_name = current_node.SelectSingleNode("name");XmlNode position_x = current_node.SelectSingleNode("position_x");XmlNode position_y = current_node.SelectSingleNode("position_y");Vector3 psition = new Vector3(float.Parse(position_x.InnerText), float.Parse(position_y.InnerText), -1);if (current_name.InnerText == "wall"){m_readItem = Instantiate(m_ItemWall, psition, Quaternion.identity) as GameObject;}else if (current_name.InnerText == "gras"){m_readItem = Instantiate(m_ItemGras, psition, Quaternion.identity) as GameObject;}else if (current_name.InnerText == "steel"){m_readItem = Instantiate(m_ItemSteel, psition, Quaternion.identity) as GameObject;}else if (current_name.InnerText == "water"){m_readItem = Instantiate(m_ItemWater, psition, Quaternion.identity) as GameObject;}else continue;m_readItem.name = current_name.InnerText;Debug.Log("要读取的数据:" + m_readItem.name + "位置:" + m_readItem.transform.position.x + "," + m_readItem.transform.position.y);m_Items.Add(m_readItem);}}
这样,就完成了一个基本的地图编辑器的核心部分了,剩下的就是拖拽控件了。
关于拖拽控件,设计的想法是,地图的item在右边,然后点击item会复制一个点击到的item,然后可以拖拽这个复制出来的item到地图上,下面是实现代码:
void Update(){//检测鼠标左键的拾取 if (Input.GetMouseButtonDown(0)){//鼠标的屏幕坐标空间位置转射线 m_ray = Camera.main.ScreenPointToRay(Input.mousePosition);m_rayhit = Physics2D.GetRayIntersection(m_ray);//射线检测,相关检测信息保存到RaycastHit 结构中 if (m_rayhit){//打印射线碰撞到的对象的名称 Debug.Log(m_rayhit.collider.gameObject.name);if (m_rayhit.collider.gameObject.name == "walls" ||m_rayhit.collider.gameObject.name == "grass" ||m_rayhit.collider.gameObject.name == "steels" ||m_rayhit.collider.gameObject.name == "waters"){m_clickItem = Instantiate(m_rayhit.collider.gameObject, m_rayhit.collider.transform.position, Quaternion.identity) as GameObject;m_clickItem.name = m_rayhit.collider.gameObject.name.Substring(0, m_rayhit.collider.gameObject.name.Length - 1);//m_clickItem.tag = m_clickItem.name; //ERROR: not define tag in editorm_Items.Add(m_clickItem);}else if (m_rayhit.collider.gameObject.name == "wall" ||m_rayhit.collider.gameObject.name == "gras" ||m_rayhit.collider.gameObject.name == "steel" ||m_rayhit.collider.gameObject.name == "water"){m_clickItem = m_rayhit.collider.gameObject;}else{m_clickItem = null;}}else{m_clickItem = null;}}if (Input.GetMouseButton(0)){if (m_clickItem != null){m_clickItem.transform.position = SetPointInMap(new Vector3(camera.ScreenToWorldPoint(Input.mousePosition).x, camera.ScreenToWorldPoint(Input.mousePosition).y, -1));}}if (Input.GetMouseButtonUp(0)){if (m_clickItem != null){Vector3 cur_point = SetPointInMap(new Vector3(camera.ScreenToWorldPoint(Input.mousePosition).x, camera.ScreenToWorldPoint(Input.mousePosition).y, -1));if (m_Map.collider2D.OverlapPoint(cur_point)){m_clickItem.transform.position = cur_point;}else //在地图外就销毁掉{Destroy(m_clickItem);}}}}
这样,就完成了一个简单的地图编辑器的基本功能了。
项目源码:【跟我一起学Unity3D】做一个2D的90坦克大战之各种各样的墙<<附上项目源码>>
【跟我一起学Unity3D】做一个2D的90坦克大战之地图编辑器相关推荐
- 【跟我一起学Unity3D】做一个2D的90坦克大战之AI系统
对于AI,我的初始想法非常easy,首先他要能动,而且是在地图里面动. 懂得撞墙后转弯,然后懂得射击,其它的没有了,基于这个想法,我首先创建了一个MyTank类,用于管理玩家的坦克的活动,然后创建AI ...
- 用JAVA 做一个简易版的坦克大战(只实现基本功能)
不太会写文章,只是为了记录自己做过的东西 文章目录 前言 一.大概思路 二.主要代码 1.Tank.java 2.Shot.java 3. Mypanel.java 4.Hero.java 5.Ene ...
- dx绘制2d图像_【教程】使用DX9做一个2D游戏(1)
本文最先发表在贴吧,现在整理到此处,之后所有更新将在这里进行. by Chu @ XDU 2012/11/25 版权所有,禁止用于商业用途. 转载请注明出处. 用DX9做一个2D游戏显然不是一件容易的 ...
- Unity3D开发一个2D横版射击游戏
教程基于http://pixelnest.io/tutorials/2d-game-unity/ , 这个例子感觉还是比较经典的, 网上转载的也比较多. 刚好最近也在学习U3D, 做的过程中自己又修改 ...
- php年月日滚动选择,Unity3d—做一个年月日选择器(Scroll Rect拖动效果优化)— 无限滚动 + 锁定元素...
[导读]最近.....废话不多说上效果图用的是UGUI我先说思路通过判断元素的位置信息来改变Hierarchy的顺序 实现无限滚动改变位置的同时也要不断的调整Content的位置防止乱跳元素锁定就是直 ...
- Unity3d—做一个年月日选择器(Scroll Rect拖动效果优化)— 无限滚动 + 锁定元素...
效果图 用的是UGUI 我先说思路 通过判断元素的位置信息来改变Hierarchy的顺序 实现无限滚动 改变位置的同时也要不断的调整Content的位置防止乱跳 元素锁定就是直接锁死的元素的移动范围 ...
- 做一个属于自己的坐标系的高德地图(GIS)
第一步:创建node环境: 第二步:创建一个html文件 第三步:引入高德的样式和行为依赖 第四步:创建容器让地图挂载在上边 <div id="map"></di ...
- cocos2d-xna 写的一个小游戏demo坦克大战
最近看到网上介绍cocos2d的资料很多,看了看cocos2d也支持wp7,下载了个 Cocos2d-XNA 安装包,写个小例子玩玩,熟悉下cocos2d 程序很简单,就一个入门级的小游戏,写完后放手 ...
- Unity 2D手游——坦克大战 C#
需要下载项目的朋友,请打开CSDN链接:Unity2D坦克大战项目工程 本项目涉及到的功能: 1.UI部分: a .游戏开始界面UI b.主场景UI c.游戏胜利界面UI ...
最新文章
- mac搭建python开发环境_Mac中基于Homebrew搭建python开发环境
- Linux图形分区编辑器 GParted Live 1.0 Beta 发布
- Windows Server 2003 系列之Exchange 2003部署
- c++11 模板的别名
- 【解决方案】“‘javac’不是内部或外部命令,也不是可运行的程序或批处理文件”
- what should you do at the new arrival of the place
- STM32F4 HAL库开发 -- SPI Flash
- Three.js入门
- python学习-数据类型(布尔、空值)
- android ndk怎样加载o文件_在Android中使用TFLite c++部署
- java cxf实现webservice接口方式之不依赖spring
- Struts2项目搭建
- vue单页面html缓存问题,vue单页面 回退页面 keeplive 缓存问题
- 软件工程导论——第三章——需求分析
- mix2线刷开发板救砖_小米MIX2官方原厂系统rom线刷刷机包降级包下载8.10.25版
- 用python画皇冠_GitHub - crown-prince/Python_PoC: 一款python编写的Web安全检测PoCEXP框架...
- qt 富文本 html,Qt富文本编辑器QTextDocument
- AlGaN/GaN HEMT 富Si的双层SiN钝化层
- 三星BESPOKE家电系列海外发布会看点一览,定制化设计成未来家居首选
- 【python for finance】 Portfolio Optimization 投资组合优化
热门文章
- win10更改计算机dns,w10怎么修改电脑dns win10电脑修改dns的具体方法[多图]
- Nextcloud整合Aria2和AriaNg、Aria2 WebUI实现离线下载
- ATTCK v10版本战术介绍执行(下篇)
- 餐厅订座系统如何选?餐厅订座系统推荐
- oracle数据库向表中新增字段以及插入一行数据
- WPA2/WPA3混合与WPA3的hostapd配置区别
- if函数多个条件php,excelif函数的多个条件使用方法
- 【Insights直播】华为帐号服务,打造全场景安全帐号体系
- parted扩展磁盘分区(实践篇)
- 【系统运维-Linux】使用U盘安装Linux