Skip to main content
ARShow
ARShow
 首页 » 资源教程

[UE4虚幻引擎教程]-004-蓝图的使用:样板间系列

2016年08月27日 15:26:3659600

好了,终于摆脱了前两章比较无聊的东西了,来一起搞点不那么无聊的东西(虽然还是很无聊……)

学习本章呢你至少得知道蓝图怎么拉吧……基本的组件能认识了吧……其他的就边做边认识就行了。

蓝图指南:https://docs.unrealengine.com/latest/CHN/Engine/Blueprints/UserGuide/index.html

下面先来看动图,看看都哪些功能:

http://note.youdao.com/yws/public/resource/6fa261045f84b7ce890c111594c0629d/03176DE857464C7E8B195EB80572EDBC

基础功能:自动门,开关门,开关灯,蓝图接口,HUD显示,换材质,放电视(媒体材质)扩展功能:昼夜变换,射线拾取,射线移动位置,射线放置物体,存储配置,3D位置编辑,引导机器人

先这些吧,后面想到了再加,而且这篇估计就讲下基础功能了,扩展功能也得开新篇了。

有人问我学多久UE能做上面这些,我只想说……我特么总共使用UE的时间不超过两个月……

这种功能,看一眼效果马上就能知道怎么实现了好嘛……

所以先去过一遍文档,别扯那些有的没的。好废话不多说,直接上功能:

自动门:

前置技术:时间轴:https://docs.unrealengine.com/latest/CHN/Engine/Blueprints/UserGuide/Timelines/index.html

这个时间轴是什么呢?你就当简单的曲线,根据曲线输出值就就行了,注意文档下方的实例,看懂了就别看我写的废话了。首先打开我们之前的工程,确认存在StarterContent这个文件夹(神马?没有?!回头自己看教程去少了啥!)然后创建一个Components的文件夹用于放杂物……再创建一个Actor,起名为BP_AutoDoor,注意良好的命名习惯有利于装逼。然后再给Actor添加门框和门板,注意看图:[UE4虚幻引擎教程]-004-蓝图的使用:样板间系列 资源教程 第1张你以为就完了么?再加个碰撞盒,记得调大小,话说谁能告诉我为毛我这个版本的自带内容和以前的不一样了……[UE4虚幻引擎教程]-004-蓝图的使用:样板间系列 资源教程 第2张然后接下来就是关键部分啦!动图有点长,要有耐心!没耐心的可以看图,创建了一个时间轴组件,长度设置为1秒,起始位置为0,起始值0,结束位置为1,结束值为1,线形设置为自动,这样输出的结果就是一个平滑的0-1的值[UE4虚幻引擎教程]-004-蓝图的使用:样板间系列 资源教程 第3张然后通过选择碰撞盒,添加碰撞事件,进入时播放时间轴,退出时延迟2秒反向播放时间轴,再创建一个OpenAngle的参数,用于设置开门的角度,-120表示向内开120°,将该值和时间轴输出的值相乘,即可得到一个平滑的0-120的值,将这个值设置为门板的Z轴旋转角度,即可实现开关门动画[UE4虚幻引擎教程]-004-蓝图的使用:样板间系列 资源教程 第4张射线碰撞前排看文档啦:在蓝图中使用Raycasts(Tracing):https://docs.unrealengine.com/latest/CHN/Gameplay/HowTo/UseRaycasts/Blueprints/index.html总之呢,就是相当于你拿个激光笔在指指点点就行了。所以我们打开之前创建好的character,在函数一栏点击加号新建一个函数,起名为RayCheck,然后在打开的函数界面里拖出LineTraceByChannel,这就是射线节点,大家都知道两点确定一条直线,那么就把摄像机的世界坐标设为起点,然后获得相机的前方向量,再加上一个长度,这里我创建了一个RayLength的变量方便设置长度,默认为200,最后因为得出的位置是相对位置,所以千万记得将算出的位置加上开始的相机位置,然后将之设为射线的终点,再将射线输出的hit信息break出来,这里我只用到actor,于是就在函数的输出上新建了一个actor的输出。于是就完成了射线碰撞检测。[UE4虚幻引擎教程]-004-蓝图的使用:样板间系列 资源教程 第5张然后我们该怎么使用呢?很简单,上节教程末尾不是创建了个Interact么?就用它来做交互!打开PlayerController,删掉print,然后在蓝图上右键创建GetControllered Pawn,这个节点用于获取当前受到Controller控制的pawn,但是获取到的pawn是基础的pawn,我们需要通过类型转换为我们自己的pawn,这样才能获取到之前定义的RayCheck函数,然后将取到的actor名字print一下就可以了。[UE4虚幻引擎教程]-004-蓝图的使用:样板间系列 资源教程 第6张[UE4虚幻引擎教程]-004-蓝图的使用:样板间系列 资源教程 第7张最后运行起来看下效果,凑近物体狂按F,物体名字就会在左上角显示了。[UE4虚幻引擎教程]-004-蓝图的使用:样板间系列 资源教程 第8张开关门当我们完成射线的时候,就能获取到物体了,那么我们是不是就能直接调用物体本身自带的函数呢?这就是开门的思路,将之前创建的自动门蓝图复制一份,重命名为BP_NormalDoor,然后删除碰撞盒和碰撞事件,右键蓝图,创建一个新的自定义事件,起名为OpenDoor,再加上Flip,这个节点的意思是第一次触发执行A,第二次执行B,第三次A,循环往复,这样就实现了开门关门。[UE4虚幻引擎教程]-004-蓝图的使用:样板间系列 资源教程 第9张那如何来触发这个开门的事件呢?打开controller,删除之前的print,将Hit Actor转换为BP_NormalDoor,然后拖出openDoor事件就可进行射线触发了。[UE4虚幻引擎教程]-004-蓝图的使用:样板间系列 资源教程 第10张然后这里有个小坑,实际上门板的碰撞盒是有问题的,所以我们需要在门板下创建一个cube来做碰撞检测,然后再勾选Hildren in Game ,这样场景中运行的时候就看不到cube了,再将门拖如场景,运行看看,狂按F就能开关门了。(所以前面的自动门就是个样子货哇哈哈哈哈)开关灯开关灯也很简单,主要是给灯的模型加个灯光,然后setVisibility就行,记得把controller里射线的调用修改成OpenLight哟。搞到这里细心的朋友会发现,还有,我射线返回不带交互事件的蓝图,为什么就不报错了?为毛都是交互,非得把类型改来改去的,能不能用一个事件解决所有的交互?前方高能!前方高能!前方高能!蓝图接口前排上文档:https://docs.unrealengine.com/latest/CHN/Engine/Blueprints/UserGuide/Types/Interface/index.html这玩意我举个栗子吧,你控制个角色拿着AK突突突,打到人了人掉血,打到树了树掉树叶。这两个事件都有同一个事件入口:被打,而掉血和掉树叶则是被打这个接口的具体实现,所以我们只要给人和树定义一个共同的接口,然后去调用,此时触发这个事件,人掉血,树掉树叶,Do you understand?没事来看例子:新建一个蓝图接口,会自动创建一个默认函数,改名为DoInteract,然后打开之前创建的BP_NormalDoor,点击上访的类设置,在右边的蓝图接口里添加创建好的蓝图接口,BP_Interact,此时记得点编译,然后在蓝图中调用DoInteract事件来对OpenDoor事件进行触发,灯也是如此,然后回到controller,删除之前创建的类型转换,然后直接调用DoInteract消息,此时再运行场景,发现门和灯都能同时触发了,是不是很简单呢?其实这些都是OOP的思想啊……蓝图这种可视化编辑是很方便的,但是还是要用编程的思维来进行维护,不然后期项目拖成一团乱麻谁也搞不定的。多媒体材质 电视机文档看这里:https://docs.unrealengine.com/latest/CHN/Engine/MediaFramework/index.htmland 这里:https://docs.unrealengine.com/latest/CHN/Engine/MediaFramework/index.html#mediaframeworkwithblueprints很多搞样板间的喜欢搞个电视什么的放,不过想来大家都不会在意警告吧~~~[UE4虚幻引擎教程]-004-蓝图的使用:样板间系列 资源教程 第11张反正呢就是个通过路径或者地址访问媒体然后在材质上渲染的鬼东西,来看看怎么玩。首先在根目录创建一个Movies文件夹,必须是根目录哟,官网说了:为正确打包,本地媒体文件必须放置在项目的 Content/Movies/ 目录中。然后丢个随便什么.AVI进去(不要问我要种子!我才不会有呢)此时会自动创建一个媒体材质,双击打开,能看到个快(速)播(放器),点击Play就能看了[UE4虚幻引擎教程]-004-蓝图的使用:样板间系列 资源教程 第12张然后在这个媒体材质上右键点击创建Create Media Texture,然后再在新创建出来的贴图上右键创建为材质,再给场景里拖个超大的cube,丢上材质,打开最开始的媒体材质,点击播放器上的播放,然后就能见到酷炫的电视墙了。然后正儿八经的创建一个带碰撞盒的电视墙,性质就跟自动门一样,碰到就调用媒体材质的Play函数,退出就调用Pause,电视墙就辣么简单!啊!差点忘记说了,这里我给电视蓝图创建了一个媒体材质类型的变量,然后丢给电视机,然后音频材质需要单独创建,和之前创建视频材质一样右键原始的媒体材质create Media Sound wave,然后给电视加上Audio组件设置Sound为之前创建的音频材质就行。比如酷炫的双声道超大电视:[UE4虚幻引擎教程]-004-蓝图的使用:样板间系列 资源教程 第13张警告!这里有个Close函数,不知为毛关了就不能再播放了,也不知是我设置没对还是本身就是BUG……[UE4虚幻引擎教程]-004-蓝图的使用:样板间系列 资源教程 第14张HUD显示准心其实这里应该跟着射线检测讲的……就是在射线的起点画个准心方便看,当然你也可以拿来显示个血条名字等等之类的。文档来啦:https://docs.unrealengine.com/latest/CHN/Resources/ContentExamples/Blueprints_HUD/1_1/index.html首先创建一个蓝图,类型选择HUD,然后在世界设置中设置HUD为我们新创建的HUD,然后打开HUD蓝图,删除默认事件,创建Receive Draw HUD事件,该事件会在HUD被绘制的时候调用,然后拖出一个Draw Text,注意此处的类型应该是HUD,另一个暂时我们不需要会,然后在Text里写个+号,颜色设为红色,大小设为2,这样看上去就比较像个准心了,然后因为我们射线的起点是摄像机的位置向前的向量,所以只要将文字的屏幕坐标设为正中间,也就是屏幕的正中间,右键蓝图get viewport size获取到屏幕的尺寸,再乘以0.5设成文字的坐标,回到主界面运行,就能看到红色的准心了,当然除了准心你可以画点其他的乱七八糟的玩意,比如获取到桌子的世界坐标转换成屏幕坐标然后在这个位置显示个提示之类的玩意……切换材质前排文档:https://docs.unrealengine.com/latest/CHN/Engine/Rendering/Materials/MaterialInstances/index.html换材质这个就没啥好说的了,其实就是动态创建材质的节点,甚至还可以动态设置材质的参数,其实应该叫shader了吧……创建个蓝图,加个球,然后添加一个变量,类型设为Material,然后点后面的九宫格,就变成数组了,方便我们之后编辑。[UE4虚幻引擎教程]-004-蓝图的使用:样板间系列 资源教程 第15张然后记得在类设置中添加之前的BP_Interact接口,创建一个自定义事件起名为ChangeMat,再添加一个整形变量,起名为NowMatIndex用于记录当前的材质数组下标,(别告诉我你不知道数组是啥)然后我们首先判断下,如果当前的数组下标小于材质列表的长度,那么就让下标+1,如果大于,则设为0,这是为了方便偷懒,之后的加强篇里会做一个材质列表的UI界面用于选择材质...[UE4虚幻引擎教程]-004-蓝图的使用:样板间系列 资源教程 第16张然后就是Create Dynamic Material Instance节点了,用于动态创建材质,通过下标取得对应的材质动态创建出来赋给球,就完成了材质的切换了。[UE4虚幻引擎教程]-004-蓝图的使用:样板间系列 资源教程 第17张最后,将球丢进场景,记得给球的材质列表添加材质,然后运行,狂按F,就能看见材质的切换咯。控件蓝图显示UI看文档看文档:https://docs.unrealengine.com/latest/CHN/Engine/UMG/UserGuide/WidgetBlueprints/index.html就是我们常说的UI界面啦,注意,这和HUD是两码事:https://docs.unrealengine.com/latest/CHN/Gameplay/Framework/UIAndHUD/index.html首先新建个文件夹,起名为View,然后创建一个用户界面,拖个Border,拖俩按钮,加上文字,就是个界面了,至于自适应什么的,才不重要呢~然后点击返回按钮,在右边点击Onclick事件,会自动在蓝图中创建事件,拖出remove from Parent,表示点击后移除父节点,也就是这个View就被移除啦,再回去添加退出的OnClick事件,拖出QuitGame节点,就是表示退出游戏啦。还记得怎么创建动作映射么?再来建个ShowTab[UE4虚幻引擎教程]-004-蓝图的使用:样板间系列 资源教程 第18张然后打开Controller,创建一个自定义事件,起名为ShowTabView,拖出 创建控件 节点,设置Class为我们创建的View,之后的Set Input Mode UI Only则是只接受UI事件,停止对Pawn的控制,然后Add to ViewPort将控件加入画面,最后Set Mouse Cursors里勾选显示鼠标,通过ShowTab事件调用,就可以显示UI界面了。运行场景,按Tab,你会发现显示了一个歪歪扭扭的界面,然后点返回还卡着不会动了,没事我们来改改。此时回到控件蓝图中,修改返回按钮的事件,设置Game Only模式,隐藏鼠标,就能正常返回了,界面歪的话,设置所有控件的锚点为居中是个简单粗暴的方式,深入了解的话就需要亲们去研究自适应去了。[UE4虚幻引擎教程]-004-蓝图的使用:样板间系列 资源教程 第19张物体的拾取哈哈哈终于最后一个了,写的快吐了(划掉……)首先打开我们的character,然后在左手位置创建一个scene,调整下位置,用来设置拾取的物体位置,注意层级关系。[UE4虚幻引擎教程]-004-蓝图的使用:样板间系列 资源教程 第20张然后还记得蓝图接口的吧,去那添加个新的函数,起名叫PickUp,然后在输入栏里添加一个新的输入,用以判断是拾取还是放下。[UE4虚幻引擎教程]-004-蓝图的使用:样板间系列 资源教程 第21张顺带再添加个动作映射起名为PickUp方便处理[UE4虚幻引擎教程]-004-蓝图的使用:样板间系列 资源教程 第22张然后创建个Actor蓝图,随便丢个什么模型上去,我这里简单粗暴的来了个cube,设置模拟物理[UE4虚幻引擎教程]-004-蓝图的使用:样板间系列 资源教程 第23张进入类设置,继承PickUp接口,再创建两个自定义函数分别执行拾取和放下,关键内容其实就是AttachTo节点和DetachfromParent,AttachTo将目标物体也就是射线检测到的cube添加到另一个物体下作为子物体存在。有4种attach类型,这里我们设置为Keep world Postiton就行,然后由于物体是物理模拟的,则拾取的时候要关闭物理模拟,在放下的时候再设置回来。[UE4虚幻引擎教程]-004-蓝图的使用:样板间系列 资源教程 第24张打开我们的playerController,创建一个bool类型的变量用以判断是否已经拾取了物体。在执行射线检测后传入变量用以判断是放下还是拾取。[UE4虚幻引擎教程]-004-蓝图的使用:样板间系列 资源教程 第25张来看看最终效果:[UE4虚幻引擎教程]-004-蓝图的使用:样板间系列 资源教程 第26张好了,这一节蓝图教程就大概写到这里,我先去打屁股了~

评论列表暂无评论
发表评论