godot 4 实现代码动态设置纹理素材,动态添加人物动画并加入全局动画集,实现人物多动作8方向动画
- 素材如下:
站立素材:
跑动素材:
- 工程项目如下:
3.实现代码如下:
extends Node2D
# 素材载体
@onready var body : Sprite2D = $body
# 动画播放器
@onready var player : AnimationPlayer = $player
func _ready():
# 角色名称
var character_model_name = "巫蛮儿"
# 人物跑动动画名称开头
var run = "跑动"
# 人物跑动素材大小
var run_texture_size = Vector2(1432,1096)
var run_sprite_size = Vector2(179,137)
# 人物站立动画名称开头
var stand = "站立"
# 人物站立素材大小
var stand_texture_size = Vector2(1200,1152)
var stand_sprite_size = Vector2(120,144)
# 人物坐标
self.position = Vector2(100,100)
# 添加跑动素材的全部动画
add_animations(character_model_name, run, run_texture_size, run_sprite_size)
# 添加站立素材的全部动画
add_animations(character_model_name, stand, stand_texture_size, stand_sprite_size)
func _physics_process(_delta):
player.play("巫蛮儿/跑动_4")
# 添加某个类型全部动画
# character_model_name 角色模型
# texture_name 纹理素材名称
# texture_size 纹理素材大小
# sprite_size 纹理素材中每个精灵的大小
func add_animations(character_model_name, texture_name, texture_size, sprite_size):
# 素材路径拼接
var full_texture_path = "res://素材/人物/" + character_model_name + "/" + texture_name + ".png"
# 加载素材
var full_texture = load(full_texture_path)
# 获取素材的列数
var num_columns = int(texture_size.x / sprite_size.x)
# 获取素材的行数
var num_rows = int(texture_size.y / sprite_size.y)
# 获取角色动画库
var animation_library : AnimationLibrary
# 如果角色动画库不存在,则新建角色动画库
if !player.has_animation_library(character_model_name):
animation_library = AnimationLibrary.new()
player.add_animation_library(character_model_name, animation_library)
else:
animation_library = player.get_animation_library(character_model_name)
# 设置素材
body.texture = full_texture
# 设置素材动画行数和列数
body.hframes = num_columns
body.vframes = num_rows
# 遍历逐行,每个动画一行
for x in range(num_rows):
# 创建动画
var anim = Animation.new()
# 清空动画
anim.clear()
# 设置动画循环播放
anim.loop = true
# 新建属性轨道
var track = anim.add_track(Animation.TYPE_VALUE)
# 添加body:frame_coords轨道
anim.track_set_path(track, "body:frame_coords")
# 设置更新方式为关键帧
anim.value_track_set_update_mode(track, Animation.UPDATE_DISCRETE)
# 定义动画的帧时间
var frame_time : float
# 遍历素材一行的每个元素
for y in range(num_columns):
# 动画插入关键帧属性,关键帧是frame_coords属性坐标
anim.track_insert_key(track, frame_time, Vector2(y, x))
# 每个0.1秒插入一个关键帧,放在插入后是因为关键帧从0秒开始插入
frame_time = frame_time + 0.1
# 设置动画长度
anim.set_length(frame_time)
# player全局动画库循环加入动画
animation_library.add_animation(texture_name + "_" + String.num(x), anim)
- 理解:
动态添加的属性
轨道属性:
- 运行视频
godot 4 实现代码动态设置纹理素材,动态添加人物动画并