[実験室・備忘録]【UnityでNovelゲームのスケルトンみたいなものを作ってみたい】[5夜目]

 空のゲームオブジェクトはリネームして「Hiyori」とします。起動と同時に画面上にひよりが配置されてしまうのは止めたいので、代わりにシナリオデータに新たにLive2Dの「ひより」データを呼び出すコマンドとそのコマンドを処理する部分を考えて記述します。

▼コマンドは「&hiyori」としました。
 &hiyori
▼「TextManager.cs」の Command(); のswitch文に &hiyori の場合を追加して、InitModel();を実行させました。

[追加文]

[1]宣言部

InitModel _hiyoriManager;

[2]Start関数

_hiyoriManager = GameObject.Find("Hiyori").GetComponent<InitModel>();

[3]Command関数

case "&hiyori":
    _hiyoriManager.LoadModel();
    break;

※InitModel.cs の起動時に実行される関数 Start(); は削除し、参考サイトにあった public void LoadModel(); を新たに作ってそこにStart(); の内容を移動しておきます。これでシナリオデータの進行に伴い、「ひより」が画面上にでてくるはず?
 出てきましたね。超ちっちゃいけど…。

 「小っちゃかったり」「腕が4本出てたり」「アニメしてない」を解決していきます。尚、「テキストボックスの前に出てきてしまう」は後回しにします。

 色々探して見つけてきたのが、(参考サイト) [Live2DモデルのUnityスクリプト内での動的生成と着替え実装]
Live2DモデルのUnityスクリプト内での動的生成と着替え実装
Live2Dモデルの着替えを実装する為に、一般的な「Live2DモデルをUnityに読み込み、SDKがプレハブを作成→プレハブをシーンに配置」という手順を踏まずに、「Live2DモデルをUnityプロジェクトに配置→実行時にスクリプトでシー
[リップシンク、自動まばたきの為の初期化処理]の節にある LoadModel(); から必要になりそうな項目を追加しています。

 最初に表示が小さいのだけはどうにかしたいので、

[追加文A]

var model = model3Json.ToModel();

で、モデルが取得できたら後ろに

    var _hiyoriTransform = model.gameObject.transform;  // 仮の汎用変数に格納
    _hiyoriTransform.position = new Vector3(0, 0, 0); // 初期位置を改めて指定
    _hiyoriTransform.localScale = new Vector3(8f, 8f, 1f);

を追加して表示位置と大きさを調整します。

 大きくなりました。腕が四本v(゚ω゚)v。気にはなります。が、その前にモーションをどうにかしたい。アニメのモーションは、「Project」ビューの hiyori_test/motion フォルダに入っています。アニメーターコントローラーは一階層上にあるのですが、中身は空っぽなのでこれとは別に各モーションのアニメーションクリップが入っているmotionフォルダ内に、新規に「hiyori」という名前のアニメーターコントローラーを作ります。

 何もモーションが登録されていないので、登録していきます。下のアニメーションクリップのアイコンを10個ビューの中にドロップして登録します。

デフォルトではモーション(hiyori_m01)が再生されるようになってます。

 続けて、スクリプトからモーションを呼び出すように指定します。

[追加文B]

// 追加ライブラリ
using UnityEditor.Animations;
using UnityEditor;

Animator animator;  // アニメーター   LoadModel()の前で宣言

animator = model.GetComponent<Animator>();  // アニメーションコントローラーの取得
string aniCon_path = "Assets/hiyori_test/motion/hiyori.controller";
// RuntimeAnimatorControllerとしてAssetを読み込む[using UnityEditor; が必要に]
RuntimeAnimatorController runController = (RuntimeAnimatorController)AssetDatabase.LoadAssetAtPath(aniCon_path, typeof(RuntimeAnimatorController));
// AnimationControllerにControllerを追加
animator.runtimeAnimatorController = runController;

// モーションテスト用 hiyori_m06とhiyori_m08 をテストする場合は、上のmodel.Part[12]の透明度を0にする。他は13番を0。
//animator.Play("hiyori_m06");    // using UnityEditor.Animations が必要に

モーションが有効になっていればOK。…動き出しましたね。腕がまだアレですけど。他のモーションも効くかコメントアウトしているところを変えて確認できます。

 モーションの切り替えに関しては、テストが終わったらまたコメントアウトし、シナリオからのコマンドでモーション切り替えをするように処理を追加すればいい感じなのでいいとしましょ(今回は作りませんでした)。

 腕が四本出てる問題を解決します。

 これは、検索してもなかなかこれだというのが出てこなくてかなり苦戦したのを記憶しています。ヒントとなりそうなのがこんなQ&A [unity 上でパーツの透明度の設定]
unity 上でパーツの透明度の設定
unity上でパーツの透明度を設定したいのですが、cubism parts inspectorのパラメー…
と、Q&A [モデルのパラメータ更新について]
モデルのパラメータ更新について | Live2D Manuals & Tutorials
でした。結果からいうと先の透明度の方の設定をいじれば余計な腕は非表示にできたので、ここでは以下の[追加文C]を大きく表示する前に非表示にしたいので、[追加文A]の前あたりに追加します。

[追加文C]

var part = model.Parts[13];
part.Opacity = 0;

 モデルをロードして最初に再生されるモーション01に対して、いらない腕を非表示にしているので、シナリオからモーションを色々切り替えたい場合は、この[追加文C]の処理は都度
モーション切り替えのタイミングで指定することになると思います。

腕がやっとまともに。あと好きなモーションだせるようになった。

 次回は、最後に残った「ひより」がテキストボックスの前にでている問題を解決します。

コメント

タイトルとURLをコピーしました