Posted at
gumiDay 18

Unityで「装備品によって見た目が変わる」を実現する(あるいはコスチューム変更)

More than 3 years have passed since last update.


はじめに

この記事は、MMORPGなどでよくある「装備品によって見た目が変わる」をUnityで実現する方法と、実現するにあたり遭遇したいくつかの注意点の共有を目的としています。


概要

方法をざっくりとまとめると以下の流れになります。


  1. Blenderで3Dモデルを作成し、体の部位ごとにメッシュとボーンをFBXで書き出す。
    部位は、頭(髪)、顔、胴体、脚の4種類に分割。

    ※注意点:ボーンだけ書き出した所、向きがおかしくてうまく結合できなかったので、顔を共通ボーンとして書きだした。Blenderならではの問題かもしれない。

  2. Unityにインポートする。
    RigはHumanoidに設定。

  3. スクリプトで各部位メッシュの頂点を共通ボーンに割り当てる。


  4. Mesh.CombineMeshesで複数のメッシュを一つのメッシュにまとめる。

  5. Materialは1つにまとめると質感が変わってしまうので今回は敢えてまとめない。

ちなみに開発環境は、以下のとおりです。

- Unity 5.2.3f1

- Blender 2.76b


サンプルプロジェクト

前述の方法を実装したサンプルプロジェクトをgithubにて公開しています。

https://github.com/kaiware007/SkinnedMeshCombiner

公開するにあたり、著作権が絡む3Dモデルなどは使えないため、Blenderで一からモデルを作り直しました(コレが一番苦労した)

仕組み自体はUnityで元々用意されているクラスを利用しているだけなので、ライセンス等はありません。


以下、詳細

実際何をやっているかはサンプルプロジェクトを見ればわかると思いますので、実現するまでの苦労した点等を書きます。


Blenderで3Dモデルを作成してエクスポート

初めて人体モデルを作ったので出来がひどいのは置いておくとして、Unityに正常にインポートできるようにするまで苦労しました。

まず、エクスポートする手順です。


  1. 書き出したい部位とアーマチュア以外を一旦削除する。

  2. 「エクスポート」→「FBX」を選択。

  3. エクスポート設定で、書き出すデータは「アーマチュア」と「メッシュ」を選択。
    human014.PNG

Blenderから書きだしたFBXのUnityへのインポート事例は色々見つかるのですが、Blenderのバージョン違いのせいでうまくいきませんでした。

よく見る事例では、アーマチュアからRigを生成しているのですが、この方法だとUnityにインポートした時に何故か末端のボーンが削除されてしまい、うまくアニメーションできません。

試しにアーマチュアのままFBXを書き出したところ、ボーンが削除される問題は発生しませんでした。

この方法が正しいのかはわかりません、もっといい方法があれば教えて頂けると幸いです。

また、1メッシュに複数のマテリアルを割り当てていると、Unityでメッシュ結合した時にどちらかのマテリアルを割り当てているポリゴンが消えてしまう問題が発生しました。

仕方がないのでマテリアルごとにメッシュを分けて、1つのFBXで書き出すようにしました。

今回作成したモデルは下記の2種類です。

野球少年 スパルタン

今回エンジニアの私が個人的にモデリングしているため、無料で使えるBlenderを使用していますが、本来ならMayaや3D Studio Maxなどのプロ用の高機能3Dモデリングソフト等を利用すれば、上記のような余計な苦労は避けられるかもしれません…。


Unityにインポート

Import SettingsのRigはHumanoidを選択します。

一部のモデルをHumanoidにした所、関節のマッピングが外れていた事がありました。

ボーン自体は残っているのでConfigureで設定し直しました。

human016.PNG


メッシュ結合


  1. 空のGameObjectを作成(以下、Root)

  2. Rootの下に、素体となるボーンのモデルを生成。

  3. Rootの下に、各部位のモデルを生成する。
    各部位のモデルは、それぞれボーンを持っているが、元々一つのモデルから書き出されているため、共通のボーン構造になっている。

  4. 各部位の頂点のボーンの参照先を、素体となるボーンに割り当て直す。
    これで、1つのボーンに複数のメッシュが紐づいたことになる。

  5. 最後に部位のメッシュを全て1つのメッシュに結合し、元々あった各部位のボーンオブジェクトを削除して完成。

human010.PNG human011.PNG

human012.PNG human013.PNG