見出し画像

SpineをささっとUnityで動かす

テトラさんです。シトロンのキャラアニメーションはだいたいSpine製なので、アニメーションのスクリプトを備忘録として置いておきます。
あUnityエディタ側は割愛します。

コンポーネントの取得

SkeletonAnimation skeletonAnimation = GetComponent<SkeletonAnimation>();

Spine.AnimationState spineAnimationState = skeletonAnimation.AnimationState;

アニメーション再生

spineAnimationState.SetAnimation(トラック番号, "アニメーション名", ループ);
TrackEntry trackEntry  = spineAnimationState.SetAnimation(トラック番号, "アニメーション名", ループ);

トラック番号(int)は再生するトラックの指定、アニメーション名(String)はSpineで付けたアニメーション名、ループ(bool)はループするかの指定。
TrackEntryで宣言した場合、後に値を設定したりプロパティを取得できたりしやすかったりする。

TrackEntryのメソッド

SetAnimation: トラックに新しいアニメーションをセットして再生。上記のコード。
ClearTrack: トラックをクリアしてアニメーションを停止。
Hold: アニメーションが終了した際にホールドする時間を指定。
MixPose: ブレンディングのポーズを指定(Setup、Current、OutSetup、OutSetup、Out、InSetup、In)。

プロパティ
Animation: トラックで再生されているアニメーションの名前を取得または設定。
Alpha: トラックのアニメーションの透明度を取得または設定。
TimeScale: トラックのアニメーションの再生速度を取得または設定。MixTime:現在のアニメーションから次のアニメーションにブレンディングされる時間を取得。
MixDuration: 現在のアニメーションから次のアニメーションにブレンディングされる期間を取得または設定。
MixingFrom: 現在のアニメーションがブレンディングされる元のアニメーションを取得。

なんかよくわからないけど使うものは下に。

アニメーション停止

spineAnimationState.ClearTrack(トラック番号);
trackEntry.ClearTrack(トラック番号);

指定したトラックのアニメーションを停止。

再生速度

spineAnimationState.TimeScale = 1.0f;
trackEntry.TimeScale = 1.0f;

1で等倍。0で一時停止。

ミックス率の変更


spineAnimationState.SetAnimation(トラック番号, "アニメーション名", ループ).MixDuration = 0.3f;

SetAnimationと同時に指定できる。範囲は0~1。
MixDuration = 0で瞬時に切り替え。
途中で変更したい場合は

spineAnimationState.GetCurrent(トラック番号).MixDuration = 0.5f;

トラック指定で変更できる。
複数のトラックを使うとアニメーションを重ねられる。

spineAnimationState.SetAnimation(0, "アニメーション名1", true);
spineAnimationState.SetAnimation(1, "アニメーション名2", true);
trackEntry1.SetAnimation(0, "アニメーション名1", true);
trackEntry2.SetAnimation(1, "アニメーション名2", true);

.GetCurrent(トラック番号)

トラックの説明をしたところでこれ。

  TrackEntry currentTrackEntry = spineAnimationState.GetCurrent(トラック番号);

アニメーションステートの指定したトラックの現在のTrackEntryを取得。

ブレンドの透明度

trackEntry1.Alpha = 0.5f;

0~1で各トラックのボーンの移動量の倍率?影響度?を調整できる。Spineのプレビューウィンドウ見ればわかるはず。

完了した時に何かを実行

trackEntry.Complete += HandleAnimationComplete;

// アニメーションが完了した時に呼ばれるハンドラ 
private void HandleAnimationComplete(TrackEntry trackEntry) 
{
 Debug.Log("Animation Complete"); 
} 

Spineで設定したイベントで何かを実行

trackEntry0.Event += HandleAnimationEvent; 

// アニメーションイベントが発生した時に呼ばれるハンドラ 
private void HandleAnimationEvent(TrackEntry trackEntry, Spine.Event spineEvent) 
{
 Debug.Log(spineEvent.Data.Name); 
} 

これだけあればコルーチンなどで自作のステートを作れると思うので、Mecanimを触りたくないときはこっちで実装するのがいいかと思います。

記事執筆時点で少しキャラモーションのステート書いてますが、キャラはMecanimでつくろうとおもいました(今回のオチ)。


この記事が気に入ったらサポートをしてみませんか?