<a target=_blank href="http://weibo.com/DoubleIris">微博@卷毛的呈秀波</a>

上回我们已经建立了游戏中的基本要素,这回我们要建立一个交互界面。

作为一个塔防游戏,他的互动要素有以下

  1. 点击按钮
  2. 在空地放置炮台

简言之就是操作界面的建立。

UI界面

我们来想一下UI界面的要素

  1. 按下按钮之后可以创建炮台
  2. 能在怪物的移动轨道之外建立炮台

伪代码可以写成

if(buttonpressed == TRUE)Tower.Render.enabled = true;
if(Tower.Render.enabled == true){if(mousecontact.Object != path&&!=tower){createTower(Pos(mouse.position));Tower.Rander.enabled = false;
}
}

前期工作

要完成这两个功能,我们需要了解几个函数

Object.Instantiate()

这个函数是不是很眼熟,没错,这就是上一篇中我们用来复制Monster 的克隆函数,具体细则参照上一篇。

这个函数用来获取鼠标按键的返回消息,参数分别对应左右中键。

这个函数用于生成GUI界面的按钮,返回按钮是否被按下。一共有六个重载,挑选自己所需要的使用就好

用来返回射线是否触碰到物体

不太懂没关系,接下来我们将会实际使用到。

首先将我们上次在场景中创建的Tower隐藏或者移除。

逻辑1

于Project-》Script下新建一个脚本,名为createtower 。

首先我们要绘制GUI按钮,在MonoBehavior中添加如下代码

void OnGUI()
{if(GUI.Button(new Rect(0,0,64,64),"点击这里”))Debug.Log("click");
}

将它挂载到Main Camera上
点击播放,可以看见下图

左上角出现了按钮,并且点击之后consle会输出信息“click”

这里就要了解OnGUI这个过程了,他是专门用来绘制GUI可见对象的一个函数。我们使用GUI。Button生成的按钮在这里会被调用。具体说明请戳我

而在这里我们需要做的事情是,按下按钮后,进入可以放置炮台的状态。所以我们要新建一个bool 类型的变量用来管理状态。

bool isCreate = false;//默认关闭

然后修改我们的OnGUI

void OnGUI(){if(GUI.Button(new Rect(0,0,64,64),"点击这里"))isCreate = true;if (isCreate == true){GUI.Button(new Rect(Input.mousePosition.x - 32, Screen.height - Input.mousePosition.y - 32, 64, 64), "这里是模型");Debug.Log("Click");}}

在这里我们又生成了一个实时跟随鼠标的GUIButton,用来告诉玩家当前处于可以创建炮台的状况= =因为我没模型所以用了String来代替。

检查一下效果

逻辑2

现在我们拥有了可以操作的按钮但是还是不能生成炮台。

生成炮台需要两个判断

  1. 是否处于可以创建炮台的模式下
  2. 鼠标点击的地方是不是path

第一个判断我们已经使用bool变量来存储了,现在要解决第二个判断。这个就要用到之前出现的两个函数Raycast和GetMBDown。

声明两个变量,Ray,和RayHit用于Raycast的调用

public Ray distance;

public RaycastHit hit;

还要声明一个gameObject类,用来挂载Tower

然后在Update中添加下列代码

void Update () {distance = camera.ScreenPointToRay(Input.mousePosition);//获取从摄像机的投影平面向鼠标位置发射的射线if (isCreate == true)//前提需要能够创建炮台{if (Physics.Raycast(distance, out hit))//如果射线触碰到了物体{if (hit.collider.tag != "path")//前提2不是怪物的路径{   if (Input.GetMouseButtonDown(0) && hit.collider.name != "Tower")//按下左键切鼠标触碰到的碰撞体不是塔               {Object.Instantiate(mTower, hit.collider.transform.position, Quaternion.identity);isCreate = false;//把炮台复制过来,并且关闭可以创建的状态}}}}}

然后运行一下

如果你和我的设置一样会发下有两个个问题

  1. 创建的炮塔都重复在中间,并且一个叠加在另一个上面
  2. 炮台下沉在地面之下

第二个问题很简单,因为我们的圆柱本来就要上升0.5个单位,所以在Instantiate (的transform后面加Vec(0,0.5,0))就能够让炮台准确的在地面上浮现了。

第一个问题好像完全不符合情理,我们已经在代码中做了判定,却依旧能够在炮塔身上建立炮台?

这个问题我们需要深究一下。

重新看我们的代码:

if (Input.GetMouseButtonDown(0) && hit.collider.name != "Tower")             

我们可以看见我们所做的判断是判定射线触碰到的物体名字是否为Tower,但是实际观察一下我们的组件栏

他的名字是Tower(Clone)!!!  你是不是完全没有在意!

再看另一行代码

 Object.Instantiate(mTower, hit.collider.transform.position, Quaternion.identity);

这行代码将我们的炮台复制到的地方是射线触碰到物体的位置(中心),这不符合常理,因为地面是一个物体,我们不可能将所有炮台都建立在地面中心。

关于这一点我们有两种解决方案:

  1. 在地图上建立一个个炮架,这样炮台就会建立在炮架上。
  2. 把炮台的复制位置换成射线触碰的点。

在这里,加入选用第一种方案的话,势必就要再给炮架添加一个判断脚本,太繁琐所以我们直接将hit.collider.transform.position改变成hit.point.position.

最后我们的代码长成这个样子

void Update () {distance = camera.ScreenPointToRay(Input.mousePosition);if (isCreate == true){if (Physics.Raycast(distance, out hit)){if (hit.collider.tag != "path"){{   //getMouseDown(x) :x=0,left button;1,right button;2,middle button)if (Input.GetMouseButtonDown(0) && hit.collider.name != "Tower(Clone)"){Object.Instantiate(mTower, hit.point + new Vector3(0f, 0.5f, 0f), Quaternion.identity);isCreate = false;Debug.Log(hit.point );Debug.Log(hit.collider.name);}}}}}}

然后你就能看见下图

耶,我们的塔防游戏又完善了一步。

ps,笔者杂谈

最近由于各种琐碎的事情,导致上周的教程完全没有更新,今天突然有一个读者咨询我教程,感觉自己的努力也是有回报的。

于是登陆了CSDN,看见还给我的博客颁发了持之以恒的徽章。顿时觉得只要你们能从笔者的简陋教程中获取一些知识,笔者再辛苦也是值得的。

我是妖哲,明天见~

U3D DotH教程2相关推荐

  1. U3d官方教程——2D UFO

    原教程地址https://unity3d.com/cn/learn/tutorials/s/2d-ufo-tutorial 这篇教程将会带你制作一个简单的2DUFO游戏,从而使你了解到许多关于unit ...

  2. UNITY3D 动作游戏开发教程《怪物猎人》

    这期我们开发动作游戏,参考作品是<怪物猎人> 目前更新中,大家可以催更,以便加快进度 视频版:点击进入 Unity3D 动作游戏开发教程<怪物猎人 崛起> 需要一组动作素材导入 ...

  3. U3D如何添加IOS内购,自制内购小插件

    参考资料:http://www.cocoachina.com/bbs/read.php?tid-69165-fpage-2.html 网上很多IAP的教程,但是较少有结合U3D的教程.所以我在此进行简 ...

  4. railgun项目的不足和将来会逐步新增的模块

    问答: Q:这个框架适合做什么类型的游戏? A:适合棋牌类.卡牌类(炉石传说).回合制(梦幻西游).半回合制(阴阳师).暂时不适合即时类游戏(星际争霸.DOTA.LOL.CS) 不足: 1.数据库操作 ...

  5. 2014-Unity3d基础入门到高级全套全系列视频教程

    加入QQ群302040480或加QQ2521238762,免费索取教程 2014-Unity3d基础入门到高级全套全系列视频教程下载: 1.Unity游戏大鬼战斗制作视频教程 2.游戏蛮牛 第二季 U ...

  6. 大屏数据可视化 B端UI设计后台PC网页UI设计U3D+可视化落地教程

    近年来,数据可视化是一个热度比较高的词,数据可视化大屏投放的需求也越来越多. 数据可视化是指将数据以视觉形式来呈现,如图表或地图,以帮助人们了解这些数据的意义. 数据可视化大屏是当前可视化领域的一项热 ...

  7. 逆向教程-游戏中的U3D付费模式分析

    转载请把我博客地址带上:http://blog.csdn.net/sarkozy2014.么么哒 今天xx游戏的时候发现一款在U3D中的支付验证 原软件地址:http://www.yxdown.com ...

  8. u3d 动态 随机 地图_我的世界1.12.2模组教程:VoxelMap小地图新老玩家辅助神器

    大家好,我是小茶,这篇教程给大家带来的是VoxelMap小地图模组的介绍,玩过我的世界的朋友都会觉得有一些不方便的地方,比如: 如何在我的世界里面辨别方向? 如何知道我所处的地形附近有什么建筑? 如何 ...

  9. 不错的U3D第一人称射击类游戏教程

    https://blog.csdn.net/qq_26621551/article/details/52092635

最新文章

  1. VMware View 5.0从菜鸟到高手系列 10 –远程图形工作站配置篇
  2. 求均值方差_协方差,方差,标准差
  3. 如何从字符串中删除最后一个字符?
  4. [css] 当页面采用rem布局时,如何解决用户设置字体大小造成的页面布局错位?
  5. Elasticsearch的倒排索引是什么?
  6. struts2 global-results
  7. 2.13.PHP7.1 狐教程-【PHP 类】
  8. 【深度学习】之Caffe的solver文件配置(转载自csdn)
  9. C语言输出图形:宝塔形(三角形)回文数字。即:第一行1,第二行121,第三行12321……
  10. 求101到150之间的质数
  11. CodeForces - 863B-Kayaking(暴力)
  12. hud 4415 Assassin’s Creed
  13. 怎样将蓝底照片换成白底
  14. 复盘 2019 ,展望 2020
  15. 哈佛结构和冯诺依曼结构?STM32属于哈佛结构还是冯诺依曼结构?
  16. 包装设计实战案例教学
  17. (翻译)“用户名或电子邮件地址”字段能降低账号登录锁定
  18. 数字逻辑课程设计#Quartus II
  19. python3判断字典中的key是否存在_python3判断key存在字典中的方法是什么
  20. jQuery 操作整理

热门文章

  1. 190403内置模块
  2. maya镜像模型但不改变点序 对称操作
  3. python列表前加星号是什么_Python中的星号:用途及使用方法(1)
  4. 宽带服务器盒信号灯红色闪烁,光纤灯红色闪烁怎么解决(图文)
  5. 360极速浏览器审查模式保存图片
  6. Pygame:播放声音和音效
  7. java将小写数字变成大写输出
  8. 计算机英语句子及翻译,简单的常用英语句子带翻译
  9. solidworks显示无法连接到服务器,SOLIDWORKS Electrical解决方法:无法连接协同服务器...
  10. Transformer Architectures and Pre-training Strategies for Fast and Accurate Multi-sentence Scoring