UE4入门学习笔记——纪念学习虚幻引擎满一周年

UE/虚幻引擎 专栏收录该内容
1 篇文章 0 订阅

UE4入门学习笔记

前言:

今天是正式学习ue4一周年。一年前的今天,我结束了PBR流程的学习,怀揣着对游戏制作的热爱,正式开始学习ue4,继续追寻儿时的那个大厂梦。谁也没想到,一年后的今天,我会在TA的道路上坚定地走下去,我的大厂梦,好像越来越近了…

今天,重新看看一年前稚嫩的自己,与大家一起交流分享那段ue4的入门时光。

(这些笔记是笔者一年以前学习虚幻4时所记录,想与大家分享交流我的虚幻引擎学习经历,共同勉励,共同进步。由于当时只是个小白,言语措辞和理解上难免有疏忽和错误,恳请大家指正。)

蓝图篇

2020.6.2

从今往后正式开始学习ue4蓝图部分。

看的是谌嘉诚老师的教程:

https://www.bilibili.com/video/BV164411Y732?from=search&seid=4306391978474255219

感谢谌嘉诚老师,功能实现讲的特别细,也特别有趣!

今日内容:按键开门,鼠标点击开门。

1、按键开门

完整的蓝图:

image-20210602080010465

新节点:

1.Enable Input(启用输入)【见下方说明网站】

2.Disable Input(禁用输出)【见下方说明网站】

3.Get Player Controller(获取玩家控制器)【见下方说明网站】

【以上三个组合总而言之就是规定了一个控制角色(Get Player Controller),确定了蓝图可以接受或拒绝操作该角色的玩家从键盘发出的指令:启用输入(Enable Input)禁用输入(Disable Input),一旦该角色满足了触发条件,就启用输入或者禁用输入,即该角色可以获得或者丧失从键盘(这个案例是,下面那个案例是鼠标,总结总结应该接受从设备输入)输入按键的权利,然后触发后面乱七八糟东西的】

4.E【就是按键E】

5.Gate【门,就是当怎么样(在Open或Close满足时)的前提下然后怎么样(Enter个啥玩意)的时候允许触发事件】

6.Flip Flop【切换翻转,就是A和B轮流执行,第一次调用执行A,第二次B,第三次A……】

这节中查阅的资料:https://blog.csdn.net/qq_37712328/article/details/86570376

2、鼠标点击开门

完整的蓝图:

image-20210602080026055

注意:要想激活鼠标单击能触发事件,还需要做一个工作:

image-20210602075752224image-20210602075805433

新的节点:

1.Set Show Mouse Cursor【设置显示鼠标光标】

2.On Clicked(点击时)【在需要点击才会触发的组件最右侧细节面板中的事件里找!】

2020.6.3

复习昨天的蓝图,并且开始写了这个ue4的学习日志,把前面的补完了!!!

2020.6.4

按键升降电梯

完整的蓝图:

image-20210602080038637

新的节点:

1.Lerp(插值)【由A、B、Alpha三部分输入节点和一个输出节点组成,其中A、B的意思是进行一个数值从A到B的变换过程,A为起始值,B为最终值,Alpha控制A到B转化到了什么程度,类似于进度条从0到100%(即0到1)的转化,Alpha可以和前面的时间轴输出轨道相连,即用时间轴在多少秒内其值从0到1来控制Alpha】

未解决的bug,当电梯升降(运动)过程中离开碰撞检测区域,则可以在任何地方控制电梯升降,直到下次进入碰撞检测盒,才可修复该bug。

2020.6.5

双向门的开关

完整的蓝图:

img

image-20210602080220582

注意时间轴是怎么和后面连线的,时间轴连左侧门,左侧门连右侧门,但是左右两个门要分别设置插值去控制它们位置的变化。

有个坑!由于盒体碰撞检测器会因为门的运动而被再次触发,所以会产生bug(例如在门正在开的同时往门里走,会导致无法触发关闭,必须再次走出来),所以要将两扇门的细节面板中碰撞栏里的“生成重叠事件”对号取消掉。这样才可以保证盒体碰撞检测器不受两扇门的运动的影响。(门的运动也会被算为重叠触发!)

2020.6.6

(此时只需要设置你想把门开到多大即可,不用再手动调初始和结束位置)

image-20210602080314185

通过获取组件一开始位置的方法,将组件的初始位置存储在一个变量中(变量在左侧新建),然后通过再次新建一个变量输入想要移动的参数,用加法(Float+Float)实现门的移动。

此蓝图有bug,因为.Get Relative Location所连接的变量所处的连接位置在触发按键之后,所以一旦在开门动作中(即开关门动作未完成时)再次按键,则会将当前位置存储在变量中,那么再次触发时将不再是我们希望的起始或者结束位置,从而产生bug。

新的节点:

1.Get Relative Location(获取Relative Location)【获取当前相对位置,与此同时还有Get Relative Rotation】

2.SET(变量)【**Float(浮点)**型变量,在左侧,如上图所示】

3.Float+Float(浮点+浮点)【意如其字】

2020.6.7

钥匙开门

完整的蓝图:

image-20210602080351068

思路:两个蓝图建立蓝图通信,一个门的一个钥匙的,通过门的蓝图中的一个bool类型的变量去判断是否拾取了钥匙,在门的蓝图中,一开始bool是false,即无法打开门,在钥匙蓝图中有一个Get All Actors Of Class去把刚刚门中的那个bool抓出来,当捡到钥匙时bool变为true(别忘了销毁钥匙模型,)即可判断钥匙已拾取,然后就可以开门了。

新的节点:

1.SET(变量)【**Bool(布尔)**类型变量,在左侧】

2.Branch(分支)【和布尔结合使用,做判断用的,若条件(就是那个布尔)为True,则执行True相关连线的命令,若为False,则执行False相关连线的命令】

3.Print String(打印字符串)【做测试用的】

4.Get All Actors Of Class(获取类的所有actor)、【把其他蓝图中的东西调过来的第一步,在Get All Actors Of Class下面Actor Class中选择你想调过来的蓝图,然后在右面Out Actors后面接上Get】

5.Get(复制)【此处的Get意思是明确刚刚调用出来的门的那个蓝图是场景中第几个相同蓝图的物体的,啊啊啊啊啊反正就是,一个蓝图写好了不是可以扔在场景好多个嘛,然后这个玩意儿就是判断是第几个的,就是万一场景一堆门,确保这把钥匙只能开第几个门的】

6.Destroy Actor(销毁Actor)【销毁组件】

2020.6.8

今天开始搞蓝图通信

实现小白人走进某个区域后加速

完整的蓝图:

image-20210602080423795

image-20210602080427373

思路:两张蓝图通过蓝图通信实现效果。第一张是触发盒子的蓝图(即加速的区域),第二张是小白人的加速蓝图(即被加速的对象)。

第二张蓝图为自己在小白人的图表中新建的一张,用来专门获取小白人的速度。上方组件中的CharacterMovement为小白人的控制属性,单击后在右侧细节面板可以看到可调节的小白人的各种属性。通过添加自定义事件(Custom Event),获取到小白人的最大行走速度(Get Max Walk Speed)。

第一张蓝图中运用一个类型转换,在后面获取到了刚刚第二张蓝图中的自定义事件,即获取到了小白人最大行走速度,并可以对其参数进行修改,实现触发效果。

新的节点:

1.Cast To(类型转换为)【就是用于获取其他蓝图中的某个事件、类、变量等,使其与本蓝图中的某个东西发生联系(这个案例中就是就是触发盒子),并可在后面连的东西中更改事件内容】【2020.6.11补充:类型转换相当于一个过滤器,过滤掉其他东西,只有指定类型转换的actor才能触发后面逻辑】

2.Custom Event(添加自定义事件)【就是自己可以添加事件,然后在蓝图之间互相传数据】

2020.6.9

实现控制小方块的自转

image-20210602080443300

image-20210602080446953

思路:本案例涉及到对象引用和变量有效性检测。

首先在小方块的蓝图中,给小方块设置旋转,此处用到了一个添加本地旋转(Add Local Rotation),然后用布尔配合分支去控制是否旋转,这里要注意,首节点事件Tick表示每帧都刷新一次,而添加本地坐标添加的是一个差量,所以就产生了不断旋转的效果。

然后新建一个自定义事件去控制布尔的值是1还是0,即控制是否旋转。

最后一个步骤是在小白人中新建一个蓝图,通过按键数字1来控制小方块蓝图中的自定义事件是否触发。这里需要新建一个变量,并在右侧变量类型里找到对象小方块的名字进行一个对象引用,这一步的意思就是把小方块(和他里面的蓝图)和小白人蓝图的此处产生联系,这样在此处即可控制小方块蓝图中布尔的变化,从而间接控制旋转。要注意此处用了一个is Valid来进行变量检测,判断变量是否有效,这个东西必须加。而后即可在小白人的蓝图中调出小方块的自定义事件了。

当上面工作都做完以后,程序其实还不知道你想让哪个小方块旋转(虽然是小方块是只有一个actor蓝图,但是场景中却会有多个,需要进行引用对象的指定)。所以要把刚刚对象引用的变量,在左侧把其小眼睛打开,意思是将其变量变为公有,可以在此蓝图的每个实例上编辑。然后先把这张蓝图编译一下!!!记住一定要编译一下!!!要不后面的东西没有。编译完以后,回到编辑器窗口,选中控制小方块旋转的小白人,在右侧细节面板中,有个默认,里面会显示刚刚添加的对象引用,然后用吸管工具吸取场景中(可能是众多)小方块中你想控制旋转的那一个(此处也可以通过下拉菜单选中),即可完成引用对象的指定。

新的节点:

1.Add Local Rotation(添加本地旋转)【给物体的旋转添加一个差量】

2.is Valid【判断变量是否有效,反正用到变量就得写这个(2020.6.14貌似是在用到对象引用才会用到这个?)】

3.事件Tick【每帧都调用】

2020.6.10

实现指定小方块(物体)的自转和所有小方块(物体)的自转

完整的蓝图:

image-20210602080511964

小方块的蓝图部分见2020.6.9的第一张蓝图,在这里小白人的控制蓝图整个通过获取类的所有actor实现,编号1用For Each Loop实现所有物体的旋转,编号2用普通的get(复制)实现指定编号的小方块旋转,编号3加了个随机整数来实现旋转编号的随机性,从而达到随机指定一个旋转(编号3有bug!就是本来该第一次按键让一个旋转,再次按键让该小方块停止旋转,但因为再次按键的时候又随机生成了一个整数,有可能编号变了,就会失控<若再次生成的这个编号的小方块原本没动,就会动起来,如果原本就在动,就会停止>。此问题尚未解决!)。

新的节点:

1.For Each Loop【循环遍历场景中所有该类的actor,也就是说场景中拽进去了多少个小方块,就循环遍历多少个】

2.random integer(随机整数)【随机生成一个整数】

2020.6.11、2020.6.12

制作一个完整的解密小游戏(复习以前的内容,稍微加了点儿新的东西)

完整的蓝图:

1.门:

image-20210602080540959

首先运用一个类型转换,指定只有小白人可以触发后面的效果,(略过分支那里)用一个设置可见性来触发靠近时显示文字的效果,后面就是按键常规操作,再往后,逻辑是只要打开门了,以后再进入触发盒子也不再显示文字了,所以此处设置一个布尔,当按键以后,布尔值变为True,再往前找到那个分支,那个分支里写的是如果布尔值是False才执行,一开始设置的布尔值就是Flase,后来按键变为True以后,就不执行了,以此实现效果。

2.灯

image-20210602082658377image-20210602080603184

这个蓝图分两部分,前半部分开灯的逻辑与上述开门的类似,重点和难点是后半部分乱七八糟的布尔逻辑。后半部分,首先获取此蓝图的所有actor,进行自个儿的蓝图通信,后面用一个可中断的循环去遍历数组。假设场景中有五盏灯,那么这个的逻辑就是,如果我已经开了前两盏灯,即前两盏灯的If Opened的布尔值都是True了,现在开的是第三盏灯的这个蓝图,那么首先第三盏灯的If Opened布尔值在“获取类的所有Actor”前面的“Set”处已经变成True了,循环体的遍历过程从第一盏灯开始,True,很好,分支走上面的Set,Open The Door的布尔打勾,变成True;继续遍历第二盏灯,True,很好,分支继续走上面,Open The Door的布尔还是True;第三盏灯,刚打开了,也是True,很好,Open The Door的布尔依然是True,继续!到了第四盏灯,哎嘿,还没打开过,If Opened的布尔是Flase,完了,走下面,Open The Door的布尔的勾被取消了,变成False了,不仅这样,这条线往回拐,拐回去到Break去了,循环中断,执行Completed,又连着一个判断Open The Door的布尔值得分支,是False,然后就凉凉,没法激活执行控制台命令,也就无法激活下面那张蓝图的自定义事件(开隐藏门“Open hidden door”)。只有六盏灯全打开了,才能一路循环走上面,Open The Door的布尔值一直是True,直到开心地循环遍历完整个数组,也不会被Break,然后开心地走下面Completed,分支处判断Open The Door的布尔值是True,于是乎激活了执行控制台命令,控制台又激活了下面关卡蓝图的Open hidden door的自定义事件,隐藏门才能顺利地打开!总而言之,只有所有灯都打开,才能平稳顺利执行完循环遍历数组,保证了Open The Door的布尔值始终是True,才能顺利激活控制台命令!

image-20210602080619549

新的节点:

1.Set visibility(设置可见性)【设置物体是否可见,注意!有碰撞的模型若勾选不可见,虽然看不到模型,但是碰撞依然存在!】

2.For Each Loop with Break【循环(遍历)某个数组并可以触发中断。其中Array连接要循环的数组,Loop Body是要循环的内容,Array Element是判断循环变量,按照顺序获得取出的值?Completed表示循环结束后走的路,如果在循环的内容中触发了某条而连接到了Break中断循环,也会走Completed。】

3.Execute Console Command(执行控制台命令)【关卡蓝图间的直接通信。控制台命令输入ce+空格+关卡蓝图中自定义事件名称,可直接进行蓝图通信。】

2020.6.13

常见问题和快捷键

一、编辑器窗口快捷键

1、Alt+2到0(9除外)视图模式切换:

(1)、Alt+2 线框显示

(2)、Alt+6 光照模式(看阴影、漏光等问题)

(3)、Alt+7 光照复杂度(性能的判断,颜色越艳丽性能开销越大)

(4)、Alt+8 着色器复杂度(性能的判断)

2、alt+L 显隐地形

3、H 隐藏当前选中物体,Ctrl+H 显示隐藏的物体

4、Alt+C 显隐场景中的碰撞

5、Alt+F 显隐大气雾

6、T 是否可以选中半透明物体(如玻璃)

7、P 快速打开内容浏览器的资源

8、Ctrl+Alt+鼠标左键 框选

9、鼠标中键在正交视图中可以测距

10、Ctrl+E 快速打开物体编辑器(蓝图、模型编辑器)

11、Ctrl+B 快速定位物体蓝图在内容浏览器的位置

12、Ctrl+G 打组 Shift+G 取消打组

13、Alt+P 开始游戏

14、Alt+S 模拟(上帝视角运行游戏)

15、Ctrl+W 快速复制选中的物体、变量、节点

16、Ctrl+N 新建关卡

17、Ctrl+Shift+S 保存所有

18、Alt+变换 快速复制

19、F11 全屏

20、G 游戏视图(即隐藏乱七八糟的图标显示)

21、L+鼠标左键 在鼠标位置添加一个点光源

22、Shift+F11 全屏引擎/退出全屏

二、蓝图快捷键

1、G+左键 Gate节点

2、M+左键 MultiGate节点

3、F+左键 ForEachLoop节点

4、O+左键 DoOnce节点

5、N+左键 DoN节点

6、B+左键 Branch节点

7、S+左键 Sequence节点

8、D+左键 Delay节点

9、C 注释选中的节点

2020.6.23 我又回来啦!

多个人物的角色控制权切换

完整的蓝图:

image-20210602080646533

整体逻辑:使用MultiGate实现多个人物之间的切换,使用possess来获取切换后人物的控制权,使用Set View Target with Blend来实现切换视角的过度。首先用数字2键来控制人物的切换,然后在MultiGate节点中引出三个人物分别的控制切换,在Set View Target with Blend节点中,设置切换过度的时间为1秒,即用1秒的时间进行两个人物切换的视角方面的动画(注意!此时角色控制权仍未切换)。随后用一个和切换视角的过度时间相同的Delay节点来使前面的切换过度动画能够完整播完,然后用possess节点切换人物控制权。此处如果不用Delay节点,那么直接就会执行possess节点,那么视角将直接切换,前面的过度动画将会被直接打断。有些人手贱,在切换动画还没播完的时候就想着再按一次切换人物,那么,未防止此类问题导致程序出错,前后加入一个bool类型的变量来判断过度动画是否播完,若没播完就算再次按键也将无法进行切换。

新的节点:

1.MultiGate【多个东西间的切换,里面还有Reset、Is Random、Loop等功能】

2.Set View Target with Blend(使用混合设置视图目标):【摄像机视角切换】

3.possess(控制):【切换控制权】

用了N天到

2020.6.30 角色上下车

1、角色上车

完整的蓝图:

image-20210602080715768

image-20210602080724445

呃,这节的蓝图通信真心恶心。先把蓝图通信说完!整个的逻辑是人靠近车以后可以按F键上车,那么整个过程首先涉及一个上车功能写在哪里的问题。由于控制权在谁那里键盘的映射就是谁,所以按键功能要写在小白人的蓝图里,但是上车以后控制权就在车上了,也就是说按了F键以后就没小白人啥事儿了,所以剩下的各种操作也就要写在车的蓝图内。综上所述:小白人蓝图内只写按键,剩下的都要写在车的蓝图中。两者之间通过蓝图通信实现某些事件的通信。先看小白人蓝图,建立一个Human to Car的对象引用变量来互通到车的蓝图中,目的是在车的蓝图中判断小白人有没有走到车的碰撞盒子范围内。来到车的蓝图,如果小白人走进了车的碰撞盒子范围内,触发类型转换,转换到小白人,此时就可以在车的蓝图中设置小白人那边的东西,即Human to Car,一开始Human to Car变量里的内容是空的,在这里用一个Self节点,即把车的蓝图本身设置到Human to Car中,而在小白人蓝图中的Human to Car本身就是对象引用的车,(这里的意思其实就是我设置我自己)因此实现了蓝图通信。此时Human to Car变量就不是空的了,而是车的蓝图,所以按了F键以后要进行一个Is Vaild的判断,由于变量检测有效,所以向下进行,如果没有靠近碰撞盒子,Human to Car中就是空的,Is Vaild变量检测就无效,无法向下进行。好继续看!在车的蓝图中有一个Gate节点,这个和当时开关门的类似,而输入端为一个自定义事件F Up,链接着刚刚小白人的蓝图通信,当一系列条件达成按了F键后,信号被传到小白人最后由蓝图通信通过来的车的自定义事件F Up节点中,条件达成,车的Gate节点就可以继续往后。

以上部分就是很BT的蓝图通信部分,说实话到现在我还懵懵的,期待以后的你给你自己当时的解释一个满意的答案。

下面的就简单了。小白人要上车,有三点需要满足,

1、关闭小白人的碰撞,要不…卡模抽搐。这里采用一个设置Actor启用碰撞节点,把碰撞的√取消掉,关闭了小白人碰撞。但是问题在于,目标应该是小白人,那么就需要蓝图通信。而前面在自定义事件处已经进行了蓝图通信,所以直接把设置Actor启用碰撞的目标引脚拽到前面的自定义事件中,就会在自定义事件中自动添加一个目标(重命名为White Man),回到小白人蓝图的最后,在引用的自定义事件中,将这边也同时自动添加的目标设置为小白人自己(Self),于是乎就实现了小白人本体的蓝图通信。回到车的蓝图中,由于往后会用到好多好多小白人为目标的节点,全部都拽到自定义事件中的White Man上面会特别乱,这时右键给White Man一个提升为变量,在从自定义事件后面直接把White Man变量的值设置了,就把White Man变成了一个变量保存了下来,在后面直接从变量栏拽出来White Man引用就方便多了。

2、将小白人的位置移动到上车的位置处。通过设置Actor变换节点,将小白人的位置移动到上车(开车)的地方。这里需要创建一个上车位置,采用的是一个球体碰撞器,特别要注意在这个球体碰撞器的碰撞预设中设置NoCollision,关闭掉碰撞器的碰撞检测。这个球(Up)仅仅是起一个定位上车点的作用。下面获取到球(Up)的场景变换,分割结构体引脚,将位置和旋转连接到同样分割结构体引脚的“设置Actor变换节点”相应位置上,缩放不连,因为缩放没变!这时小白人就到了碰撞球(Up)的位置了。

3、让小白人跟随上车的位置点。采用附加Actor到组件,字面意思就是这样,把Actor小白人附加到组件碰撞球(Up)。这里注意要将下面的位置旋转缩放的类型全部从保持相对改为保持场景。体会一下区别,保持相对的话,由于小白人和碰撞球的Transform信息不一致,相对的话就不知道跑哪去了,保持场景是全部以世界坐标为中心,所以就不会出现乱跑的问题。

4、控制权切换到车。嗯还是那样切换,记得要获取玩家控制器。而且由于本身就是在车的蓝图里写的,所以In Pawn连的直接就是Self(车本身)。

新的节点:

1.Set Actor Enable Collision(设置Actor启用碰撞)【开启或者关闭Actor的碰撞】

2.Get World Transform(获取场景变换)【获取某个东西在场景中的Transform信息】

3.Set Actor Transform(设置Actor变换)【设置Actor的Transform】

4.Attach Actor To Component(附加Actor到组件)【把Actor附加到组件,也就是说让Actor跟随组件,(或者说设立了父子集?)】【与此相对应的还有Attach Actor To Actor(附加Actor到Actor)】

2、角色下车

完整的蓝图:

image-20210602080750872

由于蓝图通信已经在上车的蓝图中写完了,因此下车的蓝图就比较简单了。上车后,控制权在车上,所以下车的所有内容全部写在车的蓝图中。首先在车上通过按F键触发下车命令,用Is Vaild进行变量检测(是为了养成习惯,规避掉一切可能产生的错误)。用从Actor中分离使得小白人与车分离,再新建一个下车点的位置(Down),用同样的方法获取到下车点的场景变换,并将其位置和旋转连接到设置Actor变换上,实现小白人下车动作。此处要特别注意,小白人开车时由于遇到凹凸不平的路,整体会向一个方向倾斜,如果这时下车,那么摄像机就歪了,因此在获取场景变换中要将旋转属性再次分割,只获取Z轴方向的旋转并同样连接到设置Actor变换中的旋转的Z轴。随后给小白人启用碰撞,用一个使用混合设置视图目标来做到视角的平滑过渡,然后切换控制权到小白人。此处有个问题。由于在上车时的蓝图通信中,小白人White Man是Actor类,而控制的这个节点要连的In Pawn只能是Pawn类,所以上面蓝图通信中自定义事件的输入类型应该改成Pawn类,提升成为的变量在设置时也应该改为Pawn类。

新的节点:

Detach From Actor(从Actor分离)【还有Detach From Component(从组件分离)】

3、角色下车后车的减速

局部蓝图:

车的预设蓝图部分:

image-20210602080810709

上下车蓝图部分

image-20210602080826047

先不看那个speed slow的布尔变量。通过设置手动输入节点并打勾实现手刹的效果,接下来在后面连接设置油门输入节点,调整参数为0,实现速度最终为0的停车效果。整套节点不能放在控制后面,因为一旦切换了控制权,这套将不起作用。由于在车的预设部分同时存在设置油门输入的节点,而那里面的这个节点正是控制上车后车的加速减速行为的,所以在下车时按了F键以后两个事件图表中的该节点会冲突,那么将可能会导致车无法停下来或者就算停下来了车轮依然旋转的情况。因此在下车时,我们要将Throttle Input中的设置油门输入节点断掉。即用一个布尔变量来控制Throttle Input的启用和断开。布尔的具体操作和前面的类似,在这里就不过多说明。

新的节点:

1.Set Handbrake Input(设置手制动输入)【手刹效果的实现】

2.Set Throttle Input(设置油门输入)【1为加速,0为停止,-1为倒车】

2020.7.1 小白人疾跑、瞬移、多段跳 至此,第一部UE4教程全部完结!

完整的蓝图

image-20210602080846171

疾跑需要调出小白人的最大行走速度然后设置即可,在按下shift时疾跑,松开时回到普通速度。后面紧接着一个瞬移模块,新建一个整数变量来计数,如果按了两次shift,则激活瞬移,下面用一个延迟和一个变量设置为0来保证,如果两次shift的时间间隔太长,则将不能激活(控制住了必须连按两下)。再往后就开始实现瞬移部分。通过时间轴控制瞬移时间,用一个向量插值来实现位置的过度。首先获取Actor位置传给插值节点的A,即获取了小白人当前位置,然后再获取Actor向前向量,这个向量数值为1,指向小白人的前方,然后给一个浮点乘法给他这个向量的值扩大,与刚刚获取的Actor位置相加,即为瞬移后的位置,把这个向量位置给插值节点的B。这样一连,再把实时变化的插值传给设置Actor位置节点,就实现了小白人的瞬移。后面通过设置跟随摄像机的视野,再配合时间轴和插值,实现镜头的过度。而小白人的多段跳则可以直接从上面点开类默认值,在右侧细节面板直接设置角色的跳跃段数实现。

新的节点:

1.Get Actor Location(获取Actor位置)【获取Actor的位置,这个获取的是向量】

2.Set Actor Location(设置Actor位置)【设置Actor的位置,也是个向量的接口】

3.Get Actor Forward Vector(获取Actor向前向量)【获取Actor向前向量,向量值为1】

4.Set Field Of View(设置视野)【设置摄像机的视野,形象地比作近远广角等任何过度】

5.>=【判断】【呃……】

6.*、+等【呃……】

材质篇

看的是CG学习笔记的教程:

https://www.bilibili.com/video/BV1B7411P7cC

感谢CG学习笔记,材质逻辑运算的原理讲的很清楚!

材质 2020.7.2

从现在开始学习材质部分。

1.Add【加法运算,图片加图片,会越来越亮(发白)】

2.Multiply【乘法运算,图片乘以图片,黑色细节保留,白色细节被替换,相当于Ps里的正片叠底】

3.Subtract【减法运算】

4.Divide【除法运算】

以上四个节点可以是运算两个数,也可以是运算两张RGB图片。

同理于其他算法,0是黑,1是白,低于0的也显示为黑色,超过1的也显示为白色。

但是在自发光节点上,超过1会表现为光溢出,即材质出现辉光的效果

5.Clamp【控制最大值和最小值】

6.Lerp【是的又是Lerp,和蓝图里的意思一样,插值,就是实现一个过渡】

用法1:控制两张图片的不透明度。通过Alpha的值来控制:0的话就是上面那张不透明,也就是仅显示上方图片(A),1的话就是上面那张图片完全透明,也就是仅显示下方图片(B)。Alpha低于0或者高于1都会导致图片的错误显示(自发光里除外)。为了避免这个问题出现,用到Clamp节点来控制最大值和最小值】

image-20210602080953155

用法2:控制物体的移动(连到自发光上依然会很神奇)

image-20210602081008873

7.Time【用来向材质(例如,Panner(平移)Cosine(余弦) 或其他时间相关操作)添加经历时间】

8.OneMinus【反向节点,即在灰度图上黑白转换,黑变白、白变黑。原理是1-x,因为0是白,1是黑,所以用1减去数值,就反向了黑白】

9.TextureCoordinate【调整UV】

2020.7.6 向量运算

1.Dot Product【点乘。以下图为例。灯光方向为黄色向量,物体顶点法线方向为蓝色向量。当两个向量同向(平行)时,即点乘为1,垂直时,点乘为0,相反时,点乘为-1,其他情况均的数值均介于这些情况之间。】

image-20210602081027638

image-20210602081031897

所以可以看到左侧浏览图中,由于灯光是在顶上向下照射,所以顶上的顶点法线向量和灯光向量同向(平行),点乘积为1,是白色,中间垂直为0,是黑色,底下相反为-1,也是黑色。

image-20210602081048484

通过+1再*0.5把-1到1的区间变为0到1。

这块儿的加1乘以0.5可以用一个节点来实现

Constant Bias Scale【偏差即为加,缩放即为乘】

2.Cross Product【叉乘。知道两个向量,这两个向量做叉乘可以得到与这两个向量确定的平面垂直的向量】

举例如下:

image-20210602081107607

已知红绿,叉乘得到蓝色。一定要注意方向,用右手定则!!!是红色(1,0,0)叉乘绿色(0,1,0)得到蓝色(0,0,1),如果是绿色叉乘红色,则得到的是(0,0,-1),就是黑色了!

3.Normalize【向量归一化。把数据缩放至0到1之间】

举例向量归一化前后对比:

image-20210602081124894image-20210602081128080

2020.7.8 菲涅尔材质

image-20210602081232558

下方左侧是菲涅尔节点,右侧是菲涅尔方式节点,上方是菲涅尔节点的原理。

新的节点:

Fresnel【菲涅尔,实质还是点乘运算,第一个Exponentln是调节外边缘的大小,即为白色区域的大小,数值越大,白色边缘的区域越小,当为0时,全白。第二个BaseReflectFractionln是中心区域的颜色,0的话中心就是纯黑色】

Fresnel_Function【其实就是封装好菲涅尔原理的一个节点,可以双击打开看到菲涅尔原理的各个节点,Power来控制菲涅尔效果的强弱】

材质案例:

2020.7.14 菲涅尔做玻璃材质

image-20210602081256543

关键技术:通过菲涅尔控制不透明度和折射,用Lerp节点和各种数学运算来调整和优化材质。

2020.8.17 磨砂玻璃效果 (一个月的复习考试后我又满血复活了!继续干!)

2020.8.30 呃…不想学材质案例了,想学粒子特效

粒子特效 2020.8.30

1、常用节点

Oneminus【1-x】

Panner【让贴图沿指定轴向以设定的速度偏移(说白了就是让贴图动起来)】

Power【提升纹理贴图的光感,让亮的地方更亮,暗的地方更暗】

Rotator【旋转纹理贴图】

Time【时间节点,输出一个向前推动的时间,一般配合sine,cos函数使用】

ComponentMask【分量蒙版表达式,过滤掉不想要的通道颜色】

Abs【绝对值】

Particle Color【粒子材质、颜色】

Particle subUV【粒子的序列纹理,做粒子动画序列帧用】

Desaturation【去色】

Depth Fade【深度衰减,物体交接处柔化。注意要连接到Opacity上,混合模式要修改为Additive或Translucent】

If【判断】

TextureCoordinate【纹理坐标表达式。表达式以双通道矢量值形式输出 UV 纹理坐标,从而允许材质使用不同的 UV 通道、指定平铺以及以其他方式对网格的 UV 执行操作。】

Lerp【线性插值】

2020.9.3 貌似又回到了材质上……

1、边缘发光材质的制作

image-20210602081306574

整个蓝图的思路,首先要获取到边缘信息,这里我们采用fresnel节点,即边缘是白色(1),中间是黑色(0),然后用一个Lerp,并把fresnel挂到Lerp的Alpha通道上来控制颜色的变换。用Multiply节点整体放大颜色的数值,从而达到发光的效果,然后用Power节点来使亮部更亮暗部更暗来增加对比,下面为了实现让边缘一闪一闪的效果用Time配合Sine控制时间的输入,从而控制闪烁的频率用Noise节点实现闪烁,最后用Multiply节点将两个大块儿结合起来赋给自发光完成!

2…变色材质

image-20210602081331781

很简单,Lerp节点直接套两种颜色,然后Time+Sine组合不断输出-1到1,这里特别注意,用Abs节点取绝对值,保证了在Sine函数是负数的时候弄成正的,保证了输出的平衡。

2020.9.4 溶解+边缘动态发光材质

image-20210602081342854

嘿嘿……想了一天没想明白为什么0和1在判断中要这样连,反过来就啥也不是!等想明白了再来更新。

后记:

到这里就停止了更新。想了很多,也做了很多。去探索ue4的各个模块各种功能,经常一知半解地努力看官方直播,也参加过UOD。后来就入了TA的坑,开始了努力点亮TA技能树的道路。原来“怎么也学不会”的数学竟然也神奇地变得有趣了起来,一切的一切都好像是那么自然。探索游戏效果背后的实现原理,了解游戏设计艺术,深入探索PBR流程,复习C/C++,学习3D数学和计算机图形学,重新补高数线代,学习unityshader,实现各种效果。而虚幻引擎,也终于出了第五代。ue4/5在与unity交叉学习的过程中,依然是主攻方向之一……

感谢一年前自己做出的选择,感谢这一路上遇到的所有所有!

一切才刚刚开始……

2021年6月2日

  • 9
    点赞
  • 2
    评论
  • 12
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 1024 设计师:白松林 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值