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
相关产品推荐
相关产品推荐

