Unity の AssetStoreで購入したアセットを使用していましたが、思うような性能が得られないため高速化を検討しました。 そこで実施したのは「購入したモデルを編集してテクスチャやマテリアルを一種類にまとめ、DrawCallを減らす」という方法です。今回はその方法について紹介したいと思います。
注意点として、この方法を使用できるのはUnityPro版を使用していて、モデルが動かないオブジェクト、かつモデルのマテリアルを同じにする場合のみ有効です。
MayaLTの体験版をインストール
MayaやMayaLTを持っていない方は、以下のサイトから体験版をインストールしてください。
http://www.autodesk.co.jp/products/maya-lt/free-trial
15日間は体験版が使用可能です。
MayaLTを起動
作業単位の変更
起動したら、メニューバーの「ウィンドウ」>「設定/プリファレンス」>「プリファレンス」を選択。 「カテゴリ」から「設定」を選択し、「作業単位」の「リニア」を「メートル」に変更する。
レイアウトの変更
この設定は私がやりやすいと思ったレイアウトの変更になります。 別に設定しなくても構いません。
一番左側の中央付近に4つほど並んでいる「パネルレイアウト」の部分を右クリックし「4ビュー」を選択
「4ビュー」を選択すると下図赤線で囲った部分のアイコンが4つに分割されます。
左上の部分をクリックして「パースビュー」、右上の部分をクリックして「UV テクスチャエディタ」、左下の部分をクリックして「アウトライナ」、右下の部分をクリックして「ハイパーシェード」を選択します。
テクスチャをまとめる
画像編集ソフトを使用して使っているテクスチャをこんな感じでひとつのテクスチャにまとめます。
モデル編集
MayaLTに戻って、メニューバーの「ファイル」>「読み込み」を選択して使用している3Dモデルを読み込みます。
左下の「アウトライナ」レイアウトで上図のように読み込んだ3Dモデルを選択した状態で、右下の「ハイパーシェード」レイアウトにおいて、メニューバーの「グラフ」>「選択したオブジェクトにマテリアルをグラフ化」を選択します。
「作業領域」に表示されたピンク色の部分を左クリックすると、MayaLTの右側の「アトリビュートエディタ」というところに画像を入力する項目があると思うので、先ほど作成したテクスチャの画像ファイルパスを選択します(下図の赤線で囲っている部分)
左上の「パースビュー」レイアウトでメニューバーの「シェーディング」>「ハードウェアテクスチャリング」を選択します。 すると、テクスチャが適用されたモデルが表示されるかと思います。
この状態だとUV値がおかしいのでUV値を修正していきます。
下図のように右下の「ハイパーシェード」レイアウトの作業領域に表示されている緑色の部分を右クリック長押ししていると、下図のようにメニューが表示されるので右クリックしたまま「マテリアルからオブジェクトを選択」までマウスを移動させます。
そのまま右上の「UVテクスチャエディタ」上で右クリック長押しすると下図のようにメニューが表示されます。 右クリックしたまま「選択」>「選択項目をUVに変換」を選択します。
続いてMayaLTの左中央付近にある、下図の赤線で囲ったアイコンを左クリックします。
この状態でUV値のスケール処理が可能です。 テクスチャをまとめていますのでUV値は縮小して移動しなければならないはずです。
現状ではUV値の拡大、縮小はUVの中心座標を元に行われるのでこれだと移動を行うのが面倒な場合があります。 なので拡大、縮小の中心位置をUV座標の原点中心になるようにします。
右上の「UVテクスチャエディタ」レイアウト上で「home」ボタン(Windowsだと「Insert」ボタンだったような?)を押下します。
すると下図のように中心となる位置が移動できるようになります(この中心となる位置はスナップポイントと呼ばれるっぽい)
スナップポイントの黄色い部分を左クリックしてドラッグすると位置が移動できます。 この状態で原点まで移動させます。(うまく原点まで持っていく方法があるかもしれませんがとりあえずは手動で位置を合わせます…) (ちなみにUVテクスチャエディタ上ではマウスのホイールをスクロールすると拡大縮小、altキー+ドラッグで視点の移動ができるので、これでスナップポイントを原点に合わせます)
スナップポイントを原点まで移動したら、再度「home」ボタンを押下します。 で、テクスチャのサイズに合わせて拡大縮小を行います。 画像の例だと、縦は等倍ですが、横は0.5倍となるように調整します。
上図のように、MayaLTの画面上側にある入力フォームで、Xに0.5、Yに1と入力してEnterボタンを押下します。
すると、UV値が適切になるように変換されました。
UV値の移動を行いたい場合は下図の「移動ツール」アイコンをクリックすると、UV値の移動が可能になります。
この状態で拡大、縮小と同じようにMayaLTの画面上部にあるX、Yの入力フォームに移動値を入力して移動してもよいですし、下図の画像のように矢印(赤や緑色の矢印)をドラッグして移動させて調整して移動しても構いません。 UV値が適切な位置に来るように調整してみてください。
UV値の設定が完了したら、モデルをUnity側へ送ります。 左下の「アウトライナ」レイアウトで読み込んだモデルを選択した状態で、メニューバーの「ファイル」>「Unityに送信」>「選択範囲」を選択します。 送信先となるファイルパスを設定して「選択項目の書き出し」ボタンを押すと、Unityのプロジェクトにモデルが保存されます。
Unity側の設定
Unityのプロジェクト側には3Dモデルが保存されていると思いますので、まとめたテクスチャもプロジェクトにツッコんでください。
新しく作成されたモデルを選択して、モデルの設定の変更が必要な場合は変更を行います。 下図ではScale Factorを1に設定し、Generate Lightmap UVsにチェックを入れています。
また、マテリアルのテクスチャの設定も行います。 下図のようにマテリアルのテクスチャには、まとめたテクスチャが参照されるように設定してください。
実行結果
・モデル変更前DrawCallの数が3から1に減りました。
注意点
前提条件として冒頭でも述べましたが、動かないオブジェクトが前提となっています。 UnityPro版ではStaticなオブジェクトをまとめて一つのメッシュに結合してくれる機能があるため、Free版ではおそらくこの作業を行ってもDrawCallは減らないかと思います。
また結果画像を見ていただくと、電話ボックスのマテリアルを変更してしまったため、見栄えが変わってしまっています。 まとめたオブジェクトのマテリアルが1種類となってしまうため、まとめるオブジェクトの見栄え等も考慮しなければなりません。