Unityでパラパラアニメーションを実装
2Dのアクションゲームを作るならやっぱりパラパラアニメしないとね!
ということでざっくり動いてるものを作りました。
とりあえず欲しい機能としては
・一連のテクスチャを登録
・更新する頻度を設定
・ループするかどうか
以上が満たせれていればOKということにします
実装するにあたり、スクリプトを2つ用意しました
SpriteAnimationBase.cs
SpriteAnimation.cs
SpriteAnimationBaseクラスの方では最終的にスクリプトから利用することを目的としております。
SpriteAnimationクラスはSpriteAnimationBaseクラスを継承してインスペクタの設定のみで試すことができるクラス。
作ったものをささっと試したい場合はSpriteAnimationを使うと試すことができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
using UnityEngine; using System.Collections; public class SpriteAnimationBase : MonoBehaviour { protected SpriteRenderer m_SpriteRenderer; public Sprite[] m_SpriteArr; protected float m_fTime; // 現在の時間 public float m_fInterval; // アニメーションを切り替える経過時間 protected int m_iIndex; // アニメーションの番号 private int m_iIndexMax; // アニメーションのコマ最大数 public bool m_bIsLoop = true; // ループするかどうか public enum STEP { NONE = 0, INIT , ANIMATION , END , MAX , } protected STEP m_eStep; protected STEP m_eStepPre; public void Init( SpriteRenderer _SpriteRenderer ){ m_SpriteRenderer = _SpriteRenderer; m_fTime = 0.0f; m_iIndex = 0; m_eStep = STEP.ANIMATION; m_eStepPre = STEP.MAX; } void Update () { bool bInit = false; if (m_eStepPre != m_eStep) { m_eStepPre = m_eStep; bInit = true; } float fDelta = Time.deltaTime; switch (m_eStep) { case STEP.NONE: break; case STEP.ANIMATION: if (bInit) { m_fTime = 0.0f; m_iIndex = 0; m_iIndexMax = m_SpriteArr.Length; if (m_iIndexMax == 0) { Debug.LogError ("Zero SpriteArr!!"); } } m_fTime += fDelta; int iAddIndex = (int)(m_fTime / m_fInterval); if (0 < iAddIndex) { m_fTime -= m_fInterval * iAddIndex; int iTempFrame = m_iIndex + iAddIndex; if (m_iIndexMax <= iTempFrame) { if (m_bIsLoop == false ) { iTempFrame = m_iIndexMax - 1; m_eStep = STEP.END; } } m_iIndex = iTempFrame % m_iIndexMax; m_SpriteRenderer.sprite = m_SpriteArr [m_iIndex]; } break; case STEP.END: break; default: break; } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
using UnityEngine; using System.Collections; [RequireComponent(typeof(SpriteRenderer))] public class SpriteAnimation : SpriteAnimationBase { // Use this for initialization void Start () { m_SpriteRenderer = GetComponent<SpriteRenderer> (); Init (m_SpriteRenderer); } } |
プロジェクト内で空のGameObjectを追加したらAddComponent>SpriteAnimationを選択
Sprite Arr : ゲームなどで使用する画像をドラッグアンドドロップで追加する
→画像内だとtotoki_airi_03 〜 totoki_airi_06
→入れた順番がアニメーションの順番になります
F Interval : アニメーションを更新する時間を設定
→1だと1秒に1回画像を更新します
B Is Loop
→チェックを入れるとアニメーションがループします。
そして、ゲームを再生すると、うん!動いた!
静止画じゃよくわからないので、WebGLで出力したものもついでに上げてみました。
相変わらず起動するまで時間かかりすぎじゃないですかねぇ・・・
ちょっと失礼します。
Unityのスプライトアニメですが、必要な機能はUnityに標準でついてますよ。
ヒエラルキー上のSpriteを選択して、Animationウィンドウの録画ボタンをクリックでアニメーションファイルを作成。
Animationウィンドウに使いたいスプライトをDrag&Dropで作成できます。
FPSの設定もできますし、ループのON/OFFも設定できます。
また、AnimationControllerで制御もできるので便利です。
しろくろさん
アドバイスありがとうございます
教えていただいたAnimation、試してみました。
試してみましたが、色々と簡単に試せて便利ですね!
普段Animatorウインドなど使ってなかったのでいろいろと目からウロコでした。
またご指摘等あれば、よろしくお願いいたします!!