Attention: Here be dragons
This is the latest
(unstable) version of this documentation, which may document features
not available in or compatible with released stable versions of Godot.
Checking the stable version of the documentation...
AnimationMixer
Heredado por: AnimationPlayer, AnimationTree
Clase base para AnimationPlayer y AnimationTree.
Descripción
Clase base para AnimationPlayer y AnimationTree para gestionar listas de animación. También tiene propiedades y métodos generales para la reproducción y la mezcla.
Después de instanciar los datos de información de reproducción dentro de la clase extendida, la mezcla es procesada por el AnimationMixer.
Tutoriales
Propiedades
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
Métodos
_post_process_key_value(animation: Animation, track: int, value: Variant, object_id: int, object_sub_idx: int) virtual const |
|
add_animation_library(name: StringName, library: AnimationLibrary) |
|
void |
|
void |
capture(name: StringName, duration: float, trans_type: TransitionType = 0, ease_type: EaseType = 0) |
void |
|
find_animation(animation: Animation) const |
|
find_animation_library(animation: Animation) const |
|
get_animation(name: StringName) const |
|
get_animation_library(name: StringName) const |
|
get_animation_library_list() const |
|
get_animation_list() const |
|
get_root_motion_position() const |
|
get_root_motion_rotation() const |
|
get_root_motion_scale() const |
|
has_animation(name: StringName) const |
|
has_animation_library(name: StringName) const |
|
void |
|
void |
rename_animation_library(name: StringName, newname: StringName) |
Señales
animation_finished(anim_name: StringName) 🔗
Notifica cuando una animación ha terminado de reproducirse.
Nota: Esta señal no se emite si una animación está en bucle.
animation_libraries_updated() 🔗
Notifica cuando las bibliotecas de animación han cambiado.
animation_list_changed() 🔗
Notifica cuando una lista de animación cambia.
animation_started(anim_name: StringName) 🔗
Notifica cuando una animación comienza a reproducirse.
Nota: Esta señal no se emite si una animación está en bucle.
caches_cleared() 🔗
Notifica cuando las cachés se han limpiado, ya sea automáticamente o manualmente a través del clear_caches().
mixer_applied() 🔗
Notifica cuando el resultado de la mezcla se ha aplicado a los objetos de destino.
mixer_updated() 🔗
Notifica cuando se han actualizado los procesos relacionados con la propiedad.
Enumeraciones
enum AnimationCallbackModeProcess: 🔗
AnimationCallbackModeProcess ANIMATION_CALLBACK_MODE_PROCESS_PHYSICS = 0
Procesa la animación durante los frames de física (véase Node.NOTIFICATION_INTERNAL_PHYSICS_PROCESS). Esto es especialmente útil cuando se animan cuerpos físicos.
AnimationCallbackModeProcess ANIMATION_CALLBACK_MODE_PROCESS_IDLE = 1
Procesa la animación durante los frames de proceso (véase Node.NOTIFICATION_INTERNAL_PROCESS).
AnimationCallbackModeProcess ANIMATION_CALLBACK_MODE_PROCESS_MANUAL = 2
No procesar la animación. Utiliza advance() para procesar la animación manualmente.
enum AnimationCallbackModeMethod: 🔗
AnimationCallbackModeMethod ANIMATION_CALLBACK_MODE_METHOD_DEFERRED = 0
Metodos de procesos por lotes llamados durante el proceso de animación, y despues que los eventos son procesados hacer los llamados. Esto evita los errores que implican borrar nodos o modificar el AnimationPlayer mientras se está reproduciendo.
AnimationCallbackModeMethod ANIMATION_CALLBACK_MODE_METHOD_IMMEDIATE = 1
Hace llamadas a método inmediatamente cuando se alcanza en la animación.
enum AnimationCallbackModeDiscrete: 🔗
AnimationCallbackModeDiscrete ANIMATION_CALLBACK_MODE_DISCRETE_DOMINANT = 0
Un valor de pista Animation.UPDATE_DISCRETE tiene prioridad al mezclar valores de pista Animation.UPDATE_CONTINUOUS o Animation.UPDATE_CAPTURE y valores de pista Animation.UPDATE_DISCRETE.
AnimationCallbackModeDiscrete ANIMATION_CALLBACK_MODE_DISCRETE_RECESSIVE = 1
Un valor de pista Animation.UPDATE_CONTINUOUS o Animation.UPDATE_CAPTURE tiene prioridad al mezclar los valores de pista Animation.UPDATE_CONTINUOUS o Animation.UPDATE_CAPTURE y los valores de pista Animation.UPDATE_DISCRETE. Este es el comportamiento predeterminado para AnimationPlayer.
AnimationCallbackModeDiscrete ANIMATION_CALLBACK_MODE_DISCRETE_FORCE_CONTINUOUS = 2
Trata siempre el valor de la pista Animation.UPDATE_DISCRETE como Animation.UPDATE_CONTINUOUS con Animation.INTERPOLATION_NEAREST. Este es el comportamiento predeterminado para AnimationTree.
Si una pista de valores tiene valores clave de tipo no interpolables, se convierte internamente para utilizar ANIMATION_CALLBACK_MODE_DISCRETE_RECESSIVE con Animation.UPDATE_DISCRETE.
Lista de tipos no interpolables:
@GlobalScope.TYPE_BOOL y @GlobalScope.TYPE_INT se tratan como @GlobalScope.TYPE_FLOAT durante la combinación y se redondean cuando se recupera el resultado.
Lo mismo ocurre con las matrices y vectores que las contienen, como @GlobalScope.TYPE_PACKED_INT32_ARRAY o @GlobalScope.TYPE_VECTOR2I, se tratan como @GlobalScope.TYPE_PACKED_FLOAT32_ARRAY o @GlobalScope.TYPE_VECTOR2. Ten en cuenta también que, en el caso de las matrices, el tamaño también se interpola.
@GlobalScope.TYPE_STRING y @GlobalScope.TYPE_STRING_NAME se interpolan entre códigos de caracteres y longitudes, pero ten en cuenta que hay una diferencia en el algoritmo entre la interpolación entre claves y la interpolación por mezcla.
Descripciones de Propiedades
Si es true, el AnimationMixer estará procesando.
int audio_max_polyphony = 32 🔗
El número de sonidos simultáneos posibles para cada uno de los AudioStreamPlayers asignados.
Por ejemplo, si este valor es 32 y la animación tiene dos pistas de audio, los dos AudioStreamPlayer asignados pueden reproducir simultáneamente hasta 32 voces cada uno.
AnimationCallbackModeDiscrete callback_mode_discrete = 1 🔗
void set_callback_mode_discrete(value: AnimationCallbackModeDiscrete)
AnimationCallbackModeDiscrete get_callback_mode_discrete()
Normalmente, las pistas se pueden configurar en Animation.UPDATE_DISCRETE para actualizarse con poca frecuencia, normalmente cuando se utiliza la interpolación más cercana.
Sin embargo, al mezclar con Animation.UPDATE_CONTINUOUS se tienen en cuenta varios resultados. El callback_mode_discrete lo especifica explícitamente. Véase también AnimationCallbackModeDiscrete.
Para que los resultados mezclados se vean bien, se recomienda establecerlo en ANIMATION_CALLBACK_MODE_DISCRETE_FORCE_CONTINUOUS para actualizar cada fotograma durante la mezcla. Existen otros valores por motivos de compatibilidad y están bien si no hay mezcla, pero si no es así, pueden producir artefactos.
AnimationCallbackModeMethod callback_mode_method = 0 🔗
void set_callback_mode_method(value: AnimationCallbackModeMethod)
AnimationCallbackModeMethod get_callback_mode_method()
El modo de llamada a utilizar para las pistas "Call Method".
AnimationCallbackModeProcess callback_mode_process = 1 🔗
void set_callback_mode_process(value: AnimationCallbackModeProcess)
AnimationCallbackModeProcess get_callback_mode_process()
La notificación de proceso en la que se actualizan las animaciones.
Si es true, la mezcla utiliza el algoritmo determinista. El peso total no se normaliza y el resultado se acumula con un valor inicial (0 o una animación "RESET" si está presente).
Esto significa que si la cantidad total de mezcla es 0.0, el resultado es igual a la animación "RESET".
Si el número de pistas entre las animaciones mezcladas es diferente, la animación con la pista que falta se trata como si tuviera el valor inicial.
Si es false, la mezcla no utiliza el algoritmo determinista. El peso total se normaliza y siempre es 1.0. Si el número de pistas entre las animaciones mezcladas es diferente, no se hace nada con la animación a la que le falta una pista.
Nota: En AnimationTree, la mezcla con AnimationNodeAdd2, AnimationNodeAdd3, AnimationNodeSub2 o el peso mayor que 1.0 puede producir resultados inesperados.
Por ejemplo, si AnimationNodeAdd2 mezcla dos nodos con la cantidad 1.0, entonces el peso total es 2.0, pero se normalizará para que la cantidad total sea 1.0 y el resultado será igual a AnimationNodeBlend2 con la cantidad 0.5.
Esto lo utiliza el editor. Si se establece en true, la escena se guardará con los efectos de la animación de reinicio (la animación con la clave "RESET") aplicada como si se hubiera buscado hasta el tiempo 0, y el editor conservará los valores que la escena tenía antes de guardar.
Esto hace que sea más conveniente previsualizar y editar animaciones en el editor, ya que los cambios en la escena no se guardarán mientras estén establecidos en la animación de reinicio.
bool root_motion_local = false 🔗
Si es true, el valor de get_root_motion_position() se extrae como un valor de traslación local antes de la mezcla. En otras palabras, se trata como si la traslación se hiciera después de la rotación.
NodePath root_motion_track = NodePath("") 🔗
La ruta de la pista de Animación utilizada para el movimiento raíz. Las rutas deben ser rutas validas, escena-árbol hacia un nodo, y deben especificarse empezando por el nodo padre del nodo que reproducirá la animación. root_motion_track utiliza el mismo formato que Animation.track_set_path(), pero ten en cuenta que un hueso debe ser especificado.
Si la pista tiene tipo Animation.TYPE_POSITION_3D, Animation.TYPE_ROTATION_3D, o Animation.TYPE_SCALE_3D la transformación se cancelará visualmente, y la animación aparentará estar estática. Véase get_root_motion_position(), get_root_motion_rotation(), get_root_motion_scale(), y RootMotionView.
NodePath root_node = NodePath("..") 🔗
El nodo desde el cual viajarán las referencias de la ruta del nodo.
Descripciones de Métodos
Variant _post_process_key_value(animation: Animation, track: int, value: Variant, object_id: int, object_sub_idx: int) virtual const 🔗
Una función virtual para procesar después de obtener una clave durante la reproducción.
Error add_animation_library(name: StringName, library: AnimationLibrary) 🔗
Añade library al reproductor de animación, bajo la clave name.
AnimationMixer tiene una biblioteca global por defecto con una string vacía como clave. Para añadir una animación a la biblioteca global:
var global_library = mixer.get_animation_library("")
global_library.add_animation("animation_name", animation_resource)
Avanza manualmente las animaciones en el tiempo especificado (en segundos).
void capture(name: StringName, duration: float, trans_type: TransitionType = 0, ease_type: EaseType = 0) 🔗
Si la pista de animación especificada por name tiene una opción Animation.UPDATE_CAPTURE, almacena los valores actuales de los objetos indicados por la ruta de la pista como una caché. Si ya existe una caché capturada, la caché anterior se descarta.
Después de esto, se interpolará con el resultado actual de la mezcla de animación durante el proceso de reproducción durante el tiempo especificado por duration, funcionando como un fundido cruzado.
Puedes especificar trans_type como la curva para la interpolación. Para obtener mejores resultados, puede ser apropiado especificar Tween.TRANS_LINEAR para los casos en que la primera clave de la pista comience con un valor distinto de cero o donde el valor de la clave no cambie, y Tween.TRANS_QUAD para los casos en que el valor de la clave cambie linealmente.
void clear_caches() 🔗
AnimationMixer guarda en caché los nodos animados. Es posible que no note si un nodo desaparece; clear_caches() fuerza a actualizar la caché de nuevo.
StringName find_animation(animation: Animation) const 🔗
Devuelve la clave de animation o un StringName vacío si no se encuentra.
StringName find_animation_library(animation: Animation) const 🔗
Devuelve la clave de la AnimationLibrary que contiene animation o un StringName vacío si no se encuentra.
Animation get_animation(name: StringName) const 🔗
Devuelve la Animation con la clave name. Si la animación no existe, se devuelve null y se registra un error.
AnimationLibrary get_animation_library(name: StringName) const 🔗
Devuelve la primera AnimationLibrary con la clave name o null si no se encuentra.
Para obtener la biblioteca de animación global de AnimationMixer, utiliza get_animation_library("").
Array[StringName] get_animation_library_list() const 🔗
Devuelve la lista de claves de biblioteca almacenadas.
PackedStringArray get_animation_list() const 🔗
Devuelve la lista de claves de animación almacenadas.
Vector3 get_root_motion_position() const 🔗
Recupera el delta de movimiento de la posición con la root_motion_track como un Vector3 que puede ser usado en otro lugar.
Si root_motion_track no es una ruta a una pista de tipo Animation.TYPE_POSITION_3D, devuelve Vector3(0, 0, 0).
Véase también root_motion_track y RootMotionView.
El ejemplo más básico es aplicar la posición a un CharacterBody3D:
var current_rotation
func _process(delta):
if Input.is_action_just_pressed("animate"):
current_rotation = get_quaternion()
state_machine.travel("Animate")
var velocity = current_rotation * animation_tree.get_root_motion_position() / delta
set_velocity(velocity)
move_and_slide()
Al usar esto en combinación con get_root_motion_rotation_accumulator(), puedes aplicar la posición del movimiento de raíz de forma más correcta para tener en cuenta la rotación del nodo.
func _process(delta):
if Input.is_action_just_pressed("animate"):
state_machine.travel("Animate")
set_quaternion(get_quaternion() * animation_tree.get_root_motion_rotation())
var velocity = (animation_tree.get_root_motion_rotation_accumulator().inverse() * get_quaternion()) * animation_tree.get_root_motion_position() / delta
set_velocity(velocity)
move_and_slide()
Si root_motion_local es true, devuelve el valor de traslación pre-multiplicado con la rotación invertida.
En este caso, el código puede escribirse de la siguiente manera:
func _process(delta):
if Input.is_action_just_pressed("animate"):
state_machine.travel("Animate")
set_quaternion(get_quaternion() * animation_tree.get_root_motion_rotation())
var velocity = get_quaternion() * animation_tree.get_root_motion_position() / delta
set_velocity(velocity)
move_and_slide()
Vector3 get_root_motion_position_accumulator() const 🔗
Recupera el valor combinado de las pistas de posición con root_motion_track como un Vector3 que se puede utilizar en otros lugares.
Esto resulta útil en los casos en los que se desea respetar los valores clave iniciales de la animación.
Por ejemplo, si se reproduce una animación con una sola clave Vector3(0, 0, 0) en el fotograma anterior y luego se reproduce una animación con una sola clave Vector3(1, 0, 1) en el fotograma siguiente, la diferencia se puede calcular de la siguiente manera:
var prev_root_motion_position_accumulator
func _process(delta):
if Input.is_action_just_pressed("animate"):
state_machine.travel("Animate")
var current_root_motion_position_accumulator = animation_tree.get_root_motion_position_accumulator()
var difference = current_root_motion_position_accumulator - prev_root_motion_position_accumulator
prev_root_motion_position_accumulator = current_root_motion_position_accumulator
transform.origin += difference
Sin embargo, si la animación se repite, puede producirse un cambio discreto no deseado, por lo que solo resulta útil para algunos casos de uso sencillos.
Quaternion get_root_motion_rotation() const 🔗
Recupera el delta de movimiento de rotación con root_motion_track como un Quaternion que puede ser usado en otro lugar.
Si root_motion_track no es una ruta a una pista de tipo Animation.TYPE_ROTATION_3D, devuelve Quaternion(0, 0, 0, 1).
Véase también root_motion_track y RootMotionView.
El ejemplo más básico es aplicar la rotación a CharacterBody3D:
func _process(delta):
if Input.is_action_just_pressed("animate"):
state_machine.travel("Animate")
set_quaternion(get_quaternion() * animation_tree.get_root_motion_rotation())
Quaternion get_root_motion_rotation_accumulator() const 🔗
Recupera el valor combinado de las pistas de rotación con root_motion_track como un Quaternion que se puede utilizar en otros lugares.
Esto es necesario para aplicar correctamente la posición del movimiento raíz, teniendo en cuenta la rotación. Véase también get_root_motion_position().
Además, esto es útil en los casos en los que se desea respetar los valores clave iniciales de la animación.
Por ejemplo, si se reproduce una animación con una sola clave Quaternion(0, 0, 0, 1) en el fotograma anterior y luego se reproduce una animación con una sola clave Quaternion(0, 0.707, 0, 0.707) en el fotograma siguiente, la diferencia se puede calcular de la siguiente manera:
var prev_root_motion_rotation_accumulator
func _process(delta):
if Input.is_action_just_pressed("animate"):
state_machine.travel("Animate")
var current_root_motion_rotation_accumulator = animation_tree.get_root_motion_rotation_accumulator()
var difference = prev_root_motion_rotation_accumulator.inverse() * current_root_motion_rotation_accumulator
prev_root_motion_rotation_accumulator = current_root_motion_rotation_accumulator
transform.basis *= Basis(difference)
Sin embargo, si la animación se repite, puede producirse un cambio discreto no deseado, por lo que solo es útil para algunos casos de uso sencillos.
Vector3 get_root_motion_scale() const 🔗
Recupera el delta de movimiento de la escala con root_motion_track como un Vector3 que puede ser usado en otro lugar.
Si root_motion_track no es una ruta a una pista de tipo Animation.TYPE_SCALE_3D, devuelve Vector3(0, 0, 0).
Véase también root_motion_track y RootMotionView.
El ejemplo más básico es aplicar la escala a CharacterBody3D:
var current_scale = Vector3(1, 1, 1)
var scale_accum = Vector3(1, 1, 1)
func _process(delta):
if Input.is_action_just_pressed("animate"):
current_scale = get_scale()
scale_accum = Vector3(1, 1, 1)
state_machine.travel("Animate")
scale_accum += animation_tree.get_root_motion_scale()
set_scale(current_scale * scale_accum)
Vector3 get_root_motion_scale_accumulator() const 🔗
Recupera el valor combinado de las pistas de escala con root_motion_track como un Vector3 que se puede utilizar en otros lugares.
Por ejemplo, si se reproduce una animación con una sola clave Vector3(1, 1, 1) en el fotograma anterior y, a continuación, se reproduce una animación con una sola clave Vector3(2, 2, 2) en el siguiente fotograma, la diferencia se puede calcular de la siguiente manera:
var prev_root_motion_scale_accumulator
func _process(delta):
if Input.is_action_just_pressed("animate"):
state_machine.travel("Animate")
var current_root_motion_scale_accumulator = animation_tree.get_root_motion_scale_accumulator()
var difference = current_root_motion_scale_accumulator - prev_root_motion_scale_accumulator
prev_root_motion_scale_accumulator = current_root_motion_scale_accumulator
transform.basis = transform.basis.scaled(difference)
Sin embargo, si la animación se repite, puede producirse un cambio discreto no deseado, por lo que solo resulta útil para algunos casos de uso sencillos.
bool has_animation(name: StringName) const 🔗
Devuelve true si el AnimationMixer almacena una Animation con la clave name.
bool has_animation_library(name: StringName) const 🔗
Devuelve true si el AnimationMixer almacena una AnimationLibrary con la clave name.
void remove_animation_library(name: StringName) 🔗
Elimina la AnimationLibrary asociada con la clave name.
void rename_animation_library(name: StringName, newname: StringName) 🔗
Mueve la AnimationLibrary asociada con la clave name a la clave newname.