You need to enable JavaScript to run this app. 如何在Ursina开发的3D FPS游戏中展示非3D模型的武器手臂图片
优惠活动
大模型
产品
解决方案
定价
更多

如何在Ursina开发的3D FPS游戏中展示非3D模型的武器手臂图片

Ursina 3D FPS游戏2D手臂实现方案

核心实现思路

你之前尝试的方案方向接近,只需要调整两个核心配置就能满足需求:将显示载体绑定到相机UI层而非场景对象,用序列帧替代GIF实现动效。

具体实现步骤

  • 第一步:处理动效素材
    把你准备的GIF手臂动图逐帧导出为带透明通道的PNG序列,按规则命名(如待机序列为arm_idle_0.png、arm_idle_1.png,射击序列为arm_shoot_0.png、arm_shoot_1.png),放在项目的textures目录下。
  • 第二步:绑定UI层序列帧动画
    用Ursina内置的Animation类加载序列帧,核心是指定父对象为camera.ui,这样动画会固定在视野顶层,不会作为场景对象被其他物体遮挡,也不需要额外配置跟随逻辑。
    示例代码如下:
    from ursina import *
    
    app = Ursina()
    
    # 初始化待机动画
    player_arm = Animation(
        name_prefix = 'arm_idle_',
        fps = 12, # 与原GIF帧率保持一致即可
        loop = True,
        parent = camera.ui, # 核心参数:绑定到相机UI层
        scale = (0.7, 0.45), # 按需求调整手臂显示大小
        position = (0.1, -0.4) # 调整位置匹配持枪视角
    )
    
    # 射击触发逻辑示例
    def input(key):
        if key == 'left mouse down':
            # 切换射击动画,播放完成自动切回待机
            player_arm.play(name_prefix='arm_shoot_', fps=30, loop=False)
            invoke(
                setattr, 
                player_arm, 
                'texture_sequence', 
                'arm_idle_', 
                delay=0.15 # 延迟时长等于射击动画总时长
            )
            # 附加后坐力位移效果
            player_arm.animate_position((0.1, -0.38), duration=0.05)
            player_arm.animate_position((0.1, -0.4), duration=0.05, delay=0.05)
    
    Sky()
    app.run()
    
  • 第三步:适配调整
    不同分辨率下可以通过监听窗口大小变化,动态调整player_arm的scale和position参数,保证在各种屏幕比例下显示位置正确。

优化提示

  • 序列帧素材尺寸不要超过1024*1024,避免不必要的性能消耗
  • 不需要交互时可以将player_arm.collision设置为None,关闭碰撞检测减少算力占用
  • 如果需要做武器切换,直接调用player_arm.play()切换对应武器的序列帧前缀即可

内容的提问来源于stack exchange,提问作者Quantum Sushi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 05:36:02