U3D DotH教程2
<a target=_blank href="http://weibo.com/DoubleIris">微博@卷毛的呈秀波</a>
上回我们已经建立了游戏中的基本要素,这回我们要建立一个交互界面。
作为一个塔防游戏,他的互动要素有以下
- 点击按钮
- 在空地放置炮台
简言之就是操作界面的建立。
UI界面
我们来想一下UI界面的要素
- 按下按钮之后可以创建炮台
- 能在怪物的移动轨道之外建立炮台
伪代码可以写成
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
现在我们拥有了可以操作的按钮但是还是不能生成炮台。
生成炮台需要两个判断
- 是否处于可以创建炮台的模式下
- 鼠标点击的地方是不是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;//把炮台复制过来,并且关闭可以创建的状态}}}}}
然后运行一下
如果你和我的设置一样会发下有两个个问题
- 创建的炮塔都重复在中间,并且一个叠加在另一个上面
- 炮台下沉在地面之下
第二个问题很简单,因为我们的圆柱本来就要上升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);
这行代码将我们的炮台复制到的地方是射线触碰到物体的位置(中心),这不符合常理,因为地面是一个物体,我们不可能将所有炮台都建立在地面中心。
关于这一点我们有两种解决方案:
- 在地图上建立一个个炮架,这样炮台就会建立在炮架上。
- 把炮台的复制位置换成射线触碰的点。
在这里,加入选用第一种方案的话,势必就要再给炮架添加一个判断脚本,太繁琐所以我们直接将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相关推荐
- U3d官方教程——2D UFO
原教程地址https://unity3d.com/cn/learn/tutorials/s/2d-ufo-tutorial 这篇教程将会带你制作一个简单的2DUFO游戏,从而使你了解到许多关于unit ...
- UNITY3D 动作游戏开发教程《怪物猎人》
这期我们开发动作游戏,参考作品是<怪物猎人> 目前更新中,大家可以催更,以便加快进度 视频版:点击进入 Unity3D 动作游戏开发教程<怪物猎人 崛起> 需要一组动作素材导入 ...
- U3D如何添加IOS内购,自制内购小插件
参考资料:http://www.cocoachina.com/bbs/read.php?tid-69165-fpage-2.html 网上很多IAP的教程,但是较少有结合U3D的教程.所以我在此进行简 ...
- railgun项目的不足和将来会逐步新增的模块
问答: Q:这个框架适合做什么类型的游戏? A:适合棋牌类.卡牌类(炉石传说).回合制(梦幻西游).半回合制(阴阳师).暂时不适合即时类游戏(星际争霸.DOTA.LOL.CS) 不足: 1.数据库操作 ...
- 2014-Unity3d基础入门到高级全套全系列视频教程
加入QQ群302040480或加QQ2521238762,免费索取教程 2014-Unity3d基础入门到高级全套全系列视频教程下载: 1.Unity游戏大鬼战斗制作视频教程 2.游戏蛮牛 第二季 U ...
- 大屏数据可视化 B端UI设计后台PC网页UI设计U3D+可视化落地教程
近年来,数据可视化是一个热度比较高的词,数据可视化大屏投放的需求也越来越多. 数据可视化是指将数据以视觉形式来呈现,如图表或地图,以帮助人们了解这些数据的意义. 数据可视化大屏是当前可视化领域的一项热 ...
- 逆向教程-游戏中的U3D付费模式分析
转载请把我博客地址带上:http://blog.csdn.net/sarkozy2014.么么哒 今天xx游戏的时候发现一款在U3D中的支付验证 原软件地址:http://www.yxdown.com ...
- u3d 动态 随机 地图_我的世界1.12.2模组教程:VoxelMap小地图新老玩家辅助神器
大家好,我是小茶,这篇教程给大家带来的是VoxelMap小地图模组的介绍,玩过我的世界的朋友都会觉得有一些不方便的地方,比如: 如何在我的世界里面辨别方向? 如何知道我所处的地形附近有什么建筑? 如何 ...
- 不错的U3D第一人称射击类游戏教程
https://blog.csdn.net/qq_26621551/article/details/52092635
最新文章
- VMware View 5.0从菜鸟到高手系列 10 –远程图形工作站配置篇
- 求均值方差_协方差,方差,标准差
- 如何从字符串中删除最后一个字符?
- [css] 当页面采用rem布局时,如何解决用户设置字体大小造成的页面布局错位?
- Elasticsearch的倒排索引是什么?
- struts2 global-results
- 2.13.PHP7.1 狐教程-【PHP 类】
- 【深度学习】之Caffe的solver文件配置(转载自csdn)
- C语言输出图形:宝塔形(三角形)回文数字。即:第一行1,第二行121,第三行12321……
- 求101到150之间的质数
- CodeForces - 863B-Kayaking(暴力)
- hud 4415 Assassin’s Creed
- 怎样将蓝底照片换成白底
- 复盘 2019 ,展望 2020
- 哈佛结构和冯诺依曼结构?STM32属于哈佛结构还是冯诺依曼结构?
- 包装设计实战案例教学
- (翻译)“用户名或电子邮件地址”字段能降低账号登录锁定
- 数字逻辑课程设计#Quartus II
- python3判断字典中的key是否存在_python3判断key存在字典中的方法是什么
- jQuery 操作整理
热门文章
- 190403内置模块
- maya镜像模型但不改变点序 对称操作
- python列表前加星号是什么_Python中的星号:用途及使用方法(1)
- 宽带服务器盒信号灯红色闪烁,光纤灯红色闪烁怎么解决(图文)
- 360极速浏览器审查模式保存图片
- Pygame:播放声音和音效
- java将小写数字变成大写输出
- 计算机英语句子及翻译,简单的常用英语句子带翻译
- solidworks显示无法连接到服务器,SOLIDWORKS Electrical解决方法:无法连接协同服务器...
- Transformer Architectures and Pre-training Strategies for Fast and Accurate Multi-sentence Scoring