Ursina实现实体沿朝向移动:点击生成投射体遇问题求助
Ursina 左键点击发射投射体问题解决方案
你的代码问题分析
第一段代码的问题:
- 使用
held_keys['left mouse']会导致每帧按住左键都生成新投射体,而每个投射体只在生成的那帧执行一次位置更新,之后就不再移动——本质是一堆只动了一下的立方体叠在一起,看起来像没移动。 - 应该检测鼠标按下的瞬间而非持续按住,要用
mouse.left_down。
- 使用
第二段代码的问题:
你写的While True是死循环(Python关键字是小写while),这个循环会直接卡死Ursina的主线程——Ursina靠主循环每帧刷新画面,死循环会让程序永远停在这里,直接导致窗口崩溃。
正确实现代码
from ursina import * app = Ursina() # 自定义投射体类,自带移动逻辑 class Projectile(Entity): def __init__(self, target_pos, **kwargs): super().__init__(model='cube', texture='white_cube', color=color.white, scale=0.5, **kwargs) # 朝向点击的目标位置 self.look_at_2d(target_pos) # 投射体移动速度,可自行调整 self.speed = 5 def update(self): # 每帧沿朝向移动,乘以time.dt保证帧率无关的匀速移动 self.position += self.forward * self.speed * time.dt def update(): # 只在鼠标左键按下瞬间生成一个投射体 if mouse.left_down: # 用鼠标的世界坐标作为目标(2D场景下也可直接用mouse.position) Projectile(target_pos=mouse.world_position) app.run()
关键说明
- 把投射体的移动逻辑封装到自定义类的
update方法里,每个投射体每帧都会自动更新位置。 - 用
mouse.left_down确保点击一次只生成一个投射体,避免重复创建。 - 乘以
time.dt是为了让移动速度不受帧率影响,不同设备上移动效果一致。
内容的提问来源于stack exchange,提问作者Colin Thorstenson
相关产品推荐
相关产品推荐

