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

Ursina游戏窗口震动实现咨询:内置方法无效时的替代方案

Ursina游戏震动效果实现方案

修复window.shake()无效的问题

Ursina内置的window.shake()实际是通过偏移相机模拟震动,若调用后无效果,可手动实现更可控的窗口级震动逻辑,直接操作相机位置:

from ursina import *
app = Ursina()

shake_duration = 1.0
shake_intensity = 0.1
shake_timer = 0

def update():
    global shake_timer
    if shake_timer > 0:
        shake_timer -= time.dt
        # 给相机添加随机偏移模拟震动
        camera.position = Vec3(
            random.uniform(-shake_intensity, shake_intensity),
            random.uniform(-shake_intensity, shake_intensity),
            camera.position.z
        )
        # 震动结束后重置相机到默认位置
        if shake_timer <= 0:
            camera.position = Vec3(0, 0, -10)

# 触发震动的函数
def trigger_shake():
    global shake_timer
    shake_timer = shake_duration

# 按空格触发震动测试
InputHandler.bind('space', trigger_shake)

app.run()

实现所有Entity同时震动

若需要场景内所有实体独立震动而非通过相机模拟,可遍历场景实体并实时修改其位置:

from ursina import *
app = Ursina()

# 创建测试实体
Cube()
Sphere(position=(2, 0, 0))
Text(text='按空格触发实体震动', origin=(0, -2))

shake_duration = 1.0
shake_intensity = 0.05
shake_timer = 0
entity_initial_positions = {}

def update():
    global shake_timer
    if shake_timer > 0:
        shake_timer -= time.dt
        for entity in scene.entities:
            if entity == camera:
                continue
            # 首次震动时记录实体初始位置
            if entity not in entity_initial_positions:
                entity_initial_positions[entity] = entity.position.copy()
            # 给实体添加随机偏移
            entity.position = entity_initial_positions[entity] + Vec3(
                random.uniform(-shake_intensity, shake_intensity),
                random.uniform(-shake_intensity, shake_intensity),
                random.uniform(-shake_intensity, shake_intensity)
            )
        # 震动结束后还原所有实体位置
        if shake_timer <= 0:
            for entity, pos in entity_initial_positions.items():
                entity.position = pos
            entity_initial_positions.clear()

def trigger_entity_shake():
    global shake_timer
    shake_timer = shake_duration

InputHandler.bind('space', trigger_entity_shake)

app.run()

注意事项

  • 可通过调整shake_intensity(震动幅度)和shake_duration(震动时长)参数适配需求
  • 大型场景中遍历所有实体可能有性能开销,建议给需要震动的实体添加标签,仅遍历带目标标签的实体

内容的提问来源于stack exchange,提问作者Alex Krakowiak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 09:06:30