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

如何在动画关键帧中存储元数据?解决基础类型存储无效问题

解决方案:动画关键帧存储元数据(适配基础数据类型)

针对基础数据类型无法用set_meta存储元数据的问题,提供三个可行方案:

方案1:自定义动画轨道(推荐)

创建专门的元数据存储轨道,与原动画轨道的关键帧按索引关联,完全不影响原有轨道的数据类型:

class_name MetaAnimationTrack extends AnimationTrack

# 存储结构:key_idx -> {元数据键: 元数据值}
var key_metadata: Dictionary = {}

# 设置关键帧元数据
func set_key_meta(key_idx: int, meta_key: String, meta_value: Variant) -> void:
    if not key_metadata.has(key_idx):
        key_metadata[key_idx] = {}
    key_metadata[key_idx][meta_key] = meta_value

# 获取关键帧元数据
func get_key_meta(key_idx: int, meta_key: String) -> Variant:
    return key_metadata.get(key_idx, {}).get(meta_key, null)

使用方式:

  1. 在动画中添加一个MetaAnimationTrack轨道
  2. 原轨道每新增一个关键帧,就在元数据轨道的对应索引位置存储元数据
  3. 播放动画时,通过当前关键帧索引从元数据轨道中读取对应数据

方案2:包装基础类型为Object

把Rect2这类基础类型包裹到自定义Object子类中,让它支持set_meta:

class_name WrappedValue extends Object
var value: Variant

# 快速包装方法
static func wrap(val: Variant) -> WrappedValue:
    var wrapper = WrappedValue.new()
    wrapper.value = val
    return wrapper

使用方式:

# 存储:包装Rect2并设置元数据
var wrapped_rect = WrappedValue.wrap(Rect2(0, 0, 100, 100))
wrapped_rect.set_meta("data", "自定义值")
track_set_key_value(track_idx, key_idx, wrapped_rect)

# 读取:解包获取实际值和元数据
var wrapped = track_get_key_value(track_idx, key_idx)
var meta_data = wrapped.get_meta("data")
var actual_rect = wrapped.value

注意:需要将动画轨道的目标属性类型改为WrappedValue,或通过节点的自定义get/set方法透明处理包装逻辑。

方案3:利用动画全局元数据关联关键帧

在Animation本身的元数据中维护关键帧与元数据的映射,无需修改原有轨道:

# 存储元数据:用"轨道索引:关键帧索引"作为唯一标识
var key_id = "%d:%d" % [track_idx, key_idx]
$AnimationPlayer.animation.set_meta("key_meta_" + key_id, {"data": "自定义值"})

# 获取元数据
var key_id = "%d:%d" % [track_idx, key_idx]
var meta_data = $AnimationPlayer.animation.get_meta("key_meta_" + key_id, {})

缺点:删除关键帧时需要手动清理对应的元数据,否则会留下无效数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 13:10:56