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

如何可靠获取添加关键帧对应的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 02:30:50