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

Ursina引擎自定义Enemy类调用animate_x动画报错duration未定义如何解决

Ursina自定义Entity类动画实现方案

现有代码错误点

  • animate_x是Entity类的内置实例方法,而非可赋值属性,你代码中self.animate_x = (12, duration == 1)的写法属于调用逻辑错误
  • duration == 1是比较运算,此处应为关键字参数赋值,使用duration=1,直接写duration == 1会尝试读取未定义的duration变量,自然抛出未定义错误
  • update方法会每帧执行一次,若直接在无判断的update内调用动画方法,会每帧重复触发动画,导致动画永远无法正常播放完成

正确实现代码示例

from ursina import *

# 类名建议遵循大驼峰命名规范
class Enemy(Entity):
    def __init__(self, x, y):
        # 初始化父类时可直接传入属性参数,简化代码
        super().__init__(
            model = 'quad',
            color = color.green,
            collider = 'box',
            scale = (1, 2),
            position = (x, y)
        )
        self.posx = x
        # 若需要初始化后立即触发动画,直接放在__init__末尾即可,避免重复调用
        # 示例:沿x轴移动到坐标12,动画时长1秒,线性匀速
        self.animate_x(12, duration=1, curve=curve.linear)

    def update(self):
        # 若需要条件触发动画,需加状态判断避免重复触发,示例:
        # if distance(self, player) < 5 and not self.is_running_animation:
        #     self.is_running_animation = True
        #     self.animate_x(player.x, duration=0.5)

        # 原有碰撞逻辑保留
        touch = self.intersects(ignore=(ground, player))
        if touch.hit:
            destroy(self, delay=0.05)

动画调用核心规则

  • Ursina内置动画均为方法调用格式,常用动画方法如下:
    • 单轴位移:animate_x(目标坐标, duration=动画时长, curve=缓动曲线)、animate_y()、animate_z()
    • 全轴位移:animate_position((x,y,z), duration=动画时长)
    • 缩放:animate_scale(缩放值, duration=动画时长)
    • 透明度:animate_alpha(透明度, duration=动画时长)
  • 动画方法的可选参数curve用于指定缓动效果,常用的有curve.linear(匀速)、curve.ease_in_out(淡入淡出)等
  • 不要在无判断的update内直接调用动画,必须添加状态标记判断动画是否正在运行,避免每帧重复触发覆盖上一次动画请求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 10:15:03