You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Godot 3D手电筒代码修改求助:改为左键单击切换开关状态

修改方案:实现手电筒 Toggle 开关逻辑

原代码的问题在于使用Input.is_action_pressed持续检测按键按住状态,导致松开按键就触发关闭逻辑。要实现按一次开启、再按一次关闭的效果,需要切换状态而非依赖按键按住状态:

修改步骤与完整代码

extends Node3D

# 新增变量:跟踪手电筒的开关状态
var is_flashlight_on = false

func _input(event: InputEvent) -> void:
    # 仅检测按键按下的瞬间(单次触发,而非持续按住)
    if event.is_action_just_pressed("Toggle"):
        # 翻转当前开关状态
        is_flashlight_on = !is_flashlight_on
        
        # 根据状态和电池余量控制灯光
        if is_flashlight_on and $Battery.value > 0:
            $SpotLight3D.light_energy = 16
        else:
            $SpotLight3D.light_energy = 0
            # 电池耗尽时同步状态,避免逻辑冲突
            if $Battery.value <= 0:
                is_flashlight_on = false

func _physics_process(delta: float) -> void:
    # 基于状态变量判断是否消耗电池(比检测灯光参数更可靠)
    if is_flashlight_on and $Battery.value > 0:
        # 乘以delta让消耗速率与帧率无关,保证跨设备一致性
        $Battery.value -= 0.05 * delta
        # 电池耗尽时自动关闭手电筒
        if $Battery.value <= 0:
            $SpotLight3D.light_energy = 0
            is_flashlight_on = false

关键修改说明

  • 状态变量is_flashlight_on:专门记录手电筒开关状态,避免依赖灯光参数判断状态(逻辑更稳定)
  • event.is_action_just_pressed:仅在按键按下的第一帧触发,确保每次点击只执行一次状态切换
  • 电池耗尽处理:自动同步状态并关闭灯光,防止出现“状态显示开启但实际无灯光”的矛盾情况
  • 消耗乘以delta:让电池消耗速率不受帧率影响,不同设备上的消耗速度保持一致

内容的提问来源于stack exchange,提问作者Cold Ghost34

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 14:49:56