如何可靠获取添加关键帧对应的Node节点?
解决Animation关键帧对应节点的可靠获取方法
你的问题核心在于Animation是Resource类型,不属于节点树,无法直接获取场景上下文,原来的get_local_scene()调用本身就是错误的(Animation类没有这个方法),只是编辑器环境下的特殊表现让它仅在AnimationPlayer为场景根时偶然生效。
以下是可靠的解决方案:
步骤1:让Custom_Animation持有所属AnimationPlayer的引用
修改Custom_AnimationPlayer,在创建Custom_Animation实例时传递自身引用,让资源能关联到节点树上下文:
tool extends AnimationPlayer func add_animation(name : String, animation: Animation): var ani = Custom_Animation.new() ani.animation_player = self # 传递AnimationPlayer引用 add_animation(name, ani)
步骤2:通过AnimationPlayer解析节点路径
修改Custom_Animation,利用持有的AnimationPlayer(节点类型,可访问节点树)来获取关键帧对应的节点,覆盖多种路径格式场景:
tool extends Animation class_name Custom_Animation var animation_player: AnimationPlayer # 保存所属的AnimationPlayer引用 func track_insert_key(track_idx : int, time : float, key, transition : float = 1) -> void: var key_idx = track_find_key(track_idx, time, true) .track_insert_key(track_idx, time, key, transition) var track_path = track_get_path(track_idx) var key_node: Node = null # 优先尝试相对路径(相对于AnimationPlayer) key_node = animation_player.get_node_or_null(track_path) if not key_node: # 尝试从当前场景根查找路径 key_node = animation_player.get_tree().get_current_scene().get_node_or_null(track_path) if not key_node: # 最后尝试从全局根节点查找绝对路径 key_node = animation_player.get_tree().get_root().get_node_or_null(track_path) if key_node: # 此处可正常使用key_node print("成功获取节点:", key_node.name) else: print("无法找到对应节点,路径:", track_path)
原理说明
- Animation作为资源本身不依赖节点树,必须通过关联的AnimationPlayer(节点类型)才能获取场景上下文。
- 多轮路径查找覆盖了编辑器中添加轨道的两种常见格式:相对路径(相对于AnimationPlayer)和绝对路径(相对于场景根/全局根),确保AnimationPlayer在任何节点层级下都能定位到目标节点。
内容的提问来源于stack exchange,提问作者cak3_lover
相关产品推荐
相关产品推荐

