Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

v1.0.18 Unity-Nativeモードで複数のアニメーションオブジェクトの描画順序を制御するには? #28

Open
MasamiYitsuse opened this issue Jan 9, 2018 · 0 comments
Assignees
Labels

Comments

@MasamiYitsuse
Copy link
Collaborator

MasamiYitsuse commented 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 : このアニメーションの描画パーツ全てのsortingOrderをずらすための値
  • .CountDrawPartsMax: (読み取り専用・書き込んでも何も起こりません)このアニメーションオブジェクトが最大で使用する描画パーツ数
  • .SortingOffsetPartsDraw: このアニメーションオブジェクトの1描画パーツ毎で加算されるsortingOrderの値(必ず1以上の値を設定してください)
  • .TableTransformBonePoint : (読み取り専用)このアニメーションに含まれるボーンポイントのトランスフォーム配列

が含まれています。

この内の、SortingOrderの値を変更することによって、複数オブジェクト間での描画順序を制御することが可能です。
アニメーション中の各描画パーツは(それぞれの描画パーツについているScript_SpriteStudio6_PartsUnityNativeのLateUpdateの処理中で)

  • 「SortingOrder + (パーツのOrderInLayer × SortingOffsetPartsDraw)」

の結果値を各描画パーツ用レンダラのsortingOrderに設定します。
※「パーツのOrderInLayer」は随時AnimationClipから更新される「そのパーツが何番目に描画されるか」の値で、0以上の値になります。
※つまり、「SortingOffsetPartsDraw」は、インポート後の各パーツの間に他の描画を挟みたい場合などに使用して、各パーツ間のsortingOrderの間にマージンを作りたい場合に使用します。

RendererのsortingOrderは、-32768~32767の間の値となり、値が高いほど手前に表示されます。
その際に、

  • 最終的なパーツのRenderer.sortingOrderの値がこの範囲を超えないようにしてください。
  • マスクパーツのSpriteMask.backSortingOrderは「SortingOrder-1」になります。
    ※つまりSortingOrderを-32768などに設定すると、マスクを使用していた場合誤動作する可能性があります。

という点に注意してください。


実際の運用で本クラスに拡張などを行う場合は

  • (Script_SpriteStudio6_RootUnityNativeクラスはpartial宣言されているので)アプリケーション側の別ソースリストなどでScript_SpriteStudio6_RootUnityNativeクラスに直接機能を追加する
  • Script_SpriteStudio6_RootUnityNativeクラスを継承した別のクラスを作成する

などがあります。
あくまで原則としてですが……

  • Script_SpriteStudio6_RootUnityNativeに搭載されている情報を扱うためのユーティリティ処理(例えばTableTransformBonePartsの中から特定の名前のパーツを検索する……など)や、全アニメーションで共通するような処理(transform.zをSortingOrderに反映する……など)は、Script_SpriteStudio6_RootUnityNativeにpartialで直接拡張する
  • Script_SpriteStudio6_RootUnityNativeを使用して各アニメーションオブジェクト種類によって、それぞれ専用のユーティリティ処理を行う場合などについては派生クラスを作成する

……などの使い分けが考えられます。

また、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のアニメーションを実装できるようにする」という基本前提があるためです。
※また、再現性よりも速度を求めるようなプロジェクトへ……という側面も存在しますため、なるだけ処理を簡潔に最低限にしている側面もあります。

@MasamiYitsuse MasamiYitsuse changed the title v1.0.17 Unity-Nativeモードで複数のアニメーションオブジェクトの描画順序を制御するには? v1.0.18 Unity-Nativeモードで複数のアニメーションオブジェクトの描画順序を制御するには? Jan 9, 2018
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants