如何从密钥中获取 属性 名称?

How to get the property name from key?

我正在尝试获取正在从动画播放器节点更改的所有属性和值的列表,
但是如何获取动画键正在更改的节点的 属性 名称?

可能是这样的:

var ani=aniplayer.get_animation('running');
    
for i in range(0,ani.get_track_count()):
        var key_idx=ani.track_find_key(i,0,0);
        print("property=>",ani.get_key_property(i,key_idx)," new value=>",ani.track_get_key_value(i,key_idx));

假设您有一个动画播放器:

var aniplayer := $AnimationPlayer as AnimationPlayer

你得到一个动画的名字:

var ani := aniplayer.get_animation("running")

如您所知,您可以获得动画的轨道数:

var track_count := ani.get_track_count()

而且,我们当然可以循环:

for track_id in range(0,track_count):
    pass

让我们看看,您想知道 属性 正在设置什么。要获取 属性,我们需要获取路径,并从那里提取 属性:

for track_id in range(0,track_count):
    var track_path := (ani.track_get_path(track_id) as String).split(":")
    var node_path := track_path[0]
    var property_path := track_path[1]

附录:

还有另一种方法可以从 NodePath 获取 属性 路径:get_concatenated_subnames.

或者我们可以得到用get_subname分隔的元素。

所以这是 属性 名称:

var property_path = ani.track_get_path(track_id).get_subname(0)

我想这是提醒大家注意 AnimationPlayer 可以激活 sub-properties 这一事实的好时机。使用 get_subname(0),您会得到 属性,但不会得到 sub-property。

例如,您不必为 position 制作动画,您可以为 position.y 制作动画,您可以通过在曲目名称末尾添加 :y动画面板。 我会更详细地描述如何做到这一点 在这种情况下 get_subname(0) 会给你 position,但是 get_concatenated_subnames() 会给你你position:y.