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
相关产品推荐
相关产品推荐

