【问题标题】:Invoke function on adding a keyframe in animation player在动画播放器中添加关键帧时调用函数
【发布时间】:2022-10-18 14:54:22
【问题描述】:

我有一个动画播放器,我想在添加关键帧时调用一个函数

像这样:

extends AnimationPlayer

...

func key_added(track_indx,key_indx):
  print("key added: ",key_indx," to track:",track_indx)

这样的事情可能吗?有什么我缺少的内置功能吗?

【问题讨论】:

  • 您是否尝试这样做,同时在编辑器中进行编辑。或者你想在运行时做吗?
  • @Bugfish 编辑器

标签: godot gdscript


【解决方案1】:

我没有时间完全试验它,但这应该给你一个你可以研究的方向。

首先,您需要更改动画类以提供所需的事件。为了能够在编辑器中使用它,请记住,您需要工具标志:

extends Animation
tool
class_name ToolAnimation

signal key_added(track_idx, key_indx)

func track_insert_key ( track_idx : int, time : float, key, transition : float = 1) -> void:
    .track_insert_key(track_idx, time, key, transition)
    #need to find the key index of the key we added
    var key_id = track_find_key ( track_idx, time, true )
    
    emit_signal("key_added", track_idx, key_id)

我在这里所做的就是覆盖track_insert_key 以在添加后搜索密钥ID,然后发出信号。

现在我们需要告诉我们的animation_player添加我们新创建的动画而不是普通的动画类,所以我们改变animation_player的脚本并覆盖add_animation函数:

extends AnimationPlayer
tool

func add_animation(name : String, animation: Animation):    
    var tool_animation = ToolAnimation.new()
    tool_animation.connect("key_added", self, "key_added")
    .add_animation(name, tool_animation)
    pass

func key_added(track_indx,key_indx):
  print("key added: ",key_indx," to track:",track_indx)

现在每次添加密钥时,您都应该进入 key_added 方法。

这仅适用于新创建的动画,因为现有的动画将没有工具动画扩展。例如,要将功能添加到现有动画中,您需要在准备好的功能中深度复制它们。

编辑:正如@cakelover 在 cmets 中指出的那样:要更改现有动画,请遍历它们并使用它们的 set_script() 函数。

我在尝试时注意到的第二件事是,如果新创建了轨道并且同时添加了第一个键(基本上是在我之前没有跟踪的属性上按下键符号),则不会调用我的 key_add 方法。如果您还需要第一把钥匙,那么这就是您应该研究的东西。

【讨论】:

  • 对于现有动画,可以在 AnimationPlayer 脚本中的 _init() 内使用 animation.set_script(),例如 this
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-12
  • 1970-01-01
  • 1970-01-01
  • 2018-01-03
  • 2016-05-13
  • 1970-01-01
  • 2023-03-04
相关资源
最近更新 更多