パワードコアラ 2023/06/21 20:14

【ゲーム制作記録】Unityで動的にLive2Dモデルのテクスチャを入れ替える

こんばんは!

この記事は制作過程で悩んだ記録を残しておこうという内容です。
ゲーム制作の進捗報告はひとつ前の記事で行っています。
そちらもよろしくお願いします!

(個人用メモに近いので少し砕けた書き方をしています。)
今回はゲーム中にLive2Dモデルのテクスチャを色違いのものに切り替えたいという問題について悩んだ記録。

お尻の色を変えたい。

結論

結論としてはアートメッシュがそれぞれ個別でMainTextureの設定を持っていたので、
切り替えたいパーツ(ArtMesh)単位でテクスチャの設定を切り替えていく方法で実現することができた。
(詳細は本記事最後の方に記載)

以下は実装までの記録

公式マニュアルを読んでみる

Live2Dが用意してくれているマニュアルに、「ランタイムにモデルを読み込む」という内容のページがあった。
[Live2D公式マニュアル](https://docs.live2d.com/cubism-sdk-tutorials/initializemodel/)

動的にモデルを読み込むことができればテクスチャの設定を切り替えることも同時に実現できそうだが、マニュアルの方法だとその都度シーンにモデルを新しく生成するようだ。
これだとコンポーネントなどの設定がされていない素の(?)状態なので再度スクリプト上で必要な設定をモデルに対して組み込んでいく必要があるように感じた。(深く確かめていないので確かではない)

また、
既存の方法:Live2DモデルをUnityにインポートすると自動で生成してくれるプレハブをシーンに置いて使う
(フォルダ構成は割と自由)

ランタイムモデル読み込み:「StreamingAssets」というフォルダにLive2Dモデルを格納し、特定のタイミングでそのパスを渡してモデルを新たに生成する

と結構流れが違ってくる。
ある程度全体像が出来上がっている今から変更するとなると少し怖いなと思ったので、別の方法を探すことにした。

.setTexture

マニュアルによれば、以前のバージョンでは.setTextureというメソッドがあり、それでモデルのテクスチャ設定を行っていたようだ。
最近のバージョンだとこの機能が前述のランタイムモデル読み込み方式に変更されている。

ピンポイントでテクスチャの設定ができそうだったので.setTexture使いたかった・・・。

アートメッシュそれぞれがテクスチャの設定を持っていた

半ば放心状態でインスペクターを眺めていると、Drawable(アートメッシュ)にMainTextureという項目を見つけた。

あるアートメッシュのインスペクター

model3.json(モデル設定ファイル)にテクスチャの項目があったのもあり、今までモデル全体を通して共通のテクスチャ設定を使っていると思い込んでいたので衝撃を受けた。
個別で設定持ってるならなんだかいけそう。

実際に行った実装方法

アートメッシュ単位でテクスチャ設定を切り替える方法をとることにした。

流れはこんな感じ

using UnityEngine;
using Live2D.Cubism.Rendering;

public CubismRenderer artMesh;
public Texture2D mainTexture;

//どこかから呼ぶ
private void SetTexture()
{
	artMesh.MainTexture = mainTexture;
}

CubismRenderer型でアートメッシュ、Texture2D型でメインテクスチャを宣言する。
アートメッシュのMainTextureにメインテクスチャを代入すればテクスチャを切り替えることができた。

この方法だと、こんな感じで一部分のみ切り替えたりできる。 すごく気持ち悪い。

欠点としては、色を変えたいアートメッシュの数だけ変数宣言・代入を行うので
大幅な色切替の場合はすごい数の変数操作が必要になること。

別の実装方法案

  • 案1:そもそもmodel3.jsonのテクスチャ参照先をスクリプトで書き換えれば解決なのでは・・・?(未確認)
    - なぜ思いつかなかったのか

  • 案2:同じメッシュの形で同じデフォーマに格納されていれば同じ動きになるはずなので、Live2Dモデルの時点で色違いアートメッシュを作っておき、それらの表示を適宜切り替える(だいぶ力技)
    - Activeを切り替える or Opacity(透明度)を変更する

月別アーカイブ

限定特典から探す

記事を検索