一般来说,添加一个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);