如何在Godot Animation Player时间轴添加标签并查询时间戳?
在Godot Animation Player中添加时间戳标签并实现前后查询
Godot没有原生的"标签轨道",但可以通过两种实用方式实现你的需求:
方法一:自定义属性轨道存储标签
- 在Animation Player中添加自定义属性轨道,绑定到AnimationPlayer自身的自定义变量(比如
var tags = {},格式为{标签名: 时间戳}) - 在需要标记的时间戳添加关键帧,将对应标签和时间戳写入这个变量
- 实现查询函数:
先提取所有标签的时间戳并排序,再通过对比当前时间找到前/后最接近的标签
示例代码(挂载到AnimationPlayer节点):
var tags = {} # 存储格式:{ "攻击帧": 0.5, "收招帧": 1.2 } func get_prev_tag(current_time: float) -> String: var sorted_times = sorted(tags.values()) var prev_time = -1.0 var target_tag = "" for time in sorted_times: if time < current_time && time > prev_time: prev_time = time target_tag = _find_tag_by_time(time) return target_tag func get_next_tag(current_time: float) -> String: var sorted_times = sorted(tags.values()) var next_time = INF var target_tag = "" for time in sorted_times: if time > current_time && time < next_time: next_time = time target_tag = _find_tag_by_time(time) return target_tag func _find_tag_by_time(target_time: float) -> String: for tag_name, time in tags: if time == target_time: return tag_name return ""
方法二:利用通知轨道实现标签
- 添加通知轨道,在目标时间戳添加通知,将通知内容设为标签名
- 通过解析动画轨道,提取所有通知的时间戳和标签名,再实现查询逻辑
示例代码片段:
func _get_all_notification_tags() -> Dictionary: var tags = {} var current_anim = $AnimationPlayer.current_animation if not current_anim: return tags var anim = $AnimationPlayer.get_animation(current_anim) for track_idx in range(anim.track_count): var track = anim.get_track(track_idx) if track.type == Animation.TYPE_NOTIFICATION: for key_idx in range(track.key_count): var time = track.get_key_time(key_idx) var tag_name = track.get_key_value(key_idx) tags[tag_name] = time return tags # 调用_get_all_notification_tags()获取标签后,复用方法一中的get_prev_tag/get_next_tag逻辑即可
两种方法对比
- 自定义属性轨道:更灵活,可存储额外标签信息,适合复杂场景
- 通知轨道:原生功能,编辑更直观,适合简单标签标记
内容的提问来源于stack exchange,提问作者Secret
相关产品推荐
相关产品推荐

