第四章:实现交互 - 点击击打与分数反馈
本章概述
在第三章中,我们创建了游戏的"大脑"——GameMode,现在我们需要为玩家提供"手脚"——交互能力。本章将实现玩家输入和击打交互系统,让玩家能够真正击打地鼠并获得实时反馈。
本章学习目标:
- 学习设置UE5输入系统
 - 掌握射线检测(Raycast)原理和应用
 - 实现精确的击中检测逻辑
 - 完成GameMode与地鼠间的击中通信
 
4.1 理解玩家输入系统
在UE5中,玩家输入通过输入操作(Input Action) 和输入映射上下文(Input Mapping Context) 来管理。这种架构让我们能够灵 活定义各种输入方式。
输入系统核心概念:
- 输入操作:定义抽象的交互动作(如"击打")
 - 映射上下文:将具体输入设备(鼠标、键盘)映射到输入操作
 - 输入处理流程:硬件输入 → 映射上下文 → 输入操作 → 游戏逻辑
 
4.2 设置输入系统
步骤1:创建输入操作(Input Action)
- 创建输入操作资源
- 在内容浏览器中右键 → 输入 → 输入操作 - 命名为IA_LeftMouseClick - 值类型选择"布尔型"(Boolean) 

- 创建输入映射上下文(Input Mapping Context)
- 右键 → 输入 → 输入映射情景 - 命名为IMC_WhacAMole 

- 配置输入映射
打开IMC_WhacAMole,在映射栏中添加IA_LeftMouseClick 添加触发器:鼠标左键(Left Mouse Button) 

步骤2:设置PlayerController输入
- 创建BP_PlayerController
- 在Blueprints文件夹中 右键 → 蓝图类 → 玩家控制器
 - 命名为
BP_PlayerController - 修改BP_WhacAMoleGameMode中的玩家控制类

 - 打开BP_PlayerController添加如下逻辑
 
在事件BeginPlay中: → 获取PlayerController → 添加映射上下文(Add Mapping Context) 

4.3 实现射线检测(Raycast)击打系统
步骤3:理解射线检测原理
射线检测是检测鼠标是否击中3D物体的核心技术。其工作原理是:从摄像机位置发射一条不可见的"激光",检测与场景中物体的碰撞点。
打地鼠游戏中的射线检测流程:
- 获取鼠标点击的屏幕位置
 - 将屏幕坐标转换为3D世界空间的射线
 - 检测射线与地鼠碰撞体的交点
 - 判断击中的是否是活跃的地鼠
 
步骤4:在PlayerController中实现射线检测
- 
创建鼠标点击事件处理
在PlayerController蓝图: - 添加IA_LeftMouseClick事件 - 在事件中调用射线检测函数 - 
设置Mouse的碰撞
- 双击打开Mouse的静态网格体
 - 修改碰撞复杂度

 
 
步骤5:详细的射线检测实现
关键蓝图节点配置:
获取玩家控制器 → 获取鼠标位置 → 消除到世界的变换
→ LineTraceByChannel(射线检测) → 分支判断是否击中
→ 如果击中:获取击中的Actor → 类型转换为BP_Mole
→ 如果转换成功:获取bIsActive变量 → 如果为True:调用地鼠的OnHit事件
射线检测参数设置:
- 碰撞通道:使用Visibility或自定义碰撞通道
 - 检测距离:1000-5000单位(根据场景大小调整)

 
4.4 实现击中反馈系统
步骤6:完善地鼠的OnHit事件
- 修改BP_Mole的OnHit事件
OnHit事件完整逻辑: - 检查bIsActive,如果为True:设置bIsActive为False调用GameMode的AddScore函数调用Hide事件(立即隐藏地鼠) - 否则:忽略此次击中 

4.5 调试和优化
步骤7:添加调试功能
添加调试信息输出
关键位置添加Print String:
- 射线检测开始:"检测鼠标点击"
- 击中地鼠:"击中地鼠!分数+X"
- 未击中:"未击中目标"
步骤8:性能优化考虑
- 
优化射线检测频率
避免每帧检测,只在点击时检测 使用对象池管理特效实例 优化碰撞体复杂度 - 
输入处理优化
使用输入操作的Started事件而非持续检测 添加点击冷却时间(避免连点作弊) 移动平台适配(触摸输入) 
4.6 完整系统集成测试
步骤9:全面测试交互系统
- 
功能测试清单
✅ 鼠标点击触发射线检测 ✅ 击中活跃地鼠:加分+隐藏地鼠 ✅ 击中非活跃地鼠:无反应 ✅ 未击中任何物体:无反应 ✅ 分数系统正确累加 - 
边界情况测试
- 快速连续点击测试 - 多地鼠同时存在时的击中精度 - 游戏结束后的输入屏蔽 - 不同屏幕分辨率下的点击准确性 
4.7 常见问题解决方案
问题1:射线检测无法击中地鼠
- 检查地鼠碰撞体设置和碰撞通道匹配
 - 确认射线检测距离足够长
 - 检查地鼠的碰撞体是否与视觉模型匹配
 
问题2:点击响应延迟
- 优化射线检测的执行频率
 - 检查动画播放是否阻塞主线程
 - 验证输入映射上下文优先级
 
问题3:多人游戏适配
- 确保射线检测在客户端和服务端同步
 - 使用授权RPC调用处理分数修改
 
问题4:移动平台适配
- 将鼠标点击替换为触摸输入
 - 调整射线检测的起始位置逻辑
 
4.8 本章完整蓝图结构
PlayerController关键逻辑:
事件输入操作已触发:

地鼠OnHit事件:

4.9 本章总结
已完成的核心功能:
- ✅ 配置了完整的输入处理系统
 - ✅ 实现了精确的射线检测击中检测
 - ✅ 建立了地鼠击中反馈机制
 - ✅ 完成了分数系统的实时更新
 
技术要点回顾:
- 射线检测是3D交互的核心技术
 - 输入映射上下文让输入管理更加灵活
 - 调试可视化是开发过程中的重要工具
 
4.10 下一步预览
在第五章中,我们将:
- 创建完整的UMG用户界面系统
 - 实现游戏内HUD(分数、时间显示)
 - 制作开始菜单和结束界面
 - 学习数据绑定和UI动画
 
作业:
- 测试击中检测的准确性,调整碰撞体大小
 - 尝试不同的击中特效,找到最适合的视觉效果
 - 优化射线检测性能,确保在各种情况下流畅运行
 
当前项目状态:
现在你的打地鼠游戏已经具备了完整的交互能力!玩家可以点击击打地鼠,获得实时分数反馈,游戏体验基本成型。
在下一章中,我们将为游戏添加精美的用户界面,让游戏信息显示更加专业和美观。
如果在实现过程中遇到任何射线检测或输入处理的问题,欢迎在评论区讨论具体现象,我们会一起找到解决方案!
