代码中编辑AnimationPlayer之属性、方法

    一般来说,添加一个AnimationPlayer的子节点,然后通过编辑器编辑动画,几乎可以满足所有需求,但是如果需要在代码中编辑,可以通过如下形式实现:

    新建一个场景,跟节点为Node2D,新增一个Sprite字节点重命名为Sp,脚本如下:

extends Node2D

# 跟节点
func _ready():
	var ap = AnimationPlayer.new()
	add_child(ap)
	var animation = Animation.new()
	var track_index = animation.add_track(Animation.TYPE_VALUE)
	print("track_index=",track_index)
	animation.track_set_path(track_index, "Sp:position:x")
	animation.track_insert_key(track_index, 0.0, 0)
	animation.track_insert_key(track_index, 0.5, 100)
	animation.track_insert_key(track_index, 1.0, 200)
	
	track_index = animation.add_track(Animation.TYPE_METHOD)
	print("track_index=",track_index)
	animation.track_set_path(track_index, "Sp")
	animation.track_insert_key(track_index, 1.0, {"method":"testCall","args":["hello"]})
	
	animation.loop = true
	ap.add_animation("test",animation)
	ap.play("test")
	pass # Replace with function body.
extends Sprite

# 字节点
func _ready():
	pass # Replace with function body.

func testCall(vars):
	print("testCall:", vars)
	pass

需要注意如下几点:

1. animation.track_set_path(track_index, "Sp:position:x")

其中Path是以当前Animation的父节点为当前开始查找,当前子节点Sprite的名称为Sp,所以path为Sp:position:x,属性均通过:标识。官方描述的animation.track_set_path(track_index, "Enemy:position.x")在当前版本(3.2.1)是错误的。

2. animation.track_insert_key(track_index, 1.0, {"method":"testCall","args":["hello"]})

由于这里添加的是method回调,根据源码分析,这里的参数必须为字典,而且必须包含method以及args字段,所以格式是固定的,但是值根据实际情况可以修改。源码如下:

#https://github.com/sxhebing/godot/blob/master/scene/resources/animation.cpp:984
case TYPE_METHOD: {
	MethodTrack *mt = static_cast(t);

	ERR_FAIL_COND(p_key.get_type() != Variant::DICTIONARY);

	Dictionary d = p_key;
	ERR_FAIL_COND(!d.has("method") || (d["method"].get_type() != Variant::STRING_NAME && d["method"].get_type() != Variant::STRING));
	ERR_FAIL_COND(!d.has("args") || !d["args"].is_array());

	MethodKey k;

	k.time = p_time;
	k.transition = p_transition;
	k.method = d["method"];
	k.params = d["args"];

	_insert(p_time, mt->methods, k);

 

你可能感兴趣的:(Godot,Godot)