设置自定义属性动画关键帧时,如何自动添加其他属性关键帧?
实现自定义属性关键帧自动关联其他属性的动画关键帧
完全可以实现,而且不需要修改AnimationPlayer或Animation节点本身,通过编写编辑器插件监听关键帧添加事件即可达成需求。以下是具体实现方案:
核心思路
通过编辑器插件监听动画编辑器的keyframe_added信号,当检测到自定义属性被添加关键帧时,自动为目标属性(比如Position和Rotation Degrees)在同一时间点插入关键帧。
代码实现(Godot 3.x/4.x 通用,需调整细节适配版本)
创建一个@tool脚本作为编辑器插件:
@tool extends EditorPlugin func _enter_tree(): # 获取动画编辑器实例并监听关键帧添加事件 var animation_editor = get_editor_interface().get_animation_editor() if animation_editor: animation_editor.connect("keyframe_added", self, "_on_keyframe_added") func _on_keyframe_added(animation: Animation, track_index: int, time: float): # 获取当前选中的动画目标节点 var selected_nodes = get_editor_interface().get_selection().get_selected_nodes() if selected_nodes.size() == 0: return var target_node = selected_nodes[0] # 获取当前添加关键帧的轨道属性路径 var track = animation.tracks[track_index] var property_path = track.path.get_converted_to_target(target_node) # 替换为你的自定义属性名,比如"custom_prop" if property_path == "custom_prop": # 自动为Position添加关键帧 self._add_auto_keyframe(animation, target_node, "position", time) # 自动为Rotation Degrees添加关键帧(2D节点适用,3D节点可改为"rotation") self._add_auto_keyframe(animation, target_node, "rotation_degrees", time) func _add_auto_keyframe(animation: Animation, target_node: Node, prop_name: String, time: float): # 查找目标属性的轨道,不存在则创建 var track_idx = animation.find_track(target_node, prop_name) if track_idx == -1: track_idx = animation.add_track(Animation.TYPE_VALUE) animation.track_set_path(track_idx, NodePath(prop_name)) # 在指定时间插入当前属性值作为关键帧 var prop_value = target_node.get(prop_name) animation.key_track(track_idx, time, prop_value) func _exit_tree(): # 退出时断开信号,避免内存泄漏 var animation_editor = get_editor_interface().get_animation_editor() if animation_editor: animation_editor.disconnect("keyframe_added", self, "_on_keyframe_added")
使用步骤
- 将上述脚本保存为
AutoKeyPlugin.gd,放在项目的addons/auto_key_plugin目录下(需自行创建目录)。 - 在Godot编辑器的
项目设置 > 插件中启用该插件。 - 选中目标节点,打开动画编辑器,当你为自定义属性添加关键帧时,
Position和Rotation Degrees会自动在同一时间点添加对应关键帧。
注意事项
- 请根据你的实际自定义属性名修改代码中的
property_path == "custom_prop"判断条件。 - 若目标是3D节点,将
rotation_degrees替换为rotation或rotation_degrees(根据节点类型调整)。 - 该方案仅在编辑器环境生效,不会影响运行时逻辑。
内容的提问来源于stack exchange,提问作者cak3_lover
相关产品推荐
相关产品推荐

