Unityでキャラクターアニメーションの表示を行い、キーボード操作でアニメーションを変化させるスクリプトを組み込んでみます。
今回使用する環境は以下の通りです。
- アニメーションデータ
キャラクターアニメーション テンプレート
サンプルデータ としてダウンロードして使用可能です。 - 再生するUnityの環境
SS6Player for Unity v1.0.36
Unity 2018.1.3f1
目次
作成手順
アニメーションデータ準備
今回使用するキャラクターアニメーションテンプレートを下記ページより ダウンロードします。
- サンプルデータ > キャラクターアニメーションテンプレート
直ぐ使えるサンプルデータのダウンロードページになります。
「ダウンロード」を押すと、OPTPiX_SpriteStudio_Animation_Template_20180220.zip というファイルがダウンロードされるので展開します。
今回は、展開したファイルを
E:¥SpriteStudioData¥OPTPiX_SpriteStudio_Animation_Template
に保存して説明を行います。
新しくプロジェクトを作成
Unityを開き、Fileメニューから「New Project」を選択し、新しくプロジェクトを作成します。SS6Player for Unity をセッティング
SS6Player for Unity をプロジェクトに加えます。
詳しい方法は「Unityにアニメーションを表示する」を参照してください。
- Unityにアニメーションを表示する
SS6Player For UnityでUnityにインポートする方法を解説しています。
フォルダを準備
リソースを納めるフォルダの綴りに気を付けましょう。「Resources」に格納されているデータを参照する仕様になっているためです。
フォルダ名に誤りがあるとインポートしたアニメーションを参照できず、NULLエラーが発生します。
sspjインポート
再生したいsspjをインポートします。
インポートの詳しい手順は「Unityにアニメーションを表示する」の下記項目を参照してください
- Unityにアニメーションを表示する>sspjをUnityに取り込む
SpriteStudio Ver.6のデータをUnityにインポートする方法を解説しています。
スクリプト作成
次にキャラクターを制御するスクリプトを準備します。
| 1.Projectウィンドウを右クリックし、コンテキストメニューの「Create」→「C# Script」でスクリプトを作成します。 | ![]() |
| 2.今回は「CharacterControl」という名称のスクリプトを作成しました。 | ![]() |
準備したスクリプトにキャラクター制御について記載します。
今回使用したスクリプトは「スクリプト解説」の項に掲載しています。
スクリプトについては、コピーして貼り付けていただくだけで各種設定可能になります、準備してから次の項目へ進むようお願いします。
キャラクター制御の準備
これでキャラクター制御の準備が完了しました。
カメラの確認
SS6Player for Unity をセッティングする際に、アニメーションが表示されるカメラ調整済の場合は、本項目の手順はスキップしてください。
キャラクターを動かす
インポートしたssaeとスクリプトが動作するか確認します。
|
1.作成したものを動かします。
|
|
| 2.スクリーン中央に「PRESS SPACE」と表示されます。 スペースキーを押してください。 |
![]() |
| 3.中央にキャラクターが表示されます。 | ![]() |
| 4.矢印キーで左右に走って移動。 Zキーでアタックのアニメーションが再生されます。 |
![]() |
| 5.動作を確認して完了です。 スクリプトを変更して、他のアニメーションを再生することも可能です。 下記のスクリプト解説を参考に試してみてください。 |
|
スクリプト解説
今回組み込んだスクリプトについて解説します。
スクリプトについては、できるだけシンプルに記述しています。
SpriteStudio のデータを組み込み、制御する際の参考にしていただけると幸いです。
CharacterControl.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CharacterControl : MonoBehaviour {
// 再生アニメーションのResourcesフォルダ内のサブパス
[SerializeField]
public Object[] AnimationList;
// 再生アニメーション指定用
private enum AnimationPattern : int
{
Wait = 33, // 待機
Attack = 1, // 攻撃
Run = 24, // 走り
Count
}
// キャラクター管理用
private GameObject m_goCharacter = null;
private GameObject m_goCharPos = null;
private Vector3 m_vecCharacterPos; // キャラクター位置
private Vector3 m_vecCharacterScale; // キャラクタースケール
// 処理ステップ用
private enum Step : int
{
Init = 0, // 初期化
Title, // タイトル
Wait, // 待機
Move, // 移動
Attack, // 攻撃
End
}
// 処理ステップ管理用
private Step m_Step = Step.Init;
// 汎用
// いろいろ使いまわす用変数
private int m_Count = 0;
private bool m_SW = true;
// Use this for initialization
void Start () {
// キャラクターパラメータ関連を設定
// 座標設定
m_vecCharacterPos.x = 0.0f;
m_vecCharacterPos.y = -240.0f;
m_vecCharacterPos.z = 0.0f;
// スケール設定
m_vecCharacterScale.x = 0.5f;
m_vecCharacterScale.y = 0.5f;
m_vecCharacterScale.z = 1.0f;
}
// Update is called once per frame
void Update () {
switch(m_Step)
{
// 初期化
case Step.Init:
m_Count = 0;
m_SW = true;
m_Step = Step.Title;
break;
// タイトル
case Step.Title:
if (++m_Count > 15) {
m_SW = !m_SW;
m_Count = 0;
}
if( Input.GetKeyDown(KeyCode.Space) == true ) {
AnimationStart(); // アニメーション開始処理(設定)
m_Step = Step.Wait;
}
break;
// 待機
case Step.Wait:
if (Input.GetKeyDown(KeyCode.Z) == true) // 攻撃
{
// 攻撃に変更
AnimationChange(AnimationPattern.Attack);
m_Step = Step.Attack;
}
else if (Input.GetKeyDown(KeyCode.LeftArrow) == true) // 左移動
{
if (m_vecCharacterScale.x < 0)
m_vecCharacterScale.x *= -1; // 左向きにします
m_goCharPos.transform.localScale = m_vecCharacterScale; // 向き設定
// 走りに変更
AnimationChange(AnimationPattern.Run);
m_Step = Step.Move;
}
else if (Input.GetKeyDown(KeyCode.RightArrow) == true) // 右移動
{
if (m_vecCharacterScale.x > 0)
m_vecCharacterScale.x *= -1; // 右向きにします
m_goCharPos.transform.localScale = m_vecCharacterScale; // 向き設定
// 走りに変更
AnimationChange(AnimationPattern.Run);
m_Step = Step.Move;
}
break;
// 移動
case Step.Move:
if (Input.GetKey(KeyCode.LeftArrow) == true) // 左移動
{
if(m_vecCharacterPos.x > -560.0f)
m_vecCharacterPos.x -= 10.0f;
}
else if (Input.GetKey(KeyCode.RightArrow) == true) // 右移動
{
if (m_vecCharacterPos.x < 560.0f)
m_vecCharacterPos.x += 10.0f;
}
else
{
// 待機に変更
AnimationChange(AnimationPattern.Wait);
m_Step = Step.Wait;
}
m_goCharPos.transform.localPosition = m_vecCharacterPos; // 座標反映
break;
// 攻撃中
case Step.Attack:
if(IsAnimationPlay() == false)
{
// 待機に変更
AnimationChange(AnimationPattern.Wait);
m_Step = Step.Wait;
}
break;
default:
break;
}
}
private void OnGUI()
{
// GUI変更
GUIStyle guiStyle = new GUIStyle();
GUIStyleState styleState = new GUIStyleState();
switch (m_Step)
{
// タイトル
case Step.Title:
if (m_SW == true)
{
styleState.textColor = Color.black; // 文字色 黒
guiStyle.normal = styleState; // スタイルの設定。
GUI.Label(new Rect(420, 180, 100, 50), "PRESS SPACE", guiStyle);
}
break;
default:
break;
}
}
// アニメーション開始
private void AnimationStart()
{
Script_SpriteStudio6_Root scriptRoot = null; // SpriteStudio Anime を操作するためのクラス
int listLength = AnimationList.Length;
// すでにアニメーション生成済 or リソース設定無い場合はreturn
if (m_goCharacter != null || listLength<1)
return;
// 再生するリソース名をリストから取得して再生する
Object resourceObject = AnimationList[0];
if (resourceObject != null)
{
// アニメーションを実体化
m_goCharacter = Instantiate(resourceObject, Vector3.zero, Quaternion.identity) as GameObject;
if (m_goCharacter != null)
{
scriptRoot = Script_SpriteStudio6_Root.Parts.RootGet(m_goCharacter);
if (scriptRoot != null)
{
// 座標設定するためのGameObject作成
m_goCharPos = new GameObject();
if (m_goCharPos == null)
{
// 作成できないケース対応
Destroy(m_goCharacter);
m_goCharacter = null;
}
else
{
// Object名変更
m_goCharPos.name = "Comipo";
// 座標設定
m_goCharacter.transform.parent = m_goCharPos.transform;
// 自分の子に移動して座標を設定
m_goCharPos.transform.parent = this.transform;
m_goCharPos.transform.localPosition = m_vecCharacterPos;
m_goCharPos.transform.localRotation = Quaternion.identity;
m_goCharPos.transform.localScale = m_vecCharacterScale;
//アニメーション再生
AnimationChange(AnimationPattern.Wait);
}
}
}
}
}
// アニメーション 再生/変更
private void AnimationChange(AnimationPattern pattern)
{
Script_SpriteStudio6_Root scriptRoot = null; // SpriteStudio Anime を操作するためのクラス
int iTimesPlaey = 0;
if (m_goCharacter == null)
return;
scriptRoot = Script_SpriteStudio6_Root.Parts.RootGet(m_goCharacter);
if (scriptRoot != null)
{
switch (pattern)
{
case AnimationPattern.Wait:
iTimesPlaey = 0; // ループ再生
break;
case AnimationPattern.Attack:
iTimesPlaey = 1; // 1回だけ再生
break;
case AnimationPattern.Run:
iTimesPlaey = 0; // ループ再生
break;
default:
break;
}
scriptRoot.AnimationPlay(-1, (int)pattern, iTimesPlaey);
}
}
// アニメーションが再生中か停止中(エラー含)か取得します
private bool IsAnimationPlay()
{
bool ret = false;
Script_SpriteStudio6_Root scriptRoot = null; // SpriteStudio Anime を操作するためのクラス
if (m_goCharacter != null)
{
scriptRoot = Script_SpriteStudio6_Root.Parts.RootGet(m_goCharacter);
if (scriptRoot != null)
{
// 再生回数を取得して、プレイ終了かを判断します
int Remain = scriptRoot.PlayTimesGetRemain(0);
if (Remain >= 0)
ret = true;
}
}
return ret;
}
}
関数解説
- void Start ()
キャラクターに関連するパラメータの初期化を行っています。 - void Update ()
毎フレーム行われる処理を m_Step の指定で処理が変化するように組んでいます。 - void OnGUI()
文字表示を行うために使用しています。 - void AnimationStart()
アニメーションを開始する処理をまとめています。
プログラム上から、アニメーションのprefab を読み込んで、GameObjectを生成、座標指定しての表示を行っています。 - void AnimationChange(AnimationPattern pattern)
アニメーションパターンの切り替えを行っています。 - bool IsAnimationPlay()
アニメーションが再生中かどうか取得します。
特定のアニメーションで終了を取得するために設けました。
関連ページ
- Unityにアニメーションを表示する
SS6Player For UnityでUnityにインポートしてアニメーションを再生する方法を解説しています。 - 複数のsspjをUnity上で連続再生する
複数のsspjを、SS6Player for Unityを使用して連続で再生する方法を解説しています。 - Unityの機能に変換して使用する
sspjをUnityの標準機能を使用する形に変換してインポートする方法を解説しています。 - Unity で再生した際に、パーツがチラチラ明滅するのに対処したい
Zファイティングが発生した際の対処方法を解説しています。
SS6Player For Unity
最新版、質問・要望は GitHubへ





















