开关门【案例】

简单交互-开关门

本节将通过开关门案例带你了解人与世界场景中物体的简单交互过程。

简单场景搭建

  • 为了便于管理,我们新建一个文件夹名为openDoor存放我们所有资产

image-20230416195711196

  • 进入文件夹,新建关卡并构建一个简单场景
  1. 空白关卡中添加定向光源、天空大气和指数级高度雾使场景点亮
  2. 构建一个平台供物体摆放和人物活动,还可以通过更改材质改变平台样式

image-20230416200649899

  • 在内容中搜索资源door,找到SM_Door和SM_DoorFrame,复制一份到我们的openDoor文件夹中,顺便我们把机器人蓝图类也复制过去,后面需要对其进行操作

image-20230416201533818

image-20230416201732809

  • 新建一个蓝图类BP_Door,同时根据资源来构建门

image-20230416202135386

  • 将构建好的门拖入场景中

    image-20230416202332737

  • 基本场景就搭好了,如下图:

image-20230416202435802

开关门逻辑

基本原理:通过添加时间轴控制门的旋转角度

  • 在BP_Door蓝图中新增自定义事件OpenDoor,通过设置时间轴和相对旋转使门打开

image-20230416203459183

  • 上面只实现了关门,要想关门我们只需要使用Flip进行反转即可

image-20230416235313244

  • 这里我们使用了插值计算,将事件轴里的数值进行了相应的线性映射,时间轴设置如下,且需要注意以下两点:使用最后一个关键帧和自动播放(设置了自动播放,在自定义事件没有被调用的情况下,我们也能进入场景中观察蓝图是否使门旋转了,当我们后面调用了该自定义事件的时候,就需要关掉自动播放)

image-20230416203723880

  • 进入场景中,开门事件在没有调用的情况下打开了,就是由于我们设置了自动播放。

image-20230416204046999

开门自定义事件调用

自定义调用开门事件之前记得把上面时间轴中的自动播放给关了!!!

为了便于与之前我练习的一些资源进行区分,这里我在命名后面都加个数字2便于区分。

image-20230416233710277

获取类的对应Actor

在BP_ThirdPersonCharacter2蓝图中通过调用键盘操作来调用门的openDoor事件。这里我们获取了类的所有Actor,我们需要指定索引来获取对应的门,从而调用openDoor事件。

image-20230416234035078

场景中测试按1打开门

image-20230416234405141

按这种逻辑分别控制开三扇门,仅仅是映射和索引不同,那蓝图如下:

image-20230416234758523

上面这种开关门方式显然是不合理的,当我们由很多扇门的时候,不可能采用这种方式去控制,而且这种方式也没有限定距离,也就是说不管我在场景中的那个位置,只有按下设定的按键即可实现开关门,显然不合理。接下来就实现进入门指定范围就开门,离开指定范围就关门。

盒体碰撞检测

  • 进入BP_Door2蓝图,添加盒体碰撞检测并调整好Box Collision的位置和检测范围

image-20230416235853949

  • 调整好后的效果大致如下:

image-20230417000014582

  • 在BP_ThirdPersonCharacter2蓝图中创建一个变量door2,类型为BP_Door2,为了方便后面人物进入盒体碰撞器内触发重叠事件时能够调用openDoor事件。要注意开启小眼睛哦,否则无法在BP_Door2蓝图中引用这个door2变量。
image-20230417003531082

image-20230417003404132

  • 在BP_Door2蓝图中,编写调用逻辑

image-20230417003719991

  • 场景内效果:进入盒体碰撞范围内开门,离开关门,具体可以根据上面蓝图教程亲身体验下。

image-20230417003855216

这种方法的确比较只能,一定程度上也更为符合逻辑,这里的场景可以模拟自动门,但是更为常见的场景是在适当的范围内,通过操作开门,下面将介绍盒体碰撞范围内按钮开关门。

盒体碰撞配合按键

要想进入盒体触发器不主动调用开关门事件,只需要将BP_Door2蓝图中组件开始重叠、组件结束重叠事件的结尾断开调用,然后在BP_ThirdPersonCharacter2中通过按钮获取BP_Door2对象并进行调用openDoor事件

  • BP_Door2蓝图中断开openDoor调用

image-20230417212256202

  • 在BP_ThirdPersonCharacter2蓝图中,通过获取BP_Door2实例来调用openDoor事件,同时加上is Valid进行合法校验,避免编译错误。

image-20230417212541064

  • 盒体碰撞检测范围内,按2开关门

image-20230417212824425

  • 离开盒体碰撞检测范围,按2打印字符串Hello

image-20230417213000677

指定区域触发

在游戏中,常常有这样的场景:人物到达某一制定区域或这将箱子推到某个指定区域上,就会触发某个障碍物打开,比如这里的门,下面我们看看怎么实现。

  • 新增一个立方体形状或平面来构成开门的指定触发处

image-20230417213448055

  • 将立方体摆放在你想要摆放的任意位置,露出一个上表面即可,方便人物踩上去,当然你也可以设置一定高度,人物跳上去也可以,原理都一样,顺便给立方体加一个材质让其更显眼、更好看。

image-20230417213829169

  • 在触发处平面上添加一个触发框,检测人物是否在平面上,当然这里也可以使用盒体触发器,但是怎么简单怎么来,我们直接加触发框。

image-20230417214921524

  • 点击截图中按钮创建TriggerBox蓝图类,生成对应的蓝图文件TriggerBox_Blueprint2

image-20230417215605290

image-20230417215642203

  • 编辑蓝图,添加组件开始重叠时和组件结束重叠时事件

image-20230417220313730

  • 编辑蓝图

image-20230417221856648

  • 当我们到场景中实验的时候,发现报错了,无法访问属性door2,如下:

image-20230417222003494

  • 点击TriggerBox查看细节,发现我们的Door2为空,我们要去给这个变量赋值

image-20230417222106548

  • 有两种方式:直接选择BP_Door2类或者用吸管工具去吸取指定的门,且吸管吸收不到非门场景组件。

image-20230417222241668

  • 修改后,当人物站在指定位置上时,门成功打开了,离开指定区域,门就会关上

image-20230417222439496

要想实现推箱子开门,在场景中放入一个Actor并开启模拟物理、生成重叠事件即可

image-20230417223040745

  • 将箱子推到指定地面上,门打开

image-20230417223143635

接口实现

  • 创建一个蓝图接口,命名为BPI_OpenDoor

image-20230417225448176

image-20230417225534479

  • 编辑蓝图接口将默认函数进行重命名openDoorInterface2

image-20230417230016194

  • 在BP_Door2蓝图中去实现接口

image-20230417230547268

  • 在ThirdPersonCharacter2蓝图中去通过射线检测碰撞来调用接口实现开关门

image-20230417231212328

  • 人物会向设定方向发射设定长度的射线检测,检测到指定物体,尾端为绿色,否则为红色,检测成功则会触发接口,从而调用接口实现开门事件

image-20230417231450493

总结

​ 本节从最基础到最常见的开门方式都过了一遍,你应该对于场景中的简单交互以及蓝图之间的通信方式有一定的了解了,那么就动起手实际操作起来吧,让我们一起进步。