从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坦克大战之地图编辑器相关推荐

  1. 【跟我一起学Unity3D】做一个2D的90坦克大战之AI系统

    对于AI,我的初始想法非常easy,首先他要能动,而且是在地图里面动. 懂得撞墙后转弯,然后懂得射击,其它的没有了,基于这个想法,我首先创建了一个MyTank类,用于管理玩家的坦克的活动,然后创建AI ...

  2. 用JAVA 做一个简易版的坦克大战(只实现基本功能)

    不太会写文章,只是为了记录自己做过的东西 文章目录 前言 一.大概思路 二.主要代码 1.Tank.java 2.Shot.java 3. Mypanel.java 4.Hero.java 5.Ene ...

  3. dx绘制2d图像_【教程】使用DX9做一个2D游戏(1)

    本文最先发表在贴吧,现在整理到此处,之后所有更新将在这里进行. by Chu @ XDU 2012/11/25 版权所有,禁止用于商业用途. 转载请注明出处. 用DX9做一个2D游戏显然不是一件容易的 ...

  4. Unity3D开发一个2D横版射击游戏

    教程基于http://pixelnest.io/tutorials/2d-game-unity/ , 这个例子感觉还是比较经典的, 网上转载的也比较多. 刚好最近也在学习U3D, 做的过程中自己又修改 ...

  5. php年月日滚动选择,Unity3d—做一个年月日选择器(Scroll Rect拖动效果优化)— 无限滚动 + 锁定元素...

    [导读]最近.....废话不多说上效果图用的是UGUI我先说思路通过判断元素的位置信息来改变Hierarchy的顺序 实现无限滚动改变位置的同时也要不断的调整Content的位置防止乱跳元素锁定就是直 ...

  6. Unity3d—做一个年月日选择器(Scroll Rect拖动效果优化)— 无限滚动 + 锁定元素...

    效果图 用的是UGUI 我先说思路 通过判断元素的位置信息来改变Hierarchy的顺序 实现无限滚动 改变位置的同时也要不断的调整Content的位置防止乱跳 元素锁定就是直接锁死的元素的移动范围 ...

  7. 做一个属于自己的坐标系的高德地图(GIS)

    第一步:创建node环境: 第二步:创建一个html文件 第三步:引入高德的样式和行为依赖 第四步:创建容器让地图挂载在上边 <div id="map"></di ...

  8. cocos2d-xna 写的一个小游戏demo坦克大战

    最近看到网上介绍cocos2d的资料很多,看了看cocos2d也支持wp7,下载了个 Cocos2d-XNA 安装包,写个小例子玩玩,熟悉下cocos2d 程序很简单,就一个入门级的小游戏,写完后放手 ...

  9. Unity 2D手游——坦克大战 C#

    需要下载项目的朋友,请打开CSDN链接:Unity2D坦克大战项目工程 本项目涉及到的功能: 1.UI部分: a .游戏开始界面UI       b.主场景UI      c.游戏胜利界面UI     ...

最新文章

  1. mac搭建python开发环境_Mac中基于Homebrew搭建python开发环境
  2. Linux图形分区编辑器 GParted Live 1.0 Beta 发布
  3. Windows Server 2003 系列之Exchange 2003部署
  4. c++11 模板的别名
  5. 【解决方案】“‘javac’不是内部或外部命令,也不是可运行的程序或批处理文件”
  6. what should you do at the new arrival of the place
  7. STM32F4 HAL库开发 -- SPI Flash
  8. Three.js入门
  9. python学习-数据类型(布尔、空值)
  10. android ndk怎样加载o文件_在Android中使用TFLite c++部署
  11. java   cxf实现webservice接口方式之不依赖spring
  12. Struts2项目搭建
  13. vue单页面html缓存问题,vue单页面 回退页面 keeplive 缓存问题
  14. 软件工程导论——第三章——需求分析
  15. mix2线刷开发板救砖_小米MIX2官方原厂系统rom线刷刷机包降级包下载8.10.25版
  16. 用python画皇冠_GitHub - crown-prince/Python_PoC: 一款python编写的Web安全检测PoCEXP框架...
  17. qt 富文本 html,Qt富文本编辑器QTextDocument
  18. AlGaN/GaN HEMT 富Si的双层SiN钝化层
  19. 三星BESPOKE家电系列海外发布会看点一览,定制化设计成未来家居首选
  20. 【python for finance】 Portfolio Optimization 投资组合优化

热门文章

  1. win10更改计算机dns,w10怎么修改电脑dns win10电脑修改dns的具体方法[多图]
  2. Nextcloud整合Aria2和AriaNg、Aria2 WebUI实现离线下载
  3. ATTCK v10版本战术介绍执行(下篇)
  4. 餐厅订座系统如何选?餐厅订座系统推荐
  5. oracle数据库向表中新增字段以及插入一行数据
  6. WPA2/WPA3混合与WPA3的hostapd配置区别
  7. if函数多个条件php,excelif函数的多个条件使用方法
  8. 【Insights直播】华为帐号服务,打造全场景安全帐号体系
  9. parted扩展磁盘分区(实践篇)
  10. 【系统运维-Linux】使用U盘安装Linux