学习空间/调查交互:从检测到明确反馈
玩家与交互 / LESSON 15

调查交互:从检测到明确反馈

靠近只是候选,按键才是请求,成功还需要状态判断。

基础约 9 分钟阅读,实作另计7 节现在学
CONCEPT MAP先看一眼知识之间的联系
先看一眼知识之间的联系01发现候选02选中目标03接收一次操作04更新事实05显示结果
能够检测到玩家只是起点;提示、选中对象和实际执行结果必须指向同一个物件。

01一条可检查的交互链

建议先把链路拆成“找到候选 → 接收交互动作 → 判断当前允许 → 发出结果 → 显示反馈”。范围检测不等于立即触发全部剧情。正式项目之后可能需要最近目标、面对方向或优先级;第一个单物件实验先不建通用交互框架。

02完整单物件练习依赖

  1. Player 加入 player 组,仍按上一课移动。
  2. 创建 Area2D 练习物件,下面放 CollisionShape2D 与 Label,Label 命名 Hint。Mask 包含玩家所在 Layer。
  3. Input Map 加入 interact,绑定 E。
  4. 挂下方脚本。这里只用一个交互物件,文字“教学占位”不是正式房间调查内容。

03只接受一次按下的脚本

examine_practice.gd gdscript
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第二个物件出现后,为什么需要选中目标

在练习副本中放第二个调查物,让两个检测范围有一小块重叠。先观察原单物件方案在重叠处会发生什么,并把它当作能力边界实验,而不是正式使用方式。两个物件都知道玩家靠近,并不意味着它们知道玩家想调查谁;靠事件被哪个节点先收到,不能形成清楚可解释的优先级。

后续可让一个交互控制者维护候选列表,再按距离、朝向或明确优先级选一个目标。无论使用什么规则,屏幕提示必须和实际响应对象一致,不能提示左边却打开右边的内容。此阶段先画出候选、选中、执行三步,不必立刻建设庞大通用框架。验收应包含远处按键无效、重读不重复推进、提示来源正确和离开范围后撤销资格;正式谜题内容仍由设计决定。

动手后,再勾选

不是“我看懂了”,而是你在独立练习里做出并检查过。

CHECK YOUR UNDERSTANDING

换一个情景,你会怎么判断?

两个可调查范围重叠时,最可靠的下一步设计是什么?

用自己的话,留一条笔记

可以写“我之前以为……,现在发现……”,或者记录还没解决的问题。

仅保存在此浏览器0 / 20000

回到资料核对

本课是解释与练习,不替代对应版本的官方手册。网页实验不运行 Godot;未标明实机验证的代码,仍需在独立工程中检查。

把这课收进你的理解里。

标记已读不会自动勾选实作,也不代表游戏功能已经完成。

输入一个你想弄明白的问题。

按 Esc 关闭 · 标题、关键词和正文一起搜索