あなたの世界を作りなさい
プレイヤーとキャラクター: 上級
アニメーションイベントの使用
13分
アニメーションイベントは、アニメーションクリップの特定の時間にカスタマイズされた関数を呼び出したり、アクションを実行したりする方法を提供します。 これにより、アニメーションとスクリプトの間での相互作用が可能になり、アニメーションの正確なタイミングでアクションを実行する際に便利です。 オブジェクトアニメーションへのイベントの追加 以下の例は、アニメーションオブジェクトにアニメーションイベントを追加します。 この構造は、上下に繰り返すアニメーションにアップイベントとダウンイベントを追加することで、イベントが実行されるたびにコンソールログに情報を出力します。 1\) シーンにキューブを作成するには、gameobject > 3d object > cubeを選択します。 作成したキューブを選択し、インスペクターパネルの「add component」ボタンをクリックしてanimatorコンポーネントを追加します。 追加したanimatorにキューブanimator controllerを適用します。 キューブanimator controllerのエントリにキューブアニメーションクリップを適用し、シーンが再生されるときにキューブアニメーションが再生されるようにします。 animatorの登録とアニメーションクリップの編集については、以下のガイドを参照してください。 📘 unityアニメーションイベントガイド https //docs unity3d com/kr/current/manual/script animationwindowevent html https //docs unity3d com/kr/current/manual/script animationwindowevent html 📘 unity学習アニメーションチュートリアル https //learn unity com/tutorial/may 18 animation?language=en# https //learn unity com/tutorial/may 18 animation?language=en# 2\) 次のプロパティをキューブのアニメーションクリップに追加します。 キューブのアニメーションクリップの0秒、2秒のセクションに位置のキーフレーム (x 0, y 0, z 0) があります。 キューブのアニメーションクリップの1秒のセクションに位置のキーフレーム (x 0, y 1, z 0) があります。 (1) キューブのアニメーションクリップの1秒のセクションにアニメーションイベントを登録します。 関数 呼び出し 文字列 上 (2) キューブのアニメーションクリップの2秒のセクションにアニメーションイベントを登録します。 関数 呼び出し 文字列 下 unityでc#を使ってアニメーションイベントを書くときは、関数名をfunctionに書きます。 ただし、typescriptでアニメーションイベントを呼び出すには、invokeをfuntionに書き、関数名をstringとして引数の値を記述する必要があります。 3\) プロジェクトを作成 > 作成 > zepeto > typescriptとし、objectanimationcontrollerに名前を変更します。 以下のようにサンプルスクリプトを書きます。 objectanimationcontroller ts 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\) 再生ボタンを押して実行すると、キューブのアニメーションが再生されている間にコンソールログの出力を見ることができます。 ローカルキャラクターのアニメーションイベントを使用して足音を再生します。 zepetoのキャラクターのanimatorにアニメーションイベントを追加するには、キャラクターが作成されるときにランタイムでイベントを追加する必要があります。 以下の例では、ローカルプレイヤーのanimatorの特定のアニメーションクリップにイベントをランタイムで適用し、イベントが発生したときに足音を再生します。 1\) ローカルプレイヤーのアニメーターオブジェクトに適用されるfootstepcontrollerスクリプトを作成します。footstepcontrollerは、animatorにアニメーションイベントを追加する役割を担います。 プロジェクトを作成 > 作成 > zepeto > typescript として作成し、footstepcontrollerに名前を変更します。 以下のようにスクリプトを書きます。 footstepcontroller ts import { animationevent, animator, audioclip, audiosource } from 'unityengine'; import { zepetoscriptbehaviour } from 'zepeto script'; export default class footstepcontroller extends zepetoscriptbehaviour { // 足音効果に使用される音 public footstepsound audioclip; // 足音を再生するためのオーディオソース private zepetoaudio audiosource; // 足音をトリガーするアニメーションイベントを追加 public addanimationevent() { // このgameobjectにアタッチされたanimatorコンポーネントを取得 const anim = this getcomponent\<animator>(); // animatorコンポーネントが存在するか確認 if (anim != null) { // 足音のためのaudiosourceを作成 this setaudio(); // アニメーションクリップ内で足音が再生される時間を指定 const runsoundeventtimes = \[0 1, 0 6]; // 指定されたアニメーションクリップにアニメーションイベントを追加 this addanimationclipevent(anim, "move walk", runsoundeventtimes); } } // 足音を再生するためのaudiosourceを設定 private setaudio() { // audiosourceコンポーネントを作成し、設定 this zepetoaudio = this gameobject addcomponent\<audiosource>(); this zepetoaudio clip = this footstepsound; } // 足音をアクティブにする public activatefootsteps() { // 足音が再生されていることを示すログメッセージを出力 console log("足音!"); // 設定されたaudiosourceを使用して足音を再生 this zepetoaudio play(); } // 指定されたアニメーションクリップにアニメーションイベントを追加 private addanimationclipevent(anim animator, clipname string, eventtimes number\[]) { // アニメーションクリップのインデックスを初期化 let animationclipindex number; // runtimeanimatorcontrollerからすべてのアニメーションクリップを取得 const clips = anim runtimeanimatorcontroller animationclips; // 指定されたアニメーションクリップのインデックスを見つける for (let i = 0; i < clips length; i++) { if (clips\[i] name == clipname) { animationclipindex = i; } } // 指定されたイベント時間を反復処理 eventtimes foreach(eventtime => { // 足音トリガーのための新しいanimationeventを作成 const newevent animationevent = new animationevent(); newevent time = eventtime; newevent functionname = "invoke"; newevent stringparameter = "activatefootsteps"; // 新しいanimationeventをアニメーションクリップに追加 clips\[animationclipindex] addevent(newevent); }); } } スクリプトの説明 footstepcontrollerはアニメーションイベントを追加し、そのイベントが発生したときに足音の効果音を再生します。 setaudio()はaudiosourceコンポーネントを追加し、オブジェクトに足音の音を適用します。 addanimationclipevent()は指定されたアニメーションクリップにアニメーションイベントを追加します。次の要素を引数値として指定する必要があります。 ローカルプレイヤー用のanimator イベントが適用されるアニメーションクリップの名前 イベントを適用するアニメーション時間の配列 addanimationclipevent()で登録されたneweventには、次の項目が設定されます。 (1) newevent time イベントが発生する際のアニメーション時間。値が0は全長の始まり、値が1は全長の終わりです。 (2) newevent functionname イベントが発生する際の関数の名前。typescriptでは「invoke」として型付けされるべきです。 (3) newevent stringparameter イベントが関数を実行する際に関数に設定されるパラメータ値。typescriptは実行される関数名をリストします。 イベントが発生すると、activatefootsteps()が実行され、足音が再生されます。 2\) ローカルプレイヤーがランタイムで作成されるときに、footstepcontrollerコンポーネントをローカルプレイヤーのanimatorオブジェクトに追加するfootstepmanagerを作成します。 プロジェクト > 作成 > zepeto > typescript として、footstepmanagerに名前を変更します。 以下のようにスクリプトを書きます。 footstepmanager ts 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 { // 足音のために再生される音 public footstepsound audioclip; start() { // ローカルプレイヤーが追加されたときのイベントリスナー zepetoplayers instance onaddedlocalplayer addlistener(() => { // ローカルプレイヤーのzepetoキャラクターにアクセス const zepetocharacter = zepetoplayers instance localplayer zepetoplayer character; // zepetoanimatorのgameobjectにfootstepcontrollerスクリプトをアタッチ const footstepcontroller = zepetocharacter zepetoanimator gameobject addcomponent\<footstepcontroller>(); // footstepcontrollerのためにfootstepsoundを設定 footstepcontroller footstepsound = this footstepsound; // 足音をトリガーするアニメーションイベントを追加 footstepcontroller addanimationevent(); }); } } スクリプトの説明 footstepmanagerがローカルプレイヤーが追加されることを検出した後、プレイヤーのzepetoanimatorのgameobjectにfootstepcontrollerスクリプトをアタッチします。 footstepcontrollerは足音の音を再生するアニメーションイベントを追加する責任があります。 animatorのアニメーションイベントによって実行される関数のスクリプトは、対応するanimatorコンポーネントが適用されているオブジェクトに同一に適用されなければなりません。 したがって、zepetoanimator gameobjectを見つけて、footstepcontrollerスクリプトをaddcomponentとして適用する必要があります。 3\) footstepmanagerのfootstepsoundに足音を適用します。 4\) 再生ボタンを押して実行すると、ローカルプレイヤーが歩くたびに音が再生されるのがわかります。 👍 ヒント zepeto基本アニメーターの歩行状態は、いくつかのアニメーションブレンドと状態で構成されています。 この例はmove walk状態にのみ音を適用するため、addanimationclipevent()をカスタマイズして、速歩やランニングなどの状態に直接入力できます。 音が複数のアニメーション状態に適用される場合、アニメーションブレンドのために足音が重なることがあります。これを解決するために、animationevent animatorclipinfo weightが0 5のときに対応する音が再生されるように追加の条件文を書く必要があります。 ❗️ 知られている問題 開発ガイドスタイルに従って実装すると、次のエラーメッセージが表示されることがありますが、実行には問題ありません。