1. 创建一个蓝图接口
改个名字BPI_Interactable
设置第一个接口函数为Interact(就是把默认的NewFunction改个名)
这里除了改名和新增接口函数,基本什么都干不了(不能添加实现)
再添加一个有返回值的接口函数GetState
2. 创建一个TV
创建基于Actor的蓝图
并改名为BP_TV
添加一个StaticMesh并拖放到根节点
添加一个成员变量IsOn用来保存电视机当前的开关状态
在Class Settings中添加刚创建的蓝图接口BPI_Interactable
双击打开GetState接口并添加蓝图实现,并将IsOn作为接口返回
双击打开另外一个接口函数Interact并添加蓝图实现(这里会自动打开事件图表Event Graph,没有返回值的接口即事件)
准备一个图片作为电视机画面放到Contents目录
回到编辑器注意点Import导入这张图
基于这张图片创建一个纹理
将贴图连线改到自发光Emissive Color
回到BP_TV蓝图,完善Interact事件,跟随开关切换不同纹理
拖一个电视到地图
这里我改了下纹理,为了和开关区分一下
3. 添加输入映射,用按键控制开关
打开项目设置(输入映射在项目设置里)
在Engine - Input下添加Interact按键映射并绑定到F键
创建一个基于BP_ThirdPersonCharacter的自定义角色BP_MyChar(这里需要预先导入第三人称资源包)
打开BP_MyChar添加刚才添加的Interact按键映射
随便打印个字符串用于验证
修改当前地图Default Pawn Class
运行测试(注意需要按一下F键测试)
4. 利用Trace函数,获取角色面前的对象(以便调用开关功能)
在前面的角色蓝图BP_MyChar中添加一个SphereTraceByChannel(球形投射碰撞检测函数)
Start投射起点,End投射终点,Radius球形半径,Draw Debug Type投射显示类型(这里可以设置为For Duration,即显示投射线框并保持一段时间)
这里用角色当前位置作为投射起点,当前位置向前方向+100单位作为投射终点
运行测试(如果嫌不够粗,可以加Radius调整)
添加交互逻辑
Break Hit Result,里面包含需要交互的Actor
连线Hit Actor,触发Interact事件
运行测试(这电视勉强还能看)
5. 给灯也安排一个Interact
打开BP_Light添加BPI_Interactable蓝图接口
双击添加Interact事件,并连线ToggleLight事件
上一节灯的外形看不清,这里我们换一个好观察的网格体
为了让圆柱子能够够到灯罩,我们把灯罩位置调低一点
然后把柱子调粗一点
运行看看(完美!)
其它
- 引擎版本为5.3.2
- 参考:https://neil3d.github.io/assets/pdf/CUC-Week-8.pdf