Utilisation d'événements d'animation
Les événements d'animation fournissent un moyen d'appeler une fonction personnalisée ou d'effectuer une action à un moment spécifique dans un clip d'animation.
Cela permet l'interaction entre les animations et les scripts, et est utile lors de l'exécution d'actions au moment exact d'une animation.
Ajouter des événements à l'animation d'objet
L'exemple suivant ajoute un événement d'animation à un objet animé.
Cette structure envoie des informations au journal de la console chaque fois qu'un événement est exécuté en ajoutant un événement de montée et un événement de descente à l'animation qui se répète vers le haut et vers le bas.

1) Sélectionnez GameObject > Objet 3D > Cube pour créer un cube dans la scène.
- Sélectionnez le cube créé et ajoutez un composant Animator en cliquant sur le bouton Ajouter un composant dans le panneau Inspecteur.
- Appliquez le contrôleur Animator du cube à l'Animator ajouté.
- Appliquez le clip d'animation du cube à l'entrée du contrôleur Animator du cube afin que l'animation du cube puisse être jouée lorsque la scène est jouée.

Veuillez vous référer au guide suivant pour l'enregistrement de l'Animator et l'édition des clips d'animation.
📘 Guide des événements d'animation Unity https://docs.unity3d.com/kr/current/Manual/script-AnimationWindowEvent.html
📘 Tutoriel d'animation Unity Learn https://learn.unity.com/tutorial/may-18-animation?language=en#
2) Ajoutez les propriétés suivantes au clip d'animation du cube.
- Il y a une image clé de Position (x: 0, y:0, z:0) dans la section de 0 seconde, 2 secondes du clip d'animation du cube.
- Il y a une image clé de Position (x: 0, y:1, z:0) dans la section de 1 seconde du clip d'animation du cube.
(1) Enregistrez un Événement d'Animation dans la section de 1 seconde du clip d'animation du cube.
- Fonction : Invoker
- Chaîne : Haut
(2) Enregistrez un Événement d'Animation dans la section de 2 secondes du clip d'animation du cube.
- Fonction : Invoker
- Chaîne : Bas

- Lors de l'écriture d'événements d'animation en C# dans Unity, écrivez le nom de la fonction dans Function.
- Cependant, pour appeler un événement d'animation en TypeScript, Invoke doit être écrit dans Funtion et le nom de la fonction doit être écrit dans String, la valeur de l'argument.
3) Créer un projet > Créer > ZEPETO > TypeScript et le renommer en ObjectAnimationController.
- Écrivez un script d'exemple comme ci-dessous.
import { ZepetoScriptBehaviour } from 'ZEPETO.Script'
export default class ObjectAnimationController extends ZepetoScriptBehaviour {
public Up() {
console.log(`Cube is Up`);
}
public Down(){
console.log(`Cube is Down`);
}
}4) Si vous appuyez sur le bouton de lecture pour l'exécuter, vous pouvez voir la sortie du journal de la console pendant que l'animation du cube est jouée.

Jouer des sons de pas en utilisant des événements d'animation sur des personnages locaux.
Pour ajouter des événements d'animation à l'Animator du personnage de ZEPETO, l'événement doit être ajouté à l'exécution, lorsque le personnage est créé.
L'exemple suivant applique un événement à un Clip d'Animation spécifique de l'Animator du joueur local à l'exécution, et joue un son de pas lorsque l'événement se déclenche.
1) Créez un script FootStepController qui sera appliqué à l'objet animateur du joueur local. FootStepController est responsable de l'ajout d'événements d'animation à l'Animator.
- Créer Projet > Créer > ZEPETO > TypeScript et renommez-le en FootStepController.
- Écrivez le script comme ci-dessous.
import { AnimationEvent, Animator, AudioClip, AudioSource } from 'UnityEngine';
import { ZepetoScriptBehaviour } from 'ZEPETO.Script';
export default class FootStepController extends ZepetoScriptBehaviour {
// Son utilisé pour les effets de pas
public footStepSound: AudioClip;
// Source audio pour jouer le son des pas
private _zepetoAudio: AudioSource;
// Ajoute des événements d'animation pour déclencher les sons de pas
public AddAnimationEvent() {
// Obtenir le composant Animator attaché à cet objet de jeu
const anim = this.GetComponent<Animator>();
// Vérifier si le composant Animator existe
if (anim != null) {
// Créer la source audio pour les sons de pas
this.SetAudio();
// Spécifier les moments dans les clips d'animation où les sons de pas doivent jouer
const runSoundEventTimes = [0.1, 0.6];
// Ajouter des événements d'animation au clip d'animation spécifié
this.AddAnimationClipEvent(anim, "move_walk", runSoundEventTimes);
}
}
// Configure la source audio pour jouer les sons de pas
private SetAudio() {
// Créer et configurer le composant AudioSource
this._zepetoAudio = this.gameObject.AddComponent<AudioSource>();
this._zepetoAudio.clip = this.footStepSound;
}
// Active les sons de pas
public ActivateFootSteps() {
// Afficher un message dans le journal indiquant que les sons de pas sont en cours de lecture
console.log("Pas !");
// Jouer le son des pas en utilisant la source audio configurée
this._zepetoAudio.Play();
}
// Ajoute des événements d'animation à un clip d'animation spécifié
private AddAnimationClipEvent(anim: Animator, clipName: string, eventTimes: number[]) {
// Initialiser l'index du clip d'animation
let animationClipIndex: number;
// Obtenir tous les clips d'animation du runtimeAnimatorController
const clips = anim.runtimeAnimatorController.animationClips;
// Trouver l'index du clip d'animation spécifié
for (let i = 0; i < clips.length; i++) {
if (clips[i].name == clipName) {
animationClipIndex = i;
}
}
// Itérer à travers les temps d'événements spécifiés
eventTimes.forEach(eventTime => {
// Créer un nouvel AnimationEvent pour le déclencheur de son de pas
const newEvent: AnimationEvent = new AnimationEvent();
newEvent.time = eventTime;
newEvent.functionName = "Invoke";
newEvent.stringParameter = "ActivateFootSteps";
// Ajouter le nouvel AnimationEvent au clip d'animation
clips[animationClipIndex].AddEvent(newEvent);
});
}
}- description du script
- FootStepController ajoute un événement d'animation et joue un effet sonore de pas lorsque cet événement se produit.
- SetAudio() ajoute un composant AudioSource pour appliquer le son de pas à l'objet.
- AddAnimationClipEvent() ajoute un événement d'animation au clip d'animation spécifié. Vous devez mettre les éléments suivants comme valeurs d'argument.
- Animateur pour le joueur local
- Nom du clip d'animation auquel l'événement est appliqué
- Un tableau de temps d'animation auquel appliquer l'événement
- Dans le newEvent enregistré avec AddAnimationClipEvent(), les éléments suivants sont définis.
(1) newEvent.time : Le temps d'animation lorsque l'événement se déclenche. Une valeur de 0 est le début de la durée totale, et une valeur de 1 est la fin de la durée totale.
(2) newEvent.functionName : Le nom de la fonction que l'événement déclenche. En TypeScript, il doit être typé comme "Invoke".
(3) newEvent.stringParameter : La valeur du paramètre définie pour la fonction lorsque l'événement exécute la fonction. TypeScript liste le nom de la fonction à exécuter.
- Lorsqu'un événement se produit, ActivateFootSteps() est exécuté et les sons de pas sont joués.

2) Maintenant, créez un FootStepManager qui ajoute un composant FootStepController à l'objet Animator du joueur local lorsque le joueur local est créé à l'exécution.
- Projet > Créer > ZEPETO > TypeScript et renommez-le en FootStepManager.
- Écrivez le script comme ci-dessous.
import { SpawnInfo, ZepetoPlayers } from 'ZEPETO.Character.Controller'
import { ZepetoScriptBehaviour } from 'ZEPETO.Script'
import FootStepController from './FootStepController'
import { WorldService } from 'ZEPETO.World'
import { AudioClip } from 'UnityEngine';
export default class FootStepManager extends ZepetoScriptBehaviour {
// Son à jouer pour les pas
public footStepSound: AudioClip;
Start() {
// Écouteur d'événements lorsque le joueur local est ajouté
ZepetoPlayers.instance.OnAddedLocalPlayer.AddListener(() => {
// Accéder au personnage Zepeto du joueur local
const zepetoCharacter = ZepetoPlayers.instance.LocalPlayer.zepetoPlayer.character;
// Attacher le script FootStepController à l'objet GameObject de ZepetoAnimator
const footStepController = zepetoCharacter.ZepetoAnimator.gameObject.AddComponent<FootStepController>();
// Définir le footStepSound pour le FootStepController
footStepController.footStepSound = this.footStepSound;
// Ajouter des événements d'animation pour déclencher les pas
footStepController.AddAnimationEvent();
});
}
}- description du script
- Après que le FootStepManager détecte qu'un joueur local est ajouté, il attache le script FootStepController à l'objet GameObject de ZepetoAnimator du joueur.
- FootStepController est responsable de l'ajout d'événements d'animation qui jouent des sons de pas.
- Le script de la fonction exécutée par l'événement d'animation de l'Animator doit être appliqué de manière identique à l'objet auquel le composant Animator correspondant est appliqué.
- Vous devez donc trouver ZepetoAnimator.gameObject et appliquer le script FootStepController en tant qu'AddComponent.
3) Appliquez le son des pas au footStepSound de FootStepManager.

4) Si vous appuyez sur le bouton Play pour l'exécuter, vous pouvez voir que le son est joué en fonction des pas du joueur local chaque fois qu'il marche.

👍 Conseils
- L'état de marche de l'animateur de base ZEPETO se compose de plusieurs mélanges et états d'animation.
- Puisque l'exemple applique le son uniquement à l'état move_walk, vous pouvez personnaliser AddAnimationClipEvent() et l'entrer directement dans des états tels que la marche rapide et la course.
- Lorsque le son est appliqué à plusieurs états d'animation, les sons de pas peuvent se chevaucher en raison du mélange d'animation. Pour résoudre ce problème, écrivez une instruction conditionnelle supplémentaire afin que le son correspondant soit joué lorsque AnimationEvent.animatorClipInfo.weight est 0.5.
❗️ Problème connu
- Lorsqu'il est mis en œuvre selon le style du guide de développement, le message d'erreur suivant peut apparaître, mais il ne devrait y avoir aucun problème d'exécution.
