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

GDScript创建Godot动画失败:远程资源管理器无对应动画

Godot动态创建动画失败问题排查

问题概述

通过数组动态生成AnimationPlayer的动画,但动画未成功生成,远程资源管理器中无法找到该动画,相关截图及代码如下:

远程资源管理器截图

原代码:

extends Node3D

@onready var animplayer:AnimationPlayer=$fire


var animation_table=[{'rotation':Vector3(0,0,-1),'time':0.60,'position':Vector3(0,0,0),'name':'Hammer'},
{'rotation':Vector3(0,0,-1),'time':0.60,'position':Vector3(0,0,0),'name':'Handle'},
{'rotation':Vector3(0,0,-1),'time':0.63,'position':Vector3(0,0,0),'name':'Joint'},
{'rotation':Vector3(0,0,-1),'time':0.9,'position':Vector3(0,0,0),'name':'Barrel'}]

func _ready():
    var animname='base'
    var base_library=animplayer.get_animation_library('das')
    var new_animation=Animation.new()
    var added=base_library.add_animation(animname,new_animation)
    var animation=base_library.get_animation(animname)
    
    
    for table in animation_table:
        for type in ['position','rotation']:
            var track_path=table.name+':'+type
            var track_name=track_path+'_track'
            var a:String
            var anim_type='TYPE_'+type.to_upper()+'_3D'
            var track
            var has=animation.find_track(track_path,Animation[anim_type])
            print(has)
            
            if has:
                track=has
            else:
                track=animation.add_track(Animation[anim_type])
            
            animation.track_set_path(track,track_path)
            animation.track_insert_key(track,float(table.time),table[type])

    animplayer.play(animname)

错误点分析

  1. 轨道路径格式错误
    Godot动画轨道的路径需遵循节点相对路径+属性的格式(如$Hammer/position),原代码中table.name+':'+type的写法不符合规范,导致无法正确关联节点属性。

  2. 动画库空引用风险
    animplayer.get_animation_library('das')如果找不到名为'das'的动画库会返回null,后续调用add_animation会直接报错,需先确保动画库存在。

  3. find_track判断逻辑错误
    animation.find_track()找到轨道时返回索引(整数),未找到返回-1。原代码中if has:的判断会把索引0当成false,导致错误重复创建轨道。

  4. 动态动画的显示特性
    运行时动态创建的动画不会显示在远程资源管理器中,这是正常现象——只有编辑器中手动创建并保存的动画资源才会出现在资源管理器里。

修正后的代码

extends Node3D

@onready var animplayer: AnimationPlayer = $fire

var animation_table = [
    {'rotation': Vector3(0,0,-1), 'time': 0.60, 'position': Vector3(0,0,0), 'name': 'Hammer'},
    {'rotation': Vector3(0,0,-1), 'time': 0.60, 'position': Vector3(0,0,0), 'name': 'Handle'},
    {'rotation': Vector3(0,0,-1), 'time': 0.63, 'position': Vector3(0,0,0), 'name': 'Joint'},
    {'rotation': Vector3(0,0,-1), 'time': 0.9, 'position': Vector3(0,0,0), 'name': 'Barrel'}
]

func _ready():
    var animname = 'base'
    # 确保目标动画库存在,不存在则创建
    var base_library = animplayer.get_animation_library('das')
    if not base_library:
        base_library = animplayer.add_animation_library('das', AnimationLibrary.new())
    
    var new_animation = Animation.new()
    base_library.add_animation(animname, new_animation)
    var animation = base_library.get_animation(animname)
    
    for table in animation_table:
        for type in ['position', 'rotation']:
            # 修正为Godot标准的节点相对路径格式
            var track_path = $" + table.name + "/" + type
            # 直接使用枚举值,避免字符串转译错误
            var anim_type = Animation.TYPE_POSITION_3D if type == 'position' else Animation.TYPE_ROTATION_3D
            
            # 正确判断轨道是否存在
            var track_index = animation.find_track(track_path, anim_type)
            var track
            
            if track_index != -1:
                track = track_index
            else:
                track = animation.add_track(anim_type)
                animation.track_set_path(track, track_path)
            
            # 插入关键帧
            animation.track_insert_key(track, float(table.time), table[type])

    animplayer.play(animname)

额外说明

  • 需确保当前Node3D节点下(或AnimationPlayer节点的作用范围内)存在名为Hammer、Handle、Joint、Barrel的子节点,否则动画无法找到目标节点生效。
  • 如果需要将动态生成的动画持久化保存,可以在运行时调用ResourceSaver.save()将Animation对象保存为.tres或.res资源文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 13:17:14