テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

【Unity】動的にキャラクターの衣装を差し替える

f:id:tsubaki_t1:20151023231302p:plain

動的にキャラクターの衣装…というかメッシュをを差し替える方法について紹介します。

目次

キャラクターのMeshを差し替える

といってもやる事は簡単です。キャラクターという事はSkinnedMeshRendererを使用していると思うので、SkinnedMeshRendererのMeshとMaterialを差し替えてやるだけです。

var meshRenderer = GetComponent<SkinnedMeshRenderer>();
meshRenderer.sharedMesh = mesh;
meshRenderer.materials = materials;

マテリアルの登録順番による問題

ここで一つポイントなのが、materialsの順番を本来のマテリアルと一致させる事です。そうしないと、マテリアルが異なる順番で適応されてしまい、ちょっとしたホラーになります。

f:id:tsubaki_t1:20151023231816p:plain

Boneの登録順番による問題

もう一つ注意すべきことがあります。それはSkinnedMeshRenderer.bonesの登録順番です。

アニメーションするために使用するボーンとの接続は、Meshが持つ情報を元に設定する訳ですが、どういった事か稀にボーンの設定順番が異なるメッシュが存在したりします。

例えばボーンの順番にナンバーを振ってみると、下の猫のモデルボーンの順番が左と右で異なります。これをそのまま流し込んだ場合、SkindMeshRendererの描画が崩れるといった現象が発生します。

https://cloud.githubusercontent.com/assets/1644563/10414769/96db31f4-701f-11e5-8496-124ed1e1718f.png

f:id:tsubaki_t1:20151023234611g:plain

ボーンを並び替える

これを解決する手っ取り早い方法は、ボーンの順番を動的に差し替えてしまう事です。順番を差し替える事で、メッシュのボーンに対する接続が正常に行われ、モデルが破たんせずに再生することが出来ます。

 

gist.github.com

https://cloud.githubusercontent.com/assets/1644563/10414768/7d88b7e4-701f-11e5-8ddc-67fef45d6397.gif

Animator Optimizeを使用する

もう一つの方法は、AnimatorのOptimizeを使用することです。Optimizeを使用することでアニメーションの再生管理はTransformの構造ではなくAnimatorのボーン構造で行うようになり、多少順番が崩れても問題無く再生することが出来るようになります。

Optimize を設定するには、AnimatorのOptimize Transform Hierarchyを使用するかModelのImporterでOptimize Game Objectを選択します。

f:id:tsubaki_t1:20151023233355j:plain

f:id:tsubaki_t1:20151023233400j:plain

関連

tsubakit1.hateblo.jp