【制作】マップパーツモデルのテクスチャを動的に張り替え

冒頭の画像の左右のブロックは、メッシュを共有(同じプレハブから生成)しているけれども、テクスチャはマップ生成時に張り替えてある。

いちおう、ディフューズマップとバンプマップが指定されている。

こうすることで、少ないリソースでダンジョンのバリエーションを出す仕組みだ。

技術的には難しいことはやっていないんだけれども、いくつか注意が必要な部分があって、以下記録しておく。

Unityでは全てのリソースをアセットとして管理しているため、Unityのアセットに含まれるリソースを使用する方法と、ダウンロードした外部のコンテンツをリソースとして使用する方法が異なるという点だ。

プロ版を使用しているのであれば、ダウンロードコンテンツごとアセットとして作成してしまえば、おそらく通常通りリソースにアクセス可能なんだと思う。

しかし、こちとら、無償版である。つまりパッケージとは別のアセットをDLCとして作ることができない。

たとえば、テクスチャ。アセット内にあるテクスチャはUnity上ではTexture2Dということになっている。

しかし、無償版でダウンロードコンテンツに含められるのは、生のPNGやJPG画像だ。

そこで、画像をバイナリで読込んでTexture2Dを自力で生成してやらなければならない。

ネットでいろいろ調べたところ、下記の要領でやれば自力でTexture2Dを生成できることがわかった。

//あらかじめローカルにダウンロード・展開した画像ファイルのパス
string path = Applcation.PersistentDataPath + "/" + "hoge.png";
byte[] bytes = File.ReadAllBytes(path);
Texture2D texture = new Texture2D(width, height);
//生のデータを読込む
texture.LoadImage(bytes);

もう一点苦労したのが、プレハブから生成したマップパーツに対するテクスチャの張替えだ。

ダンジョンはプレハブのマップパーツから複製したオブジェクトで生成されている。

このとき、プレハブのテクスチャを張り替えると、以降、そのプレハブから作るオブジェクト全てにテクスチャが適用されてしまう。

やりたいのはマップツールで指定した箇所のオブジェクトのテクスチャにだけ適用することだ。

じゃあ、プレハブからインスタンス化した後のオブジェクトにたいしてテクスチャを張り替えればいいかというと、それはそれで、マテリアルの複製がたくさんできてしまうのでドローコールが極端に増えてしまう。

結論から言うと、この対処法としては、コード上で張り替えたいマテリアルをインスタンス化して保持しておき、同じテクスチャをもつオブジェクトには同じマテリアルを適用することで、ドローコールを抑えることができた。

上記のコードで作成したテクスチャからマテリアルを生成するコードは以下となる。

//組み込みシェーダ「Mobile/Bumped Diffuse」のマテリアルを生成する。
Material material = new Material(Shader.Find("Mobile/Bumped Diffuse"));
material.name = texName;
material.SetColor("_Color", Color.white);
//ディフューズマップを設定
material.SetTexture("_MainTex", mainTex);
//バンプマップを設定
material.SetTexture("_BumpMap", bumpMap);

上記マテリアルを保持しておいて、同じテクスチャが指定されたパーツのマテリアルに指定してやればよいわけである。

4年前

コメントを残す

メールアドレスが公開されることはありません。