動的にキャラクターの衣装…というかメッシュをを差し替える方法について紹介します。
Unityで動的な衣装切り替え pic.twitter.com/b2BfLsxUCt
— 椿 (@tsubaki_t1) 2015, 10月 23
目次
キャラクターのMeshを差し替える
といってもやる事は簡単です。キャラクターという事はSkinnedMeshRendererを使用していると思うので、SkinnedMeshRendererのMeshとMaterialを差し替えてやるだけです。
var meshRenderer = GetComponent<SkinnedMeshRenderer>();
meshRenderer.sharedMesh = mesh;
meshRenderer.materials = materials;
マテリアルの登録順番による問題
ここで一つポイントなのが、materialsの順番を本来のマテリアルと一致させる事です。そうしないと、マテリアルが異なる順番で適応されてしまい、ちょっとしたホラーになります。
Boneの登録順番による問題
もう一つ注意すべきことがあります。それはSkinnedMeshRenderer.bonesの登録順番です。
アニメーションするために使用するボーンとの接続は、Meshが持つ情報を元に設定する訳ですが、どういった事か稀にボーンの設定順番が異なるメッシュが存在したりします。
例えばボーンの順番にナンバーを振ってみると、下の猫のモデルボーンの順番が左と右で異なります。これをそのまま流し込んだ場合、SkindMeshRendererの描画が崩れるといった現象が発生します。
ボーンを並び替える
これを解決する手っ取り早い方法は、ボーンの順番を動的に差し替えてしまう事です。順番を差し替える事で、メッシュのボーンに対する接続が正常に行われ、モデルが破たんせずに再生することが出来ます。
Animator Optimizeを使用する
もう一つの方法は、AnimatorのOptimizeを使用することです。Optimizeを使用することでアニメーションの再生管理はTransformの構造ではなくAnimatorのボーン構造で行うようになり、多少順番が崩れても問題無く再生することが出来るようになります。
Optimize を設定するには、AnimatorのOptimize Transform Hierarchyを使用するかModelのImporterでOptimize Game Objectを選択します。