AnyPortrait > マニュアル > メッシュ取付時の「Sorting Order」設定

メッシュ取付時の「Sorting Order」設定


1.3.4

ゲームでは、キャラクターの外部のメッシュを衣装や武器のように取り付けます。
このとき、付着したメッシュのレンダリング順序を適切に修正することは非常に重要です。
他のマニュアルで「Sorting Order」を利用して、レンダリングの順序を定める方法について紹介したことがあります。
ここに加えて、このページは「[Extra設定」によって、リアルタイムでメッシュのレンダリング順序が変わる場合にも説明します。
このページに関連する、以下のマニュアルを一緒に見れば助けになるでしょう。
- スクリプト : 初期化、基本設定
- スクリプト : メッシュ、メッシュグループ
- 「Sorting Layer/Order」設定
- レンダリング順序と画像の切り替え
- キャラクターにアイテム装備
- 他のキャラクターとの同期
- ボーンを同期してコスチュームを変更


特にこの例では、「ボーンの同期」機能を利用します。
ボーンの同期の詳細については、関連ページでご確認ください。




説明のために作られたロボットキャラクターです。
この例では、一つの腕が体の周りを回りながら動くようにすることです。




腕が体の正面、背面に動くように作るためには、「関連ページ)を使用してください。
(1) 「Color Only(Controller)」モディファイヤを追加します。
(2) 「Extra Option」を有効にします。
(3) 腕の描画位置を制御する制御パラメータを生成した状態でキーを追加します。
(4) 腕メッシュを選択します。
(5) 「Setボタン」を押して「 Extra設定」ダイアログを開きます。
(6) メッシュの「Detph」が体の前、後方に移動するようにします。




腕が制御パラメータに応じて、体の前または後ろのレンダリングされるようになりました。




ボーンアニメーションまでに完成しました。
腕が体の周りをぐるぐる回りながら動くのを見ることができます。




新しいキャラクターを作成します。
このキャラクターは、「ロボットアームに装着されている機器の」です。
「Equip1〜4」という4つのメッシュがあります。
このキャラクターは、「ボーンの同期」を利用するために製作された。
製作方法と下のスクリプトの詳細については、関連ページで詳細を確認することができます。


今スクリプトを作成して装置がロボットアームに取り付けされるように作られてみましょう。



上記のような簡単なスクリプトを介して共通のボーンの二つのキャラクターが同期されるようにすることができます。




作成したスクリプトをUnityで適用してみましょう。
(1) 「RobotGroup」という新しいGameObjectを作成し、ロボットのキャラクターを子として登録されます。スクリプトを追加するGameObjectも生成します。
(2) スクリプトのメンバーまで割り当てて完成します。




ゲームを実行させてAキーを押すと、装置がロボットにくっついて動くのを見ることができます。
しかし、装置のメッシュがレンダリングされる順序が非常に奇妙に見えます。


スクリプトを修正して、レンダリングの順序を指定してみましょう。





修正されたスクリプトに基づいて、レンダリング順序が変わるように設定を変えてみましょう。
(1) メインキャラクターであるロボットキャラクターを選択します。(機器のキャラクターがありません。)
(2) 「Sorting Order Option」を「Detph To Order」に変更し、「Order Per Depth」を適当に大きな「10」に設定します。




(1) 親GameObjectを選択します。
(2) 「Sorting Group」コンポーネントを追加します。




ゲームを実行して、装置をロボットに装着すると、メッシュが正常に表示されるのを見ることができます。




しかし、完全に問題が解決されたわけではない。
このロボットは、「Extra設定」によって腕メッシュが体の後ろでレンダリングされることもあるからです。
ロボットアームが後ろからレンダリングされた時も装備メッシュは体の前でレンダリングがされていることを見ることができます。
(装置を取り付けるのタイミングによりましてはその逆になります。)


以前は、「付着したときに、メッシュのSorting Orderを指定」したが、この問題を解決するには、「リアルタイムでメッシュのSorting Orderを更新」する必要があります。
スクリプトをより修正してみましょう。



変更されたスクリプトの核心は、「基準となる腕メッシュの「Sorting Order」の値が変わったのか」を継続的にチェックすることです。
AnyPortraitキャラクターは「LateUpdate()」で更新されるため、ここでも「LateUpdate()」で「Sorting Order」をチェックする必要があります。
特に、前のフレームの「Sorting Order」を別の変数(prevSortingOrder)に保存して比較するための構文を注意深く見てください!




「LateUpdate()」で「Sorting Order」値を検査するように作成したが、それでもそのコードがAnyPortraitキャラクターのアップデートより先に呼び出すことができます。
この場合には、通常、「現在のSorting Order」を確認することが困難である。
このスクリプトは、AnyPortraitより後で動作するようにする必要があります。
(似たような問題に対して、関連ページで扱っています。)
(1) Unityの「Project Settings」を開き、「Script Execution Order」を選択します。
(2) 作成したスクリプトをドラッグして、スクリプトのリストに追加した後、「Default Time」より下に位置します。




ゲームを実行すると、ロボットの腕の動き、レンダリングの順序に合わせて装置が動いて表示されるのを見ることができます。