第一步 – 创建蓝图
先创建门的类,在内容浏览器新建蓝图类命名为 Door_BP
。
第二步 – 设置蓝图的静态网格
进入 Door_BP
蓝图界面,添加组件静态网格组件
,分别添加门和门框的模型。这里需要确保门的坐标轴原点在门的右下角,这样会围绕这个支点进行旋转。
如果门的轴点不在右下角怎么办?可以创建一个个名为
Scene
的空场景,将门的静态网格组件放在空场景下做为子节点,将这个空结点的坐标原点移动到门框的右下角,再回到门中调整坐标原点即可,这样也能达到同样的效果。如果不这样做, 只能在3D建模软件中进行调整,建议不会3D建模直接按照上述方法修改即可。
第三步 – 创建检测碰撞的盒子
添加检测玩家用的盒体碰撞组件 — BoxCollision
,然后就可以写我们的蓝图事件了。
第四步 – 蓝图编写
写一个之前讲过的开门的蓝图,需要注意的是蓝图中的改变旋转尽量使用Set Relative Rotation
,改变相对旋转,避免使用全局旋转。
第五步 – 按键开门
编写按键开门需要用到Gate
结点,该节点的原理也类似于一个钥匙开门。将玩家的重叠组件连接到Open
表示玩家进入需要开门,然后开门的钥匙是按下E
键,所以在Enter
中连接Key E
结点来表示按下E
键才可以成功打开门,同理在Gate
结点的Close
上就应该连接上玩家重叠离开结点来表示玩家离开关门。
不要急,如果你按下E键你会发现门是打不开的,这是因为键盘输入其实没有被启动。所以在Gate
检测钥匙之前需要开启玩家的输入。使用EnableInput
,并将控制器连接至PlayerControl
的引用可以开启这点。
但是,再次按下E键没有办法关门?我们需要在门打开的时候告诉门,我又按下了一次E键,请翻转门的旋转好吗。为了做到这点,我们重写部分逻辑并使用Flip Out
结点来翻转请求:
这一次我们舍弃了离开门自动关门,改成了再次按下E
键换一条线路执行,这样就可以实现E
键关门的逻辑。但是因为我们没有在任何地方禁用键盘输入,所以就算离开门很远也能再次打开门。解决这个问题,在离开门的检测区域后关闭E键的读取即可。
到这里就是用E键开关门的全部,接下来是用鼠标点击开门的扩展案例。
扩展 – 鼠标点击门开门
1. 设置
要做到鼠标点击事件,我们可以类比键盘事件的步骤:启用点击事件输入 -> 使用点击事件。启用鼠标点击相比键盘输入相对步骤多一些。我们先要在主关卡的窗口中找到世界场景设置窗口,然后在游戏模式下选择第三人称游戏模式并找到玩家控制器创建一个新的玩家控制器PlayerController
进入到新创建的玩家控制器蓝图中,启用细节面板中的鼠标点击事件和显示鼠标。
2. 蓝图
这样就做好了前置的准备。在门中找到事件On Clicked
并将作为Gate
结点的Enter
,也就是钥匙。
恭喜你你成功的实现了E
和鼠标点击门实现开门。
当然你还可以实现在靠近门后鼠标显示,离开门后鼠标不显示。首先将之前的显示鼠标默认设置关闭,从玩家控制脚本中的返回值拖出一个Set Show Mouse Cursor
结点,即可设置显示鼠标显示,同理在离开检测区域时关闭显示。
当然,到这里是会出现一个报错的,也就是尝试获取空对象的引用(貌似不影响游戏正常运行),我给出的解决方案是在引用前判断是否为空指针,也就是利用蓝图中的IF语句Branch
来提前检测。