[Unity] Spineデータを再生する(非エンジニア)

バージョン:Unity 2019.4.15f1
意外と手間取ったので備忘録
Scriptの説明で曖昧な部分がありますがご容赦ください

1.spine-unity Unity packageをインポートする

spine-unity Unity packageをspine公式ページからダウンロードする
http://ja.esotericsoftware.com/spine-unity-download

Unityでインポートする
Asset >> Import Package >> Custom Package >> ファイル選択

Import Unity Package ウィンドウがでたらImportを押す

2.spineデータをインポートする

Projectウィンドウへドラッグ&ドロップ

もしくはProjectウィンドウで
右クリック >> Import New Asset >> ファイル選択

※spineデータ用のフォルダを作っておくと良い

3.Animator Controller を準備

※Animator Controllerを使わずにアニメーションを再生する場合は必要がない

SkeletonData から Animator Controller を生成

インポートしたファイル内のSkeletonDataを選択
↓SkeletonDataのファイル名
「インポート時のファイル名」_SkeletonData

Inspectorウィンドウの一番下にある
SkeletonMecanimの▶︎三角をクリックして開く

Generate Mecanim Controllerをクリックする
※すでに作成している場合はForce Update AnimationClipsとなっている
※後からアニメーションを増やしたり減らしたりした場合はForce Update AnimationClipsで更新できる

SkeletonData と同じフォルダ内にデータが生成される
↓Animator Controllerのファイル名
「インポート時のファイル名」_Controller

Animator Controller のための scriptファイルを作る

Projectウィンドウで
右クリック >> Create >> C#Script を選択する

以下のファイル名にする
AnimationNameScript
※ファイル名を変える場合は以下のScriptの
class名をファイル名と同じ名前にする

ファイルをダブルクリックで開いて以下のように書き換えて保存

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Spine;
using Spine.Unity;

public class AnimationNameScript : StateMachineBehaviour
{
	public string animationName;
	override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {
		SkeletonAnimation anim = animator.GetComponent<SkeletonAnimation>();
		anim.state.SetAnimation (0, animationName, true);
	}
}

public string animationName;の意味
animationNameという名前の変数をstring(文字列)型のpublic変数で宣言する
public変数で宣言することでInspectorウィンドウで値(この場合はアニメーション名)を代入できる

Animator Controller に state を作る

※インポート時に自動生成する方法もあるらしい
※手動で作ると結構めんどくさいけどここでは手動で作ります

Window >> Animation >> Animator でウィンドウを開く

Animator ウィンドウの右側で
右クリック >> Create State >> Empty を選択しNew Stateを生成する
※必要なアニメーションの数だけ生成

Stateにアニメーションを設定する

InspectorウィンドウでNew Stateの名前を変更する
※多分何でもいいけど再生させたいアニメーション名と同じにするのが無難

InspectorウィンドウのMotionの項目で再生させたいアニメーションを選択

Add Behaviour をクリックして先ほど作ったScript( AnimationNameScript )を選択する

追加された項目の Animation Name に再生させたいアニメーション名を入力する

※上記の手順を作った State の数だけ繰り返す

Triggerを作る

そのままAnimatorのウィンドウの左側で Parameters のタブを選択する

タブの右側にある+をクリックしTriggerを選択してNew Triggerを生成

New Triggerの名前を変更する
※後でscriptに記述するので簡潔でわかりやすい名前にした方が良い
※右側にある○をオンすると実行時にTriggerがオンの状態で開始するのでオフにしておく

Transitionを作る

Entry(緑)の上で右クリックしSet StateMachine Default Stateを選択し
最初に再生させたいアニメーションのStateの上で左クリック

AnyState(水色)の上で右クリックしMake Transitionを選択し
遷移先のStateの上で左クリック
※ループせずに戻したい場合は遷移先のStateから戻したいStateへTransitionを作成する(戻るTransitionにTriggerを設定しなければ自動で戻る)

Transition に Trigger を設定する

Any State(水色)を選択するとInspectorウィンドウにTransitionのリストがあるので設定したい項目を選択する

項目選択後Conditionsの右下にある+をクリックして項目を追加する

追加された項目のプルダウンメニューから関連づけたいTrigger名を選択する

4.SkeletonData のための Script を作る

Projectウィンドウで
右クリック >> Create >> C#Script を選択する
※ファイル名は何でも良いがクラス名も同じにする必要がある

ファイルをダブルクリックで開いて以下を記述して保存する

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Spine;
using Spine.Unity;

public class Sample : MonoBehaviour //クラス名はファイル名と同じにする Sample のところ
{
	Animator animator; //Animator型変数の宣言
	// Start は最初のフレーム更新の前に呼び出されます
	void Start()
	{
		//変数にAnimatorControllerを代入
		this.animator = GetComponent<Animator>();
	}
	// Updata はフレームごとに1回呼び出される
	void Update()
	{
		//UpArrowは「↑」キーのこと
		if (Input.GetKeyDown(KeyCode.UpArrow)) {
			animator.SetTrigger("triggerA");
		}
		//DownArrowは「↓」キーのこと
		else if (Input.GetKeyDown(KeyCode.DownArrow)) {
			animator.SetTrigger("triggerB");
		}
	}
}

↓Unityキーコード リファレンス

ifの意味
if (条件) {条件を満たした時に実行する処理}
※else ifで条件を追記していく

Input.GetKeyDown(KeyCode.UpArrow)の意味
KeyCodeがUpArrowのキーがGetKeyDown押された時に条件を満たす

animator.SetTrigger("triggerA");の意味
animatorに入っているAnimatorControllerのtriggerAというTriggerをオンにする
※triggerAのところは自分で作ったTriggerの名前を記述する

Animator Controllerを使用しない場合

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Spine;
using Spine.Unity;

public class Sample : MonoBehaviour //クラス名はファイル名と同じにする Sample のところ
{
	Animator animator;

	void Start()
	{
		this.animator = GetComponent<Animator>();
	}

	void Update()
	{
		//UpArrowは「↑」キーのこと
		if (Input.GetKeyDown(KeyCode.UpArrow)) {
			GetComponent<SkeletonAnimation> ().state.SetAnimation (0, "animationA", true);
		}
		//DownArrowは「↓」キーのこと
		else if (Input.GetKeyDown(KeyCode.DownArrow)) {
			GetComponent<SkeletonAnimation> ().state.SetAnimation (0, "animationB", true);
		}
	}
}

GetComponent<SkeletonAnimation> ().state.SetAnimation (0, "animationA", true);の意味
あまり意味はわかってないので簡単に説明すると
このScriptをAdd ComponentしているSkeletonDataのanimationAを再生する処理

5.SkeletonDataを配置する

Projectウィンドウにある SkeletonData を Hierarchyウィンドウにドラッグ&ドロップしSkeletonAnimationを選択する
↓SkeletonDataのファイル名
「インポート時のファイル名」_SkeletonData

カメラの前に配置する

6.SkeletonDataにAnimator ControllerをAdd Componentする

※Animator Controllerを作成していない場合はこの工程は必要ない

HierarchyウィンドウのSkeletonDataを選択してInspectorウィンドウの一番下のAdd ComponentをクリックしMiscellaneous >> Animatorを選択する

Inspectorウィンドウに追加したAnimatorにあるControllerの項目の右の◎をクリックして作成したAnimator Controllerを選択する
※HierarchyウィンドウのSkeletonDataにAnimator Controllerファイルをドラッグ&ドロップしても良い

7.SkeletonData に Script をAdd Componentする

HierarchyウィンドウのSkeletonDataを選択してInspectorウィンドウの一番下のAdd Componentをクリックし🔍検索ボックスに4で作成したScriptのファイル名を入力してファイルを選択する
※検索でファイルが表示されない場合はファイル名とクラス名が違うまたはScript内にエラーがある可能性がある

※HierarchyウィンドウのSkeletonDataにScriptファイルをドラッグ&ドロップしても良い
ドラッグ&ドロップしても追加できない場合はファイル名とクラス名が違うまたはScript内にエラーがある可能性がある

8.▶︎実行ボタンを押して確認する

実行できない場合は
Consoleウィンドウでエラーを確認して問題の箇所を探す
Window >> General >> Console

ボタンを配置して操作する場合はif文の中の処理を
ボタン用のScriptの中にその処理を記述すれば大丈夫です

問題なく実行できたら完成

説明は間違えている可能性もあるので自分でも調べて確認してみてください

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