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)
错误点分析
轨道路径格式错误
Godot动画轨道的路径需遵循节点相对路径+属性的格式(如$Hammer/position),原代码中table.name+':'+type的写法不符合规范,导致无法正确关联节点属性。动画库空引用风险
animplayer.get_animation_library('das')如果找不到名为'das'的动画库会返回null,后续调用add_animation会直接报错,需先确保动画库存在。find_track判断逻辑错误
animation.find_track()找到轨道时返回索引(整数),未找到返回-1。原代码中if has:的判断会把索引0当成false,导致错误重复创建轨道。动态动画的显示特性
运行时动态创建的动画不会显示在远程资源管理器中,这是正常现象——只有编辑器中手动创建并保存的动画资源才会出现在资源管理器里。
修正后的代码
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
相关产品推荐
相关产品推荐

