目录项目打包Pawn的旋转和位移鼠标控制角色的移动Pawn的相机鼠标控制Pawn的旋转第一种旋转方式第二种旋转方式第三种旋转方式移动端的移动按钮的效果UI的事件分发器使用按钮UI控制模型滞后效果的实现相机的切换滑动条控制自己观看静止物体的视角函数介绍材质球的运算材质函数项目打包新建项目按照自己的习惯对项目进行设置创建对应的文件名并且保存当前的关卡项目设置更改对项目进行打包打包好了桌面上会出现一个文件这个文件只能在windows上用双击这个文件就能运行不需要装虚幻Pawn的旋转和位移创建一个GameModeHUDPlayerControllerPawn和Character有什么区别呢Character通常用于人型的物体胶囊体是竖着的椭圆形。Pawn更像一个棋子比如自走棋游戏里的角色。Pawn的功能比Character更简单Character是继承自pawn的。创建一个Pawn也可以命名为BP_Player因为Pawn也是可以被控制的也可以放到这个位置双击打开之后可以看到和普通的Actor没有多大的区别但是鼠标键盘信号可以通过controller传给Pawn普通的Actor就无法接收到controller的信息相机是必须要加的只要是玩家能控制的角色。有些时候这个相机的位置很远或者很高位置不对的时候你不能直接调整相机的位置如果勾选上Use Pawn Controller Rotation(是否使用controller控制rotation)相机的旋转就会改变pawn的中心位置就会出现问题加一个弹簧臂把相机放到弹簧臂的下面就自动让相机和弹簧臂绑定了。并且相机不再设置Use Pawn Controller Rotation了而是弹簧臂设置Use Pawn Controller Rotation我们就不再旋转相机了而是旋转弹簧臂旋转弹簧臂最后相机的视角会始终对着中心点像自走棋就会可以这样设置设置移动加上对pawn的移动按W和S不能移动为什么移动不了因为Add Movement Input没有重写缺少一个组件缺少Character Movement怎么加呢加不了只有character里才有这个组件这是character里单独实现的组件所以我们用character的时候可以直接用这个组件Pawn里有一个简易的移动组件这个组件对Add Movement Input进行了重写这里可以设置速度但是其他可设置的东西不多没有character movement里组件提供的功能丰富前后左右走补全逻辑加入鼠标的旋转进行旋转的时候发现旋转不了Use Controller Rotation Yaw和Pitch是否通过controller来改变角色rotation的Yaw和Pitch这个变量在character里是自动勾选上的而pawn里是默认不勾选的我们把这个变量给设置为true勾选上了才能用控制器控制角色我们这个是控制相机还是控制角色控制的是角色如果不勾选上Use Controller Rotation Pitch我们这样上下转的就是相机左右转的是角色我们把Pawn里的use controller rotation给去掉不要用controller改变pawn的rotation用相机的rotation来控制角色的移动并不改变角色的rotation弹簧臂有一个滞后的能力一个是位移一个是旋转什么意思呢当你鼠标移动了一段距离已经停下的时候然后才会慢慢进行播放。并不会和你鼠标同步调整Camera Rotation Lag Speed值值越大效果越弱行走的滞后类似于GTA的火车效果相机是慢慢跟着走的如果不使用pawn的Movement组件怎么实现pawn的走动呢用Set Actor Location勾选上pawn的Use Pawn Rotation Yaw这样Get Actor Forward/Right Vector才有意义如果不勾选勾选上pawn的Use Pawn Rotation Yaw怎么实现呢直接用Controller的Rotation对Controller的Rotation的Z轴(Yaw)进行操作鼠标控制角色的移动如何用鼠标控制角色移动。我们接下来实现鼠标按下上下左右能控制角色当你横向移动的时候不仅仅移动了还有视角旋转Show Mouse Cursor按住左键后就是游戏模式和UI模式所以我们要把鼠标的操作变得多一些把鼠标中间改为移动此时我想鼠标中间的时候能左右移动右键能旋转视角。我们添加一个操作映射用一个变量来表示鼠标右键是否按下添加鼠标中键前后 来控制前后的移动Pawn的相机相机从下往上看是正数相机从上往下看是负数相机一直往上看碰到地面之后相机会位移就是弹簧臂缩回去了这是因为相机的碰撞在起作用这个设定就是防止相机穿模能从模型内部看还有一点我们可以一直向右转圈但是不能一直往下看或不能一直往上看网上看锁死的角度是89°往下看锁死的角度是-98°场景中会自动生成一个PlayerCameraManager会对玩家身上起作用的相机进行约束和管理玩家身上的相机成员信息会同步到PlayerCameraManager里面。因为这个PlayerCameraManager有约束所以我们的相机不能一直往上或往下看为什么要有这个约束因为可能视角倒了PlayerCameraManager是属于Controller的我们HUD也属于Controller言外之意就是能通过Controller拿到它创建一个PlayerCameraManager自己创建完后需要放到controller的这个位置这里有对相机pitchyawroll的约束不建议你调整这个约束除非你真的有这些需求鼠标控制Pawn的旋转新建一个轴映射等于0是没有按下右键等于1是按下了右键我们不用这个节点了Add Controller Yaw Input了我们用Set Actor Rotation去掉摄像机受Controller的影响如果我们只旋转一个轴改变了物体的朝向后再旋转物体的Rotation物体的Rotation多个值都会跟着改变直接在世界场景中的拖拽旋转物体和在右下角设置旋转有什么区别呢前者是Add Actor World Rotation后者是Set Actor Rotation所以Add Actor World Rotation可能会导致摄像机有问题第一种旋转方式所以尽量不用Add Rotation而用Set Rotation这样就实现了用鼠标右键控制视角的旋转如果你用Add Actor World Rotation就可能会移动到Roll这样就看着很不舒服了如果你已经顶到视角极限了你又移动操作狠了就可能导致pitch倒过来所以我们要加一个Clamp来限制一下第二种旋转方式如果你就是想用Add就用以下的方式第三种旋转方式移动端的移动给我们提供了移动端的操作模拟打完包的一个效果点击之后会比较慢因为会模拟打包移动端都是触摸的操作虚幻里触摸的节点有很多但是只建议你用一个。触摸不建议用虚幻里项目设置的输入Pressed和Released很好理解Moved只要按压下去到处移动两帧之间有差距不放手就会一直触发MovedLocation是你触摸的坐标Z轴没有多大意义可以不用管。一般我们这样用Finger Index触摸点的索引。一个项目的触摸点可能有很多触摸点用的越少就越容易实现当你第一个手指头按下去不松开的时候Finger Index是0第一个手指头松开了第二个手指头按下去Finger Index还是0当你第一个手指头按下去不松开的时候并且第二个手指头也按下来了Finger Index是1当你第一个手指头按下去不松开的时候并且第二个手指头也按下来了Finger Index是1第一个手指头松开了第三个手指头按下去Finger Index是0因为0没有用到了优先用前面的如果你想旋转就Set Actor Rotation就可以了声明一个StartLocation 的Vector 2D类型的变量按下的时候对触摸的起始坐标进行记录松开的时候对起始的坐标清理声明一个EndLocation用于记录下一帧的坐标。按下(Pressed)算第一帧移动后(Moved)算第二帧此时第二帧和第一帧就有差值就可以做向量的运算还需要把第一次的EndLocation作为第二次的StartLocation但是旋转的时候速度太大了。给它数值缩小完整实现模拟打包后运行我们用Touch的Yaw来控制角色的Yaw用Touch的Pitch来控制角色的Pitch这个默认的UI有一个文件双击打开可以看一下你也可以不用它的UI自己创建一个UI创建轴映射如果你这样写就需要改Pawn里的设置把相机管理器对相机管理的值约束一下按钮的效果接下来加一些按钮这些按钮能退出将这些图片资源批量导入到虚幻批量对这些文件进行操作设置这些属性将这些声音文件导入到虚幻首先我们创建一个控件蓝图在HUD中创建控件再创建一个控件蓝图来专门表示退出按钮区域加一个尺寸盒子并调整尺寸盒子的大小拖拽一个按钮并且把按钮的颜色调整为透明然后添加一个复层给按钮把复层的布局方式给铺满调整按钮的边距添加一张图片并且把它的图片给上再添加一张图片调整布局模式最外面的白圈大了我们调这张图片的边距即可再添加一张图片进行调整你也可以调整一下UI的颜色也可以添加一个按下的音乐在主UI上进行布局让按钮放上去有UI的变化放上去就会带颜色了就不用自己写材质球了点击退出游戏用移动端模拟打包也可以进行关闭游戏现在要实现一个按钮类实现多个按钮功能就是换按钮的图片换按钮的点击函数声明一个变量IconTexture2D表示按钮开局显示的图片可以给这个变量缺省一个参数给这个按钮的变量赋值还可以这样写预购造的时候对IconImage进行设置这个预创建还有一个功能就是你编译保存的时候能直接在蓝图里看到效果UI的事件分发器使用怎么样让相同的类走不同的方法呢其中有一种方法就是通过事件分发器来实现创建一个事件分发器当我点击的时候调用事件分发器我们给这个按钮重命名UI的事件分发器有一个独特的功能只要子控件调用了事件分发器它的父控件就能拿到这个子控件的事件分发器事件分发器还有一种用法如果想让一个角色和一个Actor进行关联就可以用分发器Player创建一个事件分发器因为我们的角色是Pawn所以用Get Player Character是找不着的需要用Get Player Pawn在BP_Engine里绑定事件只要在角色里把消息发送给事件分发器BP_Engine里能立马收到UI里也可以这样用按钮点击的时候给自己的分发器发送一个消息分发器的事件消息就会自动的调用之前绑定的函数里还一种用法父控件类能直接调用子控件类的分发器的事件如果你也想用UI的子控件父控件的方法来让一个角色和一个Actor进行关联把他设置到子组件里这样是会报错的按钮UI控制模型接下来我们要做这种将这个模型导入到3D max中首先要检查单位是否是cm将上面的文件直接拖拽进来进行导入改成粘土按一下Z进行定位将这个模型前视图左视图顶视图都进行中心对齐将模型解组导入到虚幻不要打组对这个模型进行分层齿轮分一层外面的壳分一层转换为可编辑多边形这个模型Y轴调最小Z轴调中心点击一个模型再点击附加全选后点击附加这样这个模型就可以了然后给这个模型命名为shell然后我们弄这个模型这个模型我们需要弄成一个模型选中后点击隐藏其他模型然后选中一个模型点击附加选中所有的进行附加这样就把这个模型附加到一起了同理调整其他模型这几个都弄完后X轴不动就调整Y轴和Z轴为中心然后修改一下这个模型Y轴和Z轴调整为中心进行模型导入用文件夹进行分类然后把这些模型加到类里面添加一个场景组件这个场景组件几乎没有什么功能场景组件的功能类似于一个文件夹能把模型都放到这里面然后把其他模型也给放进来齿轮也给加进来把壳进行复制一份然后半圆就成为了整圆了运行的时候就能看到了如果你的模型有碰撞相机就会直接插到模型里因为我们用的是弹簧臂找到官方给我们提供的一个材质添加到库里选择一个合适的版本进入导入也可以直接导入准备好的文件把这个导进来后看不见需要重新打开项目素材打开了是这样我们选这个材质点击右边可以快速找到该材质放材质放的符合环境即可如果你想用着一些材质就最好再迁移否则你需要手动删这些东西迁移这个我们的文件夹就行了用过的会带着走没用过的不会带着走但是迁移的时候项目里的设置不会跟着走你就需要把项目设置也给导出这里就不导出了没什么东西新建一个项目再打开原来的项目将原来的项目迁移到新项目然后把新项目替换老项目迁移的时候放到新的项目里面然后把新项目放到虚幻的项目里面打开新项目打开你的Map确认材质球没有丢失打开有蓝图的文件将每个蓝图文件进行编译保证编译成功没有问题运行之后依然和原来的一样接下来想用滚轮来调整视角远近滚轮设置弹簧臂的长度把滚轮滚动的数值当作增加或减少的弹簧臂的长度如果你觉得方向反了可以乘以一个负数为了不让相机视角插到模型里面可以给弹簧臂添加一个约束滞后效果的实现滚轮的操作开滞后是没有效果的如果你想要滞后效果就需要自己做一个滚轮依然控制行走的长度数值但不立马进行Set操作放到后面再进行操作Sequence节点走0后再走1用一个变量保存滚轮设置的值Begin Play的时候要保存弹簧臂的初始值如何慢慢的设置弹簧臂呢用FInterp To节点可以让数值变化的时候平滑过去其实就是给定一段时间给一个变量当前值和最终值这个变量就能在这段时间内平滑的设置值。最主要的是这个节点只能配合Event Tick用节点的原理Tick执行这个节点的时候发现数值没有达到Target就会根据Speed增加数值并return Value还有几个节点V开头是移动的R开头是旋转的再回来继续实现UI的小功能创建一个蓝图接口实现Pawn的重置功能并且将弹簧臂给设置回去完整按钮的重置功能的编写相机的切换再来实现一个按钮能切换到另一个相机的观察位置在当前位置创建一个相机右下角就能看到相机的画面可以调整相机的位置有一个相机切换的节点Set View Target with BlendNew View Target就是你要切到哪个视角上可以切到Pawn上因为Pawn里有相机组件Blend Time是你切换到相机的时间。Blend Func线性的切换还是用其他曲线切换切换相机这种方式如剧情的过场动画展示产品。。等不同的按钮触发不同的事件不同的事件调用切换不同的相机相机存到了数组里用下标就能访问到可以通过Get All Class 节点获取到所有相机对象。也可以通过关卡蓝图直接拿到所有相机对象将这些对象存到对应的数组里这样你就能知道下标对应的是哪个相机了再介绍一个节点输入ce 3456就能调用3456这个自定义事件滑动条控制自己观看静止物体的视角Slider是滑条它的最小值和最大值可以控制为任意值滑动值就是根据长度从最小值逐步加到最大值Orientation可以控制为Vertical垂直方式Step Size就是每一步的步长一般不怎么用这里可以调整滑动条的样式。Bar ThicknessBar的厚度On Value Changed当你滑动的时候会触发该事件如果你的滑动条的最小值和最大值调的是0到1你就可以用Lerp节点你也可以调整为-180和180度所以调整角度的时候你可以-180到180也可以调0到360引擎内部会自动调整为0到360现在又两个问题1.开始的时候有差异开始的时候是270度而我们滑动条开始是从0度开始滑动的所以要稍微调整一下Map Range Clamped节点会根据 输入AB 和 输出AB的比例 返回值根据Controller的Rotation进行设置滑动条的初始值现在想用滑动条来控制Pitch并且不会影响Yaw的控制函数介绍用的时候可以直接拽过来当你把这个函数勾选为纯函数相当于Get功能的函数这个函数就可以不经过逻辑线直接调用函数里必须一帧内完成不能调用不能一帧内完成的函数比如delay函数timeline函数函数和事件的区别1.函数有返回值事件没有返回值2.函数里不能调用系统的自定义事件因为系统的自定义事件一般都是启动事件2.我希望用鼠标滑动角度的时候进度条也会跟着移动就需要你controller移动的时候也会通知滑动条你要移动添加两个蓝图接口Yaw Value和Pitch Value游戏开始的时候也可以设置两个滑动条的起始位置下面来更换材质点击菜单按钮的时候菜单按钮会旋转下面给按钮添加一个动画进行布局希望点击菜单按钮的时候这四个按钮从右往左平移过来添加一个垂直布局Box给每个都添加上动画导入一个媒体文件拖拽进来重命名MS_开头表示媒体源创建一个媒体的播放器勾选上双击打开MP_Video看是否能正常播放能不能直接把这个纹理给上去呢发现给不上Image不能直接给媒体纹理只能给纹理贴图和UI材质所以我们需要根据他创建材质把材质转成UI能用的材质现在就能往上放了创建一个控件来放宣传视频一张图片周围加四个边框图片添加进来然后居中对齐开始的时候这张图片需要隐藏希望点的时候会自动播放媒体现在还希望在媒体播放的时候有一个按钮可以暂停和继续会跟随着图片的变化这种操作可以用checkBox控件来实现勾选上用一种图片代替不勾选上又用另一种图片代替就是实现了点击一下更换一下图片的效果继续实现这样能播放视频但是视频没有声音我们还需要声音组件但是UI里是没有声音组件的我们只能在Actor上添加组件仍然是用刚才的媒体播放器声音组件用的是刚才的媒体刚才的媒体播放则Actor就会播放出声音然后实现点中间的按钮能播放和暂停我现在想让这个图片有渐变出现的效果只需要修改MediaOverlay的透明度就可以直接修改子控件的所有透明度修改渲染的透明度发现是不好使的因为这个材质球不支持透明度所以你需要把渲染模式修改为可透明的现在就可以看到有透明效果了添加透明度的动画点击播放的时候慢慢显示出来点击暂停的时候慢慢消失现在我希望中间的按钮会自动消失如果鼠标移动到屏幕上按钮会自动显示出来重载了Event On Mouse Enter 这个函数当鼠标移动到WBP_MediaUI控件里的时候会触发。当鼠标移动到这里面就会显示出来再重载这个函数当鼠标离开的时候会触发的事件材质球的运算接下来做模型的材质球的效果可以把模型给切割创建一个材质球现在要让这一部分没有需要用到一些节点SphereMask球形Mask是一个三维的虚拟的看不见的形体Radius球的半径Hardness软硬边的透明度即透明的渐变效果A球的中心位置B球包裹的位置(需要检测的位置)Camera Position相机的位置绝对世界位置影响的坐标轴如果是三维物体则是XYZ指的是使用该材质的三维物体中所有的渲染点类似于创建了一个球体球体包裹住和未包裹住有不同的效果这样就可以黑透白不透把材质的不透明度打开1-x能变成白透黑不透透明的渐变效果可以球之间相减就得到了一段一段的下面来回顾几个节点线性渐变节点LinearGradient由0到1的变换效果放到模型中我们看到有的模型的面是由白到黑有的是由黑到白UV节点放上去后产生的效果线性渐变起始是由UV节点实现的Mask节点只保留R通道还有圆形的渐变效果实现也是类似上面来实现的现在我想让这个模型以Z坐标的一条线往左显示以这条线往右隐藏怎么办将一个点减去另一个点就得到了一个向量再判断这个向量的夹角就可以了。用表面上的点减去这个模型的中心点得到了一个向量如果这个向量和X轴的夹角是正数说明在Z轴面的右边反之在Z轴面的左边Dot点乘积作用是比较两个向量的相似程度如果两个单位向量是相等的点乘积的值就是1完全相反是-1垂直是0。如果不是单位向量则对应的值会扩大几倍Normalize将这个向量进行标准化就是将这个向量变为单位向量左边的都是小于等于0的右边的都是0点几的数如果把这个也扔到不透明度上就会产生黑透白不透的效果下面来做开门的时候你人在哪边就把门开向哪边添加一个静态网格体模型添加一个Box给门添加一个向量官方默认用的是Pawn不是characterSelect Float节点这个节点相当于C的 ? : 三位运算符如果成立就返回A否则返回B材质函数下面来介绍一下材质函数材质函数是能在材质里被调用的创建一个材质函数并且重命名如果你想在材质里使用这个函数在材质里右键是搜索不到这个函数的就需要这样你就能右键搜索到了。否则你不嫌麻烦可以拽进来。输入时input节点输出时output节点输入和输出都可以有多个值可以预览查看材质球的效果输出节点可以起名字Mask表示要输出一个遮罩 EmissionColor表示要输出自发光输入节点可以起名字Forward表示向量括号内Vector3表示输入的类型默认时三维向量输入节点的Preview可以设置输入参数的缺省值也可以在这里设置但是需要勾选上这个选项下面来实现这个模型的一半有一半没有开始实现材质函数实现自发光的圆环可以对自发光的亮度和颜色进行调整现在我们需要在别人的材质上加东西来实现我们想要的效果将基础颜色的给连接过来为什么Mask连接不透明蒙版都不是连接不透明度因为如果材质球你调整为Translucent不透明度对光的反应很弱这样你就改变了原材质球的效果所以只要别人没有用不透明度的全部都用不透明蒙版(Masked)材质会对光的反应完全不变但是蒙版有一个特点就是没有半透效果此时场景里的物体就变成了这样你改材质球的时候还有一种情况你需要修改以这个结尾的材质球不要去掉左边的勾选第一步先把材质的渲染方式转换成Masked第二步拉一条线连接MakeMaterialAttributes节点这样就能进行连接了还有一种情况就是别人也运算了一个mask或者EmissiveColor并且连接上了你的Mask或者EmissiveColor该怎么连接很简单进行加运算就可以了。接下来我们需要通过点击按钮 来调整 材质函数 的参数 来控制材质。怎么修改材质的参数用动态材质实例的用法一个模型需要有一个材质球然后通过参数动态创建出来。但是一个模型可能有很多个材质球所以我们需要一个一个都手动创建比较麻烦。我们是通过一个Mask函数控制多个对象上的材质效果我们可以用材质参数集。反之有些场景不希望一个材质控制多个对象上的材质就需要用动态材质。在材质函数里我们需要把基向量 和 基坐标点 作为参数怎么用材质参数集双击打开Scalar Parameters表示单元参数。Vector Parameters表示四元参数但是参数集里面不能加贴图参数设置对应的参数怎么在材质里使用参数集第一种方法就是直接拖拽进去第二种方法进行搜索然后Collection进行赋值选参数就能调用文件里的Forward的默认参数对材质进行参数赋值如何把四元参数转为三元参数在按钮点击的时候如何将参数传给材质赋值通过Set Vector Parameter Value节点你需要指定Collection参数集是哪一个。Parameter Name给参数集哪一个参数赋值。Parameter Value赋什么样的值点击一下就能变换了物体旋转一个方向会斜边进行切割现在以物体自己为基向量进行材质设置。我们用TimeLine来做一下物体渐变消失的效果然后按钮点击就可以调用这个事件了