调查交互:从检测到明确反馈
靠近只是候选,按键才是请求,成功还需要状态判断。
01一条可检查的交互链
建议先把链路拆成“找到候选 → 接收交互动作 → 判断当前允许 → 发出结果 → 显示反馈”。范围检测不等于立即触发全部剧情。正式项目之后可能需要最近目标、面对方向或优先级;第一个单物件实验先不建通用交互框架。
02完整单物件练习依赖
- Player 加入 player 组,仍按上一课移动。
- 创建 Area2D 练习物件,下面放 CollisionShape2D 与 Label,Label 命名 Hint。Mask 包含玩家所在 Layer。
- Input Map 加入 interact,绑定 E。
- 挂下方脚本。这里只用一个交互物件,文字“教学占位”不是正式房间调查内容。
03只接受一次按下的脚本
extends Area2D
@onready var hint: Label = $Hint
var player_nearby: bool = false
var examined: bool = false
func _ready() -> void:
body_entered.connect(_on_entered)
body_exited.connect(_on_exited)
hint.text = ""
func _on_entered(body: Node2D) -> void:
if body.is_in_group("player"):
player_nearby = true
hint.text = "E · 调查教学占位物"
func _on_exited(body: Node2D) -> void:
if body.is_in_group("player"):
player_nearby = false
hint.text = ""
func _unhandled_input(event: InputEvent) -> void:
if not player_nearby:
return
if event.is_action_pressed("interact") and not event.is_echo():
get_viewport().set_input_as_handled()
if examined:
hint.text = "你已完成这次教学调查"
return
examined = true
hint.text = "教学占位:调查完成"04测试和扩展边界
测试远处按 E 无效、靠近有提示、首次与重复调查反馈不同、离开提示消失。多个范围重叠时,这个脚本没有做统一目标选择;set_input_as_handled 不能被当作完整的优先级系统。之后需要明确由一个交互控制者选中目标,再调用该目标,不依赖节点遍历顺序。
05先把玩家能看见的反馈写成一张表
调查系统不是按 E 后设置一个布尔值就结束了。先列四种玩家状态:远处、刚进入范围、已经调查、离开范围。给每种状态写一条应该出现或消失的反馈,再决定代码如何实现。远处通常不显示操作提示;刚靠近时说明能做什么;调查后给出内容或明确结果;离开时撤掉不再适用的提示。这样可以避免逻辑正确但玩家完全不知道发生了什么。
沿用本课单物件脚本,先不加第二个调查物。让一个没有看过代码的人只按屏幕提示操作,观察他能否知道何时可以按键、调查是否成功、是否需要继续做别的事。若他重复按键不是因为想测试,而是因为没看懂反馈,应优先改善提示与内容呈现,而不是责怪操作方式。
06把一次按下、持续按住和重复调查分开
键盘按住时可能产生重复事件,所以脚本要明确哪些输入算一次动作。但过滤按键重复并不能定义重复调查的游戏含义。玩家松开后再次按 E,是第二次主动操作;它可以重复显示说明,也可以提示已经完成,但不应意外重复发奖励或推进流程。先写清这两层规则:什么算一次输入,以及同一物件被再次操作时做什么。
做三组实验:轻按一次、持续按住、松开后再按三次。记录内容面板打开次数与状态推进次数,二者未必需要相同。例如允许再次阅读文字,但“已读过”的事实只从假变真一次。若用一个总开关禁止所有后续输入,可能连合理的重读也消失。不要只追求日志不重复,还要保留玩家应有的操作能力。
07第二个物件出现后,为什么需要选中目标
在练习副本中放第二个调查物,让两个检测范围有一小块重叠。先观察原单物件方案在重叠处会发生什么,并把它当作能力边界实验,而不是正式使用方式。两个物件都知道玩家靠近,并不意味着它们知道玩家想调查谁;靠事件被哪个节点先收到,不能形成清楚可解释的优先级。
后续可让一个交互控制者维护候选列表,再按距离、朝向或明确优先级选一个目标。无论使用什么规则,屏幕提示必须和实际响应对象一致,不能提示左边却打开右边的内容。此阶段先画出候选、选中、执行三步,不必立刻建设庞大通用框架。验收应包含远处按键无效、重读不重复推进、提示来源正确和离开范围后撤销资格;正式谜题内容仍由设计决定。
动手后,再勾选
不是“我看懂了”,而是你在独立练习里做出并检查过。
换一个情景,你会怎么判断?
两个可调查范围重叠时,最可靠的下一步设计是什么?
用自己的话,留一条笔记
可以写“我之前以为……,现在发现……”,或者记录还没解决的问题。
↗回到资料核对
本课是解释与练习,不替代对应版本的官方手册。网页实验不运行 Godot;未标明实机验证的代码,仍需在独立工程中检查。
标记已读不会自动勾选实作,也不代表游戏功能已经完成。