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.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
MasamiYitsuse
changed the title
v1.0.17 Unity-Nativeモードで複数のアニメーションオブジェクトの描画順序を制御するには?
v1.0.18 Unity-Nativeモードで複数のアニメーションオブジェクトの描画順序を制御するには?
Jan 9, 2018
※SS6PU Ver.1.0.15以前のバージョンの場合、本機能は実装されていないため、SS6PU Ver.1.0.18以降に更新して、Unity-Nativeモードでインポートしたデータを再インポートしてください。
※SS6PU Ver.1.0.17で本件を一度実装しましたが、仕様的な問題が発見されたために仕様を若干変更し、Ver.1.0.18に更新しています。Ver.1.0.17を使用している場合、Ver.1.0.18以降に更新を推奨します。
Unity-Nativeモードでインポートしたアニメーションオブジェクトは、各描画パーツのレンダラ(SpriteRenderer/SpriteMask/SkinnedMeshRenderer/MeshRenderer)のsortingOrderで描画順序を制御しているために、Z座標などでの描画順制御が効き辛い状態にあります。
その状態を緩和しやすくなるよう、Ver.1.0.18からUnity-Nativeモードでインポートしたアニメーションオブジェクトのrootパーツの位置に「Script_SpriteStudio6_RootUnityNative」というスクリプトコンポーネントが付与されています。
このスクリプトには(Ver.1.0.18時点で)
が含まれています。
この内の、SortingOrderの値を変更することによって、複数オブジェクト間での描画順序を制御することが可能です。
アニメーション中の各描画パーツは(それぞれの描画パーツについているScript_SpriteStudio6_PartsUnityNativeのLateUpdateの処理中で)
の結果値を各描画パーツ用レンダラのsortingOrderに設定します。
※「パーツのOrderInLayer」は随時AnimationClipから更新される「そのパーツが何番目に描画されるか」の値で、0以上の値になります。
※つまり、「SortingOffsetPartsDraw」は、インポート後の各パーツの間に他の描画を挟みたい場合などに使用して、各パーツ間のsortingOrderの間にマージンを作りたい場合に使用します。
RendererのsortingOrderは、-32768~32767の間の値となり、値が高いほど手前に表示されます。
その際に、
※つまりSortingOrderを-32768などに設定すると、マスクを使用していた場合誤動作する可能性があります。
という点に注意してください。
実際の運用で本クラスに拡張などを行う場合は
などがあります。
あくまで原則としてですが……
……などの使い分けが考えられます。
また、Script_SpriteStudio6_RootUnityNativeクラスはMonoBehaviourを継承してはいますが、Awake/Start/Update/LateUpdate関数などを実装していませんので、アプリケーション側の拡張側のpartialで、本関数群を実装することによって、毎処理ループ毎に定型の処理を行わせることが可能です。
例えば、Update関数でtransfrom.localPosition.zを取得して・その値を元にSortingOrderの値を設定する……などです(例えばこれを行うことで、カメラが正対している場合において・TransformのPositionZの値を制御すると連動してsortingOrderの値が変更できるようになります)。
※勿論、本クラス内で行わず、他のスクリプトから値を設定しても構いません。
※注釈:
MonoBehaviour関係の関数を実装する場合は、できるだけScript_SpriteStudio6_RootUnityNativeに直接関数を実装して、(派生クラス毎で処理が違う場合は)その中から派生クラスの関数を呼び出すようにする方が安全かと思われます(この手の実装の場合、大半はこの呼び出される派生クラスの関数が仮想関数になる場合が多いと思います)。
※記憶に間違いがなければ、派生クラス側でMonoBehaviour関係の関数を実装した場合、Unity側で派生クラスで実装された関数を発見できない場合があった気がします。
※追記
原則、今後本Script_SpriteStudio6_RootUnityNativeクラスには、関数などを実装して機能を拡張していくことは予定としてありません(このスクリプトから取得できる変数値などは追加していく可能性はありますが、それらを処理するユーティリティ関数などの実装は現在考えていません)。
その理由としては、Unity-Nativeモードの基本的な考え方として、「Unityの基本機能に落とすことによって、できる限りUnityそのものに対する理解だけでSpriteStudio6のアニメーションを実装できるようにする」という基本前提があるためです。
※また、再現性よりも速度を求めるようなプロジェクトへ……という側面も存在しますため、なるだけ処理を簡潔に最低限にしている側面もあります。
The text was updated successfully, but these errors were encountered: