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

Ursina实现实体沿朝向移动:点击生成投射体遇问题求助

Ursina 左键点击发射投射体问题解决方案

你的代码问题分析

  • 第一段代码的问题:

    1. 使用held_keys['left mouse']会导致每帧按住左键都生成新投射体,而每个投射体只在生成的那帧执行一次位置更新,之后就不再移动——本质是一堆只动了一下的立方体叠在一起,看起来像没移动。
    2. 应该检测鼠标按下的瞬间而非持续按住,要用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 21:55:12