アニメーションの再生

YITSUSE, Masami edited this page Dec 25, 2017 · 90 revisions

インポートしたアニメーションを再生する基本的な手順になります。

空のシーン

シーン(Hierarchy)に何もない状態です。
※この状態から始める必然性はまったくありません。

InitialPlay-Step01

カメラを設置する

InitialPlay-Step02

新規(空の)シーンに、カメラを設置します。
Unityの上部メニュー[GameObject]-[Camera]から作成する新規カメラでも構いませんし、「Asset/SpriteStudio6/Camera/」の中にあるサンプルカメラを使用しても構いません。

サンプルのカメラはそれぞれ720pと1080pの解像度をドット・バイ・ドット(GameObjectのTransformのPositionの1.0が1ピクセル相当)で扱うための設定になっています。

  • Camera2D Pixel (720p) : 1280×720
  • Camera2D Pixel (1080p) : 1920×1080

※サンプルのカメラ(Camera2D Pixel)とUnityで新規作成したカメラとで設定が異なっている点(もしくはUnityのOrthographicカメラの初期設定でSS6PUのアニメーションを同じ大きさで出す方法)については、こちらを参照してください。

アニメーションをシーンに配置する

InitialPlay-Step03

シーンにカメラを設置したら、インポートしたアニメーションのプレハブをシーンにドロップします。
シーン内の配置位置については、どこでも構いません(カメラに追従するのであればCameraの下に置いても構いませんし、ご都合の良い階層に設置してください)。
※ここではカメラと同じ階層(シーンのルート直下)に置いています。

インポートしたアニメーションは、Projectウィンドウ内の下記にあります。

  • 制御用プレハブを作成した場合
    インポート時に「Create Control-Prefab」をチェックしていた場合は、インポート時に指定したアセットフォルダの直下に「ssae名_Control」という名前のプレハブがあります。
  • 制御用プレハブを作成しなかった場合
    インポート時に「Create Control-Prefab」をチェックしていない場合は、インポート時に指定したアセットフォルダの下に「PrefabAnimation」というフォルダがあります。
    その中にssaeと同じ名前のプレハブがあります。

「Convert To Unity-Native」モードでインポートした場合、追加の手順が必要なので、こちらを参照してください

※制御用プレハブの役割と有無の差については、こちらの解説を参照してください

ここで何も表示されない場合は、こちらの項目をチェックしてみてください

アニメーションの設定

さらに、アニメーションの再生状態を変更する場合には、アニメーション(Script_SpriteStudio6_Root)用インスペクタから設定を行います。

InitialPlay-Step04

アニメーション用インスペクタは下記にあります。

  • 制御用プレハブがある場合 シーンに置いたアニメーションのプレハブのひとつ下のGameObjectにあります。
  • 制御用プレハブがない場合 シーンに置いたアニメーションのGameObjectにあります。

そのアニメーション用インスペクタの「Initial/Preview Play Setting」のフォールドアウトを開きます。
その中にある「Animation Name」のプルダウンメニューでアニメーションを選択します。
※上記の画像ではアニメーションが1つしかありませんが、元のssaeファイルに複数のアニメーションがある場合には、複数のアニメーション名が表示されます。

アニメーション用インスペクタの詳細はこちらを参照してください。


さらに複雑なアニメーション制御をする

ゲームなどで使うには、もっと複雑な制御をする必要が生じてきますが、その場合にはスクリプト(C#やJavaScriptなど)からプログラマブルな操作をする必要があります。

スクリプトからのアニメーションの操作については、こちらを参照してください
また、sampledevelopブランチでサンプルプログラムを提供しております。


何も表示されない場合

何も表示されない場合は次の項目を確認してください。

  • 座標が画面外に出ていませんか?
    オブジェクトのTransformのPositionをX=0, Y=0, Z=0 に変更してみてください。

  • スケールが小さくなっていませんか?
    オブジェクトのTransformのScaleをX=1, Y=1, Z=1 に変更してみてください。

  • カメラの座標とスケールが変な値になっていませんか?
    オブジェクトと同様にカメラの座標やスケールに値が入っていると、期待とことなる表示をします。
    カメラののTransformのPositionをX=0, Y=0, Z=0・ScaleをX=1, Y=1, Z=1 に変更してみてください。

  • カメラのNearクリップ・Farクリップに引っ掛かっていませんか?
    Cameraに設定されるNearよりも手前(例えばNearが0の場合、Z座標が0未満)に配置すると表示されなくなります。 同様にFarよりも奥に配置しても表示されなくなります。
    NearとFarの間にアニメーションを配置する(TransformのPosition-Zを調整する)事で表示されるようになります。

  • Script_SpriteStudio6_Rootのインスペクタで「Hide Force」がチェックされていませんか?
    「Hide Force」がチェックされていると、アニメーションが強制的に非表示になります。

制御プレハブの役割について

インポータの「(「Basic」オプション)Create Control-Prefab」で有無を設定できる「制御プレハブ」について、その基本的な役割を解説します。

制御用プレハブの基本的な構造は(その設置目的から)
「本来のアニメーションオブジェクトの上に1つGameGaobjectが存在している」
状態ということができます。
※実際にはもう少し複雑な実装になっていますが、ここではその詳細な説明は割愛します。ただ、この実装によってスクリプトから動的に扱う場合に注意点が生じます。それについては、後述します。

SpriteStudio6のデータはRootパーツ(デフォルトのパーツ名「root」)にもX/Y/Z座標・X/Y/Z軸回転・X/Yスケールを指定することができます。
(Rootパーツの)これらのアトリビュートは、Unity上でアニメーションオブジェクトの一番上の(Script_SpriteStudio6_Rootを持っている)GameObjectのTransformに反映されます。
インポートしたデータの中の「PrefabAnimation」フォルダの中にあるデータがこのデータになります。
このデータを直接シーンに置いてアニメーションオブジェクトを移動させようとした場合に、(指定したデータとアニメーションデータとで)Transformを奪い合いしてしまい思い通りに動かせないことが生じます。

これを避けるためにはいくつかの方法があります。

  1. ひとつ上(親)に何も制御されていないGameObjectを置いて・そのGameObjectを制御するようにする。
  2. RootパーツにはTransformに影響を与えるアトリビュートは使用しないで、Rootパーツの子にNULLパーツを設置して(このパーツの下に全てのパーツを配置する)ことでRootパーツに対応したGameObjectを直接操作できるようにする。

この1の方法を自動で作成する設定が「Create Control-Prefab」です。
※余談ではありますが、この「制御用のGameObjectごとプレハブに格納してある」というのが、「制御用プレハブ」の呼称の由来です。

同様の現象は3Dモデルをインポートした時にも起こることがあり、その場合にも同様の方法が回避策のひとつとなります。
ですので、同じ役割(制御用)のGameObjectを自分で設置することの方に慣れている場合、(制御用プレハブを作成せずに)PrefabAnimationフォルダの中にあるアニメーションのプレハブを直接(自分で設置した)GameObjectの下に設置する用法でも問題ありません。

制御用オブジェクトのプレハブを実体化するときの注意点

制御用オブジェクトが付いているプレハブ(制御用プレハブ)をスクリプトからinstantiateする際に、注意点が存在しています。

  • 制御用プレハブをinstantiateした直後は、アニメーションが扱えない。
    制御用オブジェクトには、実体のアニメーションオブジェクトを自身の子としてinstantiateするためのスクリプト(Script_SpriteStudio6_ControlPrefab)が付加されています。
    そのため、スクリプトで制御用プレハブをinstantiateした直後には、(アニメーションオブジェクト自体は実体化されていないため)「Script_SpriteStudio6_Root.RootGet」関数の返値は常にnullになりアニメーションの制御が行えません。
    制御用プレハブを実体化した場合、次の処理サイクル以降で「Script_SpriteStudio6_Root.RootGet」関数を実行してアニメーションの操作を行うようにしてください(アニメーションオブジェクトのプレハブを直接instantiateした場合や、すでにシーンに設置してある制御用プレハブについては、それを考慮する必要はありません)。
    制御用オブジェクトが専用スクリプトを介してinstantiate処理を行っている理由は、「プレハブのネスト(プレハブの入れ子)」と同様の構造をネストされたプレハブへの参照を失わないように実現するためとなっています。

サンプルのカメラと新規作成したカメラとの違い

サンプルのカメラ(Camera2D Pixel)は、Unityのカメラを新規作成した時と下記の点が異なっています。

  • カメラが「Orthographic」(平行投影)になっている。デフォルトは「Perspective」(遠近法)。
  • 720pと1080pの解像度になるように設定されている(Sizeが縦方向ピクセル数の1/2)。
  • 「Clipping Plains」が「Nearが0」「Farが10000」になっている。
  • 「Occulision Culling」「Allow HDR」「Allow MSAA」などのオプションが非チェックになっている。
  • 「Flare Layer」「GUI Layer」「Audio Listener」などの他のコンポーネントを削除してある。

上記の内、「Size」の値について若干触れておきます。
「Orthographic」に設定した時の(この)Sizeの値は、「画面の縦をどれ位の値の幅で管理するか」を設定する項目です。
例えば初期状態の「5」の場合、「5(上端)~-5(下端)」の間で管理されています。
サンプルのカメラの720pの場合、「360(上端)~-360(下端)」の間で管理されています。
GameObjectのTransformのPosition-Yの値がこの範囲内なら画面内にあると考えていただいて構いません(画面の座標系の分解能と言い換えることができます)。

つまり、単にスケールの違いなので、インポートしたSpriteStudio6のデータを初期状態の「OrthoGraphic」「Size=5」の状態のカメラに同じような大きさで出したい場合は
「TransformのScale-XとScale-Yを(約)0.0139に設定」
すればよいことになります。
※「5 ÷ 360 = 0.01388888... = 約0.0139」の計算になります。
※元のアニメーションが1080p(Size=540)想定で作成されている場合には、「5 ÷ 540 = 約0.00926」になります。

Clone this wiki locally
You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.
Press h to open a hovercard with more details.