【Unity】マテリアルに複数のテクスチャを重ねて表示する

ひとつのメッシュデータに複数のテクスチャを重ねて表示する方法を紹介していきます。
まず、方法は2つあります。
・Shaderを改造し、テクスチャを二枚入れると重ねて表示されるようにする。
・マテリアルを2つ用意し、マテリアルを2つ重ねる。
今回はマテリアルを2つ使用する方法を紹介します。

マテリアルを重ねる方法

やり方は単純で、InspecterからRendererのマテリアルの配列要素数を増やし、マテリアルを紐づけます。

また、重ねるマテリアルはしっかり透過部分のあるものを選択しましょう。
StandardShaderを使用する場合はRenderingModeをCutoutにし、pngファイル等の透明度のあるテクスチャをalbedoにセットしてください。

これで重ねて表示できます。

しかーし!モデルのサブメッシュが複数に別れている場合、これではうまくいかない可能性が高いです。
解決策について、サブメッシュって何よってとこから説明していきます。

モデルデータの構造

学んだわけじゃないけど多分こんな感じ

FBXファイルを読み込むとメッシュ単位でオブジェクトが生成される。
そして、そのメッシュ内のサブメッシュ毎にマテリアルが生成される。
Blenderでいうとオブジェクト毎にメッシュ、マテリアルの配色分け毎にサブメッシュといった感じだ。
問題は、Unity内でメッシュの描画を行うRendererがメッシュ毎に使用することにある。

最初に紹介したように、RendererのMaterialsの要素数を増やすことで、サブメッシュの数以上のマテリアルを重ねることができる。
しかし、ここで厄介なのがメッシュ内で保持しているサブメッシュの内、一要素目のサブメッシュにしかマテリアルが重ならない。いくつマテリアルを追加で重ねても、全て一要素目に重なってしまう。
上記例の場合、肌にタトゥーや擦り傷のマテリアルを重ねて表示したくても、肌ではなく瞳のサブメッシュに重ねて表示してしまう為、不可能である。
また、メッシュ内のどのサブメッシュを一要素目にするかは、選べない。(多分頂点数の一番少ないサブメッシュが一要素目に来ている気がする。)

解決策としては、モデリングソフトで目と肌のメッシュを分けて再度FBXにエクスポートした後にインポートし直す。
もしくは、マテリアルを2つ重ねる方法を諦めて、自作シェーダー内でテクスチャを重ねて表示する他ないと思う。多分。

身体はUnityで闘争を求める。⑧。機体のカラーリングと、機体データのセーブ&ロード

機体の色変更と機体データのセーブ&ロードをできるようにしました。

今回の実装は以下がポイントでした。
・テクスチャを重ねて表示する
・データ及び表示画面の保存・読み込み
これらは長くなりそうなので別々に他記事に後日まとめようと思います。

身体はUnityで闘争を求める。⑦。アセンブル機能追加

自機をカスタマイズできるようにしました。

ScriptableObjectによるデータ管理

ゲームにおけるアイテムの情報だとか、敵の情報、等々の普遍的なデータ群はScriptableObjectで管理するのが、Unityでは一般的です。
例えば、アイテムオブジェクトに各アイテム全部の情報を配列で保持し、アイテムIDによって配列から個別の情報を取り出すようにした場合、アイテムオブジェクトを10個生成したときに、各アイテム全部の情報配列10個分がメモリを圧迫してしまいます。これを避けるために、データ群は独立したScriptableObjectにもとめて格納します。

とはいえ、素の状態でScriptableObjectのままデータ群を管理するのは、編集し辛く現実的ではないと思います。

そこでExcelからScritableObjectにデータ群を変換するプラグインを用いて。
Excel上でデータ群を管理できるようにします。

Excel⇒ScriptableObject

おなじみのテラシュールブログ様で上記プラグインが公開されています。
使い方とプラグインは下記リンクから

http://tsubakit1.hateblo.jp/entry/20131010/1381411760

背景の使用モデル

背景の使用モデルは
・自作
・商用可能なフリーモデル
・商用可能な有料モデル
を組み合わせております。

自作モデル

投光器のモデルは自作しました。
いつも通りblenderで作成し、SubstancePainterで色付けをしています。
せっかくなのでBOOTHにて無料配布しています。
https://nextnext.booth.pm/items/1309666

電球の数だけLightオブジェクトを設置したけども、明らかに高負荷である。

フリーモデル

色んなサイトから集めてまわりました。
・cdtrader
・TURBO SQUID
・Free 3D
あたりから漁りました。

この中ではBTR(装甲車)、ドラム缶、箱がフリーモデルです。

有料モデル

オイルタンクだとかクレーンはフリーでいいものがなかなか見つかりませんでした。探す時間ももったいなので、いろんなタンクモデルが入ったモデルパック等を購入しました。1モデル100円以下なので、こういうのはさっさと買っちゃったほうがいいと思いましたね。

cgtraderのarmzep様のモデルが安くて中身も豊富でよかったですね。
https://www.cgtrader.com/3d-models?author=armzep

ただし、Textureは自分で作成する必要があるのと、
3DS MAX で作られたモデルだったので、blenderにobjファイルをインポートした際に、UV展開がごっちゃになっていました。仕方なく自分で雑にUV展開しなおしました・・・
TexturもSubstancePainterですぐ作れるし、UV展開も雑でいいならすぐできるので、それを加味しても安いしたくさんモデルがあるので助かりました。

身体はUnityで闘争を求める⑥。オンラインマルチプレイの仮実装。

オンラインマルチプレイを仮実装しました。
実装にあたって、Photonを用いました。
https://www.photonengine.com/ja-JP/Photon
先に以下できたもの。

Photonの使い方等は以下のページが大変参考になりました。

https://connect.unity.com/p/pun2deshi-meruonraingemukai-fa-ru-men-sono1
こちらのページが優秀すぎて特にまとめる内容はありません。(逃げ)
使用したのは 2018年8月25日 にリリースされたPUN2(
パンツ。。。 多分Photon Unity Network 2の略かな?)です。

実装した所感としましては、オンライン実装を視野にいれるなら、早い段階で組み込むほうが良いでしょう。
プレイヤー間の通信には更新間隔や一回のデータ送信料に制限がある為、どのようなデータだけをやり取りしてオンラインマルチプレイを実現させるかを考える必要があります。この実現方法によっては、今までローカル用に組んできたロジックを大きく修正する必要が生まれてきます。
以降は今回の仮実装を糧に、マルチプレイを加味したロジックでゲーム作成していきます。

身体はUnityで闘争を求める⑤ポストプロセスの導入、販売3Dモデルの導入

ポストプロセスとは

既存のゲーム画面(レンダリングされたシーン)にエフェクトをかけて、画面全体をかっちょよくすることです。
このポストエフェクトをかけるツールに
Post Processing Stackっちゅーものがあります。 Unityの公式アセットの一つで、誰でも簡単に導入できます。
https://assetstore.unity.com/packages/essentials/post-processing-stack-83912

Post Processing Stack を導入してみる

公式アセットということもあり、機能一通りのチュートリアル動画(講演動画)があります。

この解説を参考に自信のゲームにもポストエフェクトをかけてみました。

かっこよくはなりましたが、全体的に白飛びしてしまっていますね。
Bloomを強くかけすぎているのだと思います。
また、パーティクルが総じてBloomの影響を受けています。
スラスターやマズルファイア等が勝手に光ってくれるのはありがたいのですが、煙なども光ってしまっています。幾重にも煙が重なった際などは顕著に眩しくなってしまいます。パーティクルとPost Processing Stackの関係性をもう少し調べる必要がありそうです。

販売モデルの導入

Boothにて販売している商用利用可能なモデルを購入し、ゲーム内に導入しました。ボーンの数や構造に違いがありますが、FinalIKによる逆運動学で手足の動きを制御している為、難なく導入できました。

購入したモデル↓
https://booth.pm/ja/items/1207119

やはり自分で作成するよりも、購入したほうがコスパもいいしクオリティも高い。自機のパーツバリエーションを増やすのに、ガンガン購入して導入をしていきたいと思います。


次回はオンラインマルチプレイを仮実装。