如何在动画关键帧中存储元数据?解决基础类型存储无效问题
解决方案:动画关键帧存储元数据(适配基础数据类型)
针对基础数据类型无法用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)
使用方式:
- 在动画中添加一个
MetaAnimationTrack轨道 - 原轨道每新增一个关键帧,就在元数据轨道的对应索引位置存储元数据
- 播放动画时,通过当前关键帧索引从元数据轨道中读取对应数据
方案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
相关产品推荐
相关产品推荐

