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

如何根据Unit的Action状态动态设置UnitAnimations的image属性

解决方法:根据状态动态访问对象属性

核心思路

Python的getattr()函数支持通过字符串形式的属性名,动态获取对象的属性值。结合Action枚举的name属性(对应idle/attack字符串),就能直接拿到UnitAnimations中对应的动画列表,再取指定帧赋值给image即可。

方法1:直接在Unit.update()中实现

修改Unit类的update方法,用getattr动态获取对应动画列表:

from enum import IntEnum

class Action(IntEnum):
    idle = 0
    attack = 1

class UnitAnimations:
    def __init__(self, idle_list, attack_list):
        self.idle = idle_list
        self.attack = attack_list
        self.image = idle_list[0]

# 示例动画列表,实际替换为你的资源
idle_list = ["idle_frame_0", "idle_frame_1"]
attack_list = ["attack_frame_0", "attack_frame_1", "attack_frame_2"]

class Unit:
    def __init__(self, name):
        self.name = name
        self.action = Action.idle
        self.animations = UnitAnimations(idle_list, attack_list)

    def update(self):
        frame_index = 0
        # 动态获取当前动作对应的动画列表
        current_anim_list = getattr(self.animations, self.action.name)
        # 设置当前帧的image
        self.animations.image = current_anim_list[frame_index]

方法2:封装到UnitAnimations类中(更优雅)

把动态设置image的逻辑封装到UnitAnimations内部,让职责划分更清晰:

from enum import IntEnum

class Action(IntEnum):
    idle = 0
    attack = 1

class UnitAnimations:
    def __init__(self, idle_list, attack_list):
        self.idle = idle_list
        self.attack = attack_list
        self.image = idle_list[0]
    
    def set_image_by_action(self, action, frame_index):
        # 动态获取对应动作的动画列表
        anim_list = getattr(self, action.name)
        # 可选:添加索引越界判断,避免报错
        if 0 <= frame_index < len(anim_list):
            self.image = anim_list[frame_index]
        else:
            # 索引无效时默认取第一帧,也可根据需求抛出异常
            self.image = anim_list[0]

idle_list = ["idle_frame_0", "idle_frame_1"]
attack_list = ["attack_frame_0", "attack_frame_1", "attack_frame_2"]

class Unit:
    def __init__(self, name):
        self.name = name
        self.action = Action.idle
        self.animations = UnitAnimations(idle_list, attack_list)

    def update(self):
        frame_index = 0
        # 调用封装好的方法设置image
        self.animations.set_image_by_action(self.action, frame_index)

补充说明

  • Action作为IntEnum,每个枚举成员的name属性会返回对应的字符串(比如Action.idle.name返回"idle"),刚好和UnitAnimations中的属性名匹配,完美适配动态获取的需求。
  • 如果后续新增动作(比如move),只需在Action中添加枚举项,同时给UnitAnimations添加对应的列表属性即可,无需修改动态获取的逻辑,扩展性强。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 10:50:23