如何在Ursina Engine Python3.8中隐藏实体?手电筒代码故障求助
Ursina手电筒功能修复方案
原代码存在的问题
- 使用
time.sleep(1.0)会阻塞Ursina的主循环,程序直接冻结1秒,期间无法渲染实体,导致你看不到光束显示就被设置为不可见。 update()函数每帧都会执行,按住按键1时会反复调用flashlight(),瞬间生成大量重复实体,即使修复sleep问题也会出现异常。
修复后的代码
from ursina import * app = Ursina() # 提前创建手电筒实体,初始设为隐藏 flashlight_beam = Entity(model='sphere', scale=4, color=color.light_gray, visible=False) def toggle_flashlight(): # 只有当光束未显示时才触发 if not flashlight_beam.visible: flashlight_beam.visible = True # 用Ursina自带的invoke实现延迟隐藏,不阻塞主循环 invoke(setattr, flashlight_beam, 'visible', False, delay=1) def update(): # 检测按键按下的瞬间(而非持续按住),避免重复触发 if held_keys['1 down']: toggle_flashlight() app.run()
关键修改说明
- 提前创建实体:避免每次按键都生成新的实体,减少资源消耗,同时保证操作的是同一个光束。
- 改用
'1 down'检测:只在按键按下的第一帧触发函数,不会因为按住按键重复执行。 - 使用
invoke()替代time.sleep():Ursina的invoke()会在主循环中延迟执行指定操作,不会冻结程序,确保光束能正常显示1秒后再隐藏。 - 增加可见性判断:防止在光束显示期间重复触发,导致提前隐藏。
内容的提问来源于stack exchange,提问作者robot228
相关产品推荐
相关产品推荐

