見出し画像

3Dモデルでノベルゲーム制作(Unity+Naninovel)

3DモデルキャラをUnity-Naninovel上で動かしてみた。その備忘録。

環境 Win10 + Unity 2020.3.11f1(64-bit) +Naninovel v1.15

試しにSDこはくちゃんズ・小碓学園夏&冬制服モデル等のUnity3Dモデルアセットを使用して動かしてみる。アセットへのリンクはページ下部より。

1, 3Dキャラテンプレート作成

Naninovel->Create->Character->Generic
で3Dモデルキャラ対応のテンプレートプレハブが作成される。(例としてsample1という名前で作成)
基本的にはNaninovelのGeneric Character Behaviourスクリプトがアタッチされているだけのもの。そのプレハブを編集して子オブジェクトに3Dキャラをもってくる。

画像1


DefaultのサイズはTransformのScaleを調整、Y軸で高さ範囲を調整


2, Generic Character Behaviourコンポーネント編集

メンバ変数 On Appearance Changed (String)の設定
子オブジェクトのAnimatorコンポーネントを指定。
Animator.SetTriggerを設定

メンバ変数 On Visibility Changed (Boolean)設定
子オブジェクト(プレハブ自体)を指定。
GameObject.SetActiveを設定。

画像2

これでOK


3, Animatorのコントローラー登録

ParametersからTrigger型の変数(任意)を追加してAnyStateからTransition矢印設定にそれぞれのParametersを割り当てる(※今回はDefault=Pose1)

画像3

4, Naninovel ConfigurationにCharactar登録

Naninovel.GenericCharactarを選択して1~3で編集したプレハブsample1を登録する。

画像4

3~4の設定は前回のLive2Dキャラ動かすのと同様なので、
詳しくは下記記事参照

以上の設定でNaninovelのスクリプト.naniから

@char sample1
#これでDefaultに登録したポーズ(アニメーション)で呼び出し

@char sample1.Pose2
#これでPose2に登録したポーズ(アニメーション)で呼び出し


キャラ表示、非表示をMeshレンダラーで行うケース

Naninovelのマニュアルに

Unityの Animator コンポーネントは、ゲームオブジェクトが同じフレームで有効化/無効化されると、 SetTrigger の登録に失敗する可能性があります。代わりにレンダラーで子オブジェクトを有効/無効にすることを検討してください。

と書いてある。(たしかに、ゲーム開始の一番最初にキャラを登場させた時、Defaultで登録したPoseにならない)

なのでOn Visibility Changed (Boolean)の変数に、
子オブジェクトの中でMeshレンダラーをもつオブジェクトに対して
SkinnedMeshRenderer.enabledを設定。
※メッシュレンダラーは子オブジェクトに複数あるのですべて追加する。

画像5


とりあえずこれでDefaultで登録したPoseになった。
実際に動かしてみるとこんな感じになる。

Naninovelのgeneric charactersはハイライトなどの機能は自動で動作はしないらしい。
このあたりはOn Started Speaking ()やOn Finished Speaking ()を工夫する必要がありそう。

応用技として、パーティクルシステムをGenericキャラ登録すればこんなこともできる。

追記1

上の動画のような制御をどう実現するかの例

アニメーションイベントからオブジェクト制御用の関数を呼び出して強引に切り替える手法。(もっとよい方法はあるかと思われる)
例えば3つのパーティクルのオブジェクトを切り替えたいときは以下のような感じ。

ここの例ではAnim01にトリガーされるとobj_chg1が呼び出される。他もすべて登録すると以下のようなスクリプトになる。これをNaniGenericにアタッチしておく。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class chgobj : MonoBehaviour
{
    GameObject child_1;
    GameObject child_2;
    GameObject child_3;
    
    void Start()
    {
    child_1 = this.transform.Find("FrostFlame").gameObject;//子オブジェクトの名前から子オブジェクトを取得
    child_2 = this.transform.Find("ArcaneOrbitSphere").gameObject;
    child_3 = this.transform.Find("ShadowSpray").gameObject;
    }

    public void obj_chg1()
    {
        child_1.SetActive(false);//子オブジェクトをすべて非アクティブにする
        child_2.SetActive(false);
        child_3.SetActive(false);
        
        child_1.SetActive(true);//所望のオブジェクトをアクティブにする
    }
    
    public void obj_chg2()
    {
        child_1.SetActive(false);
        child_2.SetActive(false);
        child_3.SetActive(false);
        
        child_2.SetActive(true);
    }
    
     public void obj_chg3()
    {
        child_1.SetActive(false);
        child_2.SetActive(false);
        child_3.SetActive(false);
        
        child_3.SetActive(true);
    }
}
//オブジェクトの数等も取得したほうが美しく書けるけどとりあえずこれでヨシ

これでオブジェクトの表示/非表示をアニメーションコントローラーから制御することができる。Naninovelスクリプト上では

@char NaniGeneric.flame
@char NaniGeneric.orbit
@char NaniGeneric.spray

というようなコマンドで、それぞれのパーティクルが表示できるようになる。※アニメーションイベントの詳細は公式のマニュアルを参照
https://docs.unity3d.com/ja/2018.4/Manual/animeditor-AnimationEvents.html

Naninovelとは?

NaninovelはUnityゲームエンジン上で動くアセット。
ビジュアルノベルゲーム開発を簡単に実現可能。

Naninovelマニュアル(generic charactersについて)
https://naninovel.com/guide/characters.html#generic-characters

3Dモデル使用アセット


この記事が気に入ったらサポートをしてみませんか?