EverydayOneCat
早!上!好!
之前学习虚幻4操作基础的时候忘记笔记了,这里简单记录一下虚幻4的基础操作。后续有时间再更新其他的基础:如BSP、碰撞、地形和植被、光线等等。
- 鼠标右键+wasd实现镜头前后左右旋转,qe实现上下旋转
- W:根据坐标平移对象;E:旋转对象;R:缩放对象
- ALT拖动物体坐标轴可以实现物体的复制
- 鼠标右键+鼠标中键的旋转可实现镜头的快慢
- H:隐藏物体;CTRL+H:显示隐藏物体
开关门互动实现
1.简单开关门
这里我们用第三人称游戏包作为基础,还需要应用到StarterContent内容包。
先从StarterContent的Props导入门,接着我们要实现门的开关,我们需要设置一个触发器,这里我们选择盒体触发器。
将盒体触发器包裹门,接着选中盒体触发器
选中蓝图——>打开关卡蓝图,进入关卡蓝图界面,右键添加进入离开盒体触发的事件。
接着由于我们需要开关门,我们需要选中门,把门设置成可移动的
接着进入关卡蓝图界面,右键创建一个对门的引用,接着设置其旋转
我们要实现的是门的旋转,门是依靠z轴进行旋转的,我们设置z轴为85°,接着连接各线,可实现简单的旋转
2.渐进效果
我们现实中门是慢慢开的,为了更加逼真,我们添加时间抽来实现门的慢慢打开效果。
右键创建一个时间抽,双击进入,接着由于我们一开始门没有旋转,即第0秒旋转0°,我们添加一个【0,0】的关键帧,然后在设置一个【2,85】的关键帧,即2秒内旋转85°。
最后把线连好,即可实现
3.蓝图类实现
我们可以在一个场景中需要多次用到门的开关,我们不可能每次都像上面一样去一个一个设置,因此我们需要一个统一的门来实现门的开关互动。这里我们需要用到蓝图类。
在内容浏览器右键——>蓝图类——>Actor,接着进入蓝图类编辑界面,我们需要添加如下组件
其中静态网格都能在右边的静态网格体重找到对应的物体,而box则是一个盒体碰撞,这里注意,门和盒体都在同一级下,最终调整大小如下:
接着我们来添加事件实现门的开关效果,基本和上面类似:
为什么要相对旋转:
相对旋转是相对于这个物体(如这里是Door)来确定角度的,和这个对应的还有一个场景旋转,是相对一个世界角度(万古不变的)来讲,如果这里用的场景旋转,那么门会先变成场景中的0°角度,达不到我们想要的效果。
接着我们只要把写好的蓝图类拖拽到场景中即可使用。
4.通过键盘按键实现
我们可以通过蓝图事件实现按下键盘e键开关门的效果
5.通过鼠标点击实现
在世界场景设置中开启鼠标点击事件
在蓝图事件中添加点击事件和鼠标显示事件
位置平移
1.电梯的升降
目标:通过键盘e键实现电梯的升降
在内容浏览器创建蓝图类:电梯_BP。添加一个立方体和盒体触发器
这里注意Box要是立方体的子级,否则电梯上升过程中不会带着触发器一起,也就实现不了上升后实现下降的功能了。
在事件中实现键盘e操作:
接着设置时间轴,插值为【0,0】和【0,1】,这里不直接设置上升多少,而是通过一个插值Alpha来实现。插值的作用是当Alpha=0时,走A;当Alpha=1时,走B;当是0~1中的一个值时,走A~B对应的值。
这里由于我们要实现电梯的升降,改变的是z轴的位置,我们需要设置相对位置。
2.自动双开门
复制电梯_BP蓝图类,在此基础上进行修改。
修改立方体材质为玻璃类型,并把它一分为二,使得外观和玻璃门一致
和上面电梯一样,只是这里我们需要触发盒体触发器的时候同时修改两个门的相对位置。
拾取钥匙开门
1.实现条件开门
在Door_BP中添加布尔变量:是否可以开门(红色代表布尔变量)
接着我们在蓝图中按E开门时添加判断:通过刚刚的布尔值创建一个分支,只有是否可以开门为True的时候才可以执行后续的开门动作。
2.创建钥匙类
创建Key_BP蓝图类,钥匙用一个立方体,并用球体触发器包裹住
创建蓝图逻辑,玩家需要按住E键拾取,前面的逻辑和上面一样
接着我们拾取钥匙后要实现对Door_BP中布尔变量的修改,这里我们用到获取类的所有Actor,修改布尔值,同时销毁这个盒体actor
接下来我们测试运行,发现只有E键拾取钥匙后才能开门,效果实现。
蓝图通信和自定义事件
1.蓝图通信
蓝图通信就是不同的蓝图类实现交互的事件。上面的是取钥匙开门案例其实已经用到了:在key类中修改door中的布尔变量值。
这里我们还需要引入一个概念——类型转换:
当你想要通过触发器操作另一个类时(蓝图通信),你需要类型转换,同时类型转换还有一个作用:只有针对要转换的类才会生效,其他的AI触发了这个盒子并不会生效
我们创建一个触发加速_BP蓝图类来简单介绍一下类型转换,组件我们只需要添加一个盒体触发器就可以了
2.自定义事件实现触发加速
自定义事件也就是我们可以通过我们蓝图类本身的一些属性来实现我们想要的功能,如上面的加速,我们需要修改ThirdPersonCharacter类通过改变其行走的最大速度来实现加速的功能。
接着我们会回到触发加速_BP类,当我们进入盒体触发器范围,我们把速度调整为1500,出去后回归正常
实现键盘控制物体自转
1.物体自转实现
创建物体自传_BP蓝图类
事件是每帧都会进行后续连线的操作,也就是每帧围绕z轴旋转2°
创建布尔类型是否可以旋转来判断自转的开关。
2.按键实现自转开关
创建自定义事件控制旋转
这里就相当于布尔值的取反,当我们第一次进来默认是false,我们按1键后执行这个自定义事件,这个布尔值变成true,接着执行事件Tick后的操作(也就是不停自转)。
当我们在转的时候按1键想停止自转,这时候布尔值是true,按1键后执行自定义事件变为false,停止自转。
接着我们进入ThirdPersonCharacter蓝图类,创建一个新图表,接着添加一个变量自转物体引用,将变量类型设置为上面创建的物体自传_BP蓝图类
这里我们引用外部蓝图类实现蓝图通信时需要先判断是否可用——Is Valid,否则直接引用会报错。
一切编写好后,我们不仅需要保存,同时还需要把刚刚引用的自传物体引用设置为公有,方便后面我们在场景中指定引用的特定物体。
打开这个选项后,我们需要点击编译才可以在场景中选中人物模型设置那个物体被引用,因为我们在蓝图只是一个蓝图类的引用,但是不是实例的引用,不清楚哪个需要自转。
这里我们可以自己选择物体指定,也可以吸附物体来指定。
接着我们测试发现功能实现了。
3.实现一堆物体自转
上面的我们只能实现对单个或者指定的多个实现控制自转,如果我们场景中需要一堆自转的,我们可以用下面的方法实现
这里ForEachLoop是循环遍历场景中所有该类的演员,和场景中所有演员都通信一次,即可实现每个物体都自转了。
简单解谜游戏
我们做一个小demo来对上面的功能实现一个汇总:首先玩家通过钥匙才能开门,接着要到达二层,需要想办法打开机关门,这里设计的思路是需要所有灯都打开才能让门打开进入电梯。
1.实现打开门的提示
我们需要在Door_BP蓝图类增加一个文本渲染组件,调整好角度后,设置他为不可见
蓝图中实现功能:进入盒体触发器范围内自动显示文本提示
打开门后关闭提示,关闭门后显示提示
2.实现开灯功能
创建LIght_BP蓝图类,添加组件如下:静态网格组件设置为挂灯类型,添加聚光源组件,接着用盒体触发器将他们包裹起来,按照上面添加文本提示。
这里需要将类型转换为第三人称类,一方面为了蓝图通信,一方面为了只有第三人称任务才可以触发开关事件
蓝图实现按E打开灯
3.打开所有灯触发机关
这里我们需要判断所有灯有没有打开,添加一个布尔类型的变量:是否打开灯
当我们打开灯时设置为true,反之为false。
接着我们需要循环遍历Light_BP中所有的演员,判断其是否打开。我们增加一个布尔变量:是否可以打开机关,如果所有的都打开了,我们设置这个布尔值为true,否则一旦有一个不符合标准这个值为false,并且推出这个循环。
这里我们之前用的ForEachLoop就不能满足要求了,我们需要用到ForEachLoopWithBreak。
当这个循环结束后,我们需要判断是否可以打开机关这个布尔值是否为true,如果是,则执行开启机关这一自定义事件。
多个角色控制权转换
在多主角游戏中,我们常常需要变化角色来实现不同的目的。
我们在场景中重复添加几个第三人称模型,打开关卡蓝图,将这些模型引入。接着我们用到MultiGate来实现多个目的的实现。
这里Radom就是随即执行任意引脚,loop就是可以循环执行,不会因为每个执行一次后就中断。
角色上下车功能
1.实现角色和车的通信
首先我们需要在项目中添加一个载具类的蓝图功能
接着将汽车类添加到场景中
将盒体触发器包裹住汽车类,接着自定义事件:上车
接着我们要在角色类中实现按F上车功能,需要添加一个汽车类Sedan的引用,在应用这个变量时,还得判断是否有效才能执行上车功能
接着我们回到汽车Sedan类,实现当我们角色到汽车旁边时,可以实现上车逻辑。
要实现角色和车之间的蓝图通信,需要类型转换,保证了只有角色到旁边才能实现上车逻辑,同时角色类中需要保证汽车类引用的有效性,所以我们在汽车类中需要设置角色类中的引用为他自身(汽车类)。
接着,我们需要角色走到汽车旁边按F键时,将控制权交给汽车。
2.实现角色上车位置的变换
上面我们只实现了视角的切换,但是人且不会移动到车的座位上。下面我们针对此来实现位置功能变换。
在汽车类添加一个球体触发器,位置移到座椅上,由于这个是来确定角色上车后的位置,需要把碰撞设为没有,防止和角色的胶囊体碰撞起冲突。
在角色类中引用自己
这是我们测试发现人确实上车时会移动到座位上,但是一旦车开走人却还在原地不动。解决这个问题,我们需要将角色依附在刚刚创建的球体触发器上,这样就可以随着球体触发器移动,而球体触发器是汽车的子组件,跟随着汽车移动。
这里我们需要设置的是保持场景而不是保持相对,因为这两个是不同蓝图类的对象,如果保持相对,角色对象就会根据球体触发器的位置旋转缩放来放置在场景中,不知道飞哪去了。
3.实现角色下车功能
角色下车功能和上车流程恰恰相反。
首先,我们需要将角色对象和汽车分离,接着需要变化到下车位置,同时打开人物碰撞,把控制权交给角色,在这期间还需要一个镜头的切换。
分离:
变换位置:这里需要注意在不需要缩放的同时,我们位置的旋转需要是z轴(平面的左右跟着动),否则摄像头切换好了也会歪。
开启碰撞+镜头转换:
4.下车减速功能
我们要实现角色下车汽车会自动减速停下来的功能。
这里讲一下汽车类自带的一个事件
这个的功能就是只要你按w他就会给轮子加速,为了防止我们下车后由于下车的瞬间还在按w导致后面停下来了轮子还在转,我们需要设置一个下车的布尔变量,默认为true。当我们上车时,设置为false。
这里我们引入Vechicle Movement,先把手刹拉上,再把油门速度减为0。
同时还要设置只有在车上时才能按w加速
冲刺、瞬移、多段跳
1.冲刺
实现按Shift加速角色行走
2.瞬移
如果连续按两次Shift,可以实现瞬移功能。
我们需要定义一个整数变量次数,每按一次Shift就+1,当大于等于2时可以实现瞬移效果,但是考虑到要短时间连续按,如果两秒之内没有按,我们则需要重置为0。
为了实现角色瞬移效果,我们首先需要得到角色的位置,接着我们还需要判断角色现在面朝哪个方向,我们需要按照这个方向来进行直线位移。
3.多段跳
这里我们只需要修改虚幻4给我们默认配置好的属性就行了
结语
👴把英雄联盟给删了,猜猜👴能撑多久😅