NurseryDimension製作記 202007B 2/3 (Pixiv Fanbox)
Content
本題の前に、まずはUnityを知らない人向けに今回出てくる単語について軽く触れておきます。
・Scene
UnityはGameObject(後述)を任意の座標に配置したり、任意のGameObjectにコンポーネント(後述)をアタッチすることでオブジェクトを描写したりしています。
例えば、タイトル画面は背景、選択肢、選択肢を選んだときの挙動などで構成されていて、その構成をすぐに呼び出せるようひとつのファイルとして保存しています。
そのファイルのことをScene(シーン)と呼んでいます。
UnityではこのSceneを複数用意し、切り替えることで画面の遷移を実現させています。
・GameObjectとコンポーネント
キャラクター、アイテム、カメラなどUnityでゲームを構成しているオブジェクトのことをGameObjectと呼んでいます。
Unityのマニュアル内にも「ゲームオブジェクトは空の料理鍋、コンポーネントはゲームのレシピに含まれる様々な材料と考えるとよい」とありますがその通りで、
GameObjectは言ってしまえば空の入れ物で、そこにコンポーネントと呼ばれるプログラミングで作った情報を付与することでキャラクターになったり、アイテムになったりします。
・Prefab(プレハブ)
Prefabとは1つのゲームオブジェクトをそのすべてのコンポーネント、子ゲームオブジェクトとまとめて、再利用可能なアセット(素材)として作成、設定、保存したもののことです。
この機能を使うことで例えば、アイテムをプレハブ化しておき特定の敵を倒した時にドロップ(シーン内にないものを出現)させるいったような処理が簡単に作ることができます。
・Animator(Mecanim)
AnimatorとはUnityに搭載されているアニメーションを制御するためのシステム(コンポーネント)です。
攻撃モーションの後は待機モーションに移行する、などといったアニメーションの遷移を視覚的に設定できるシステムで、Live2Dモデルの制御もこのシステムを使用します。
◇前置き:UnityとLive2Dの話
それでは本題に参りましょう。
まず、Live2Dは公式で配布されているSDKを使用することでUnityに取り入れることができます。
Unityに取り入れたLive2Dモデル(.model3)は自動でPrefab化し、すぐにSceneに配置できる状態になります。
ただし、この段階ではまだアニメーションの設定ができていないのでAnimatorにLive2Dのエディタで作った.motion3.jsonファイルを配置しなければいけません。
Animatorの設定が済んだらあとはSceneに配置すればちゃんとアニメーションもしてくれますし、Animatorの遷移条件が満たされればちゃんと遷移もしてくれます。
とまぁ、ここまではLive2Dモデルを普通に実装して、普通に使う場合の話ですね。
うちのように「Live2DのパラメータをAnimatorを介さず直接スクリプトで制御したい」という場合はさらにひと手間加える必要があります。
本作でこの一手間がどこに活きているかというと、胸/腹サイズや服装・液体差分ですね。
というわけで前置きがかなり長くなりましたが、今回は胸/腹サイズをどう制御しているかということをお話したいと思います。
◇胸/腹サイズの制御
Unityで作業をする前にLive2Dのアニメーションを作る際に気をつけないといけないことがあります。
それが、「スクリプトで制御したいパラメータにはキーフレームを打たない」ということです。
具体的には
この画像のように胸/腹サイズに関するパラメータにキーフレームを打たず、モーションデータを書き出す際に
この画像のようにキーがある場合のみを書き出しの対象にします。
そうするとAnimatorでアニメーションが切り替わってもキーフレームを打たなかったパラメータの値が変更されないようになります。
Unityの方の設定は例えば
というようにインポートしたLive2Dモデルのプレハブに自作のコンポーネントをアタッチすれば問題なく動作します。
コンポーネントの書き方は例えば
using UnityEngine;
using Live2D.Cubism.Core;
public class L2DstatusSync : MonoBehaviour
{
private CubismModel cubismModel;
private CubismParameter paramBreastSize;
public float breastSize; //胸サイズ用の変数
void Start()
{
cubismModel = GetComponent();
//Param…は該当するパラメータのID、今回の場合はParam_BreastSizeというパラメータ
paramBreastSize = cubismModel.Parameters.FindById("Param_BreastSize");
}
void Update()
{
if (paramBreastSize.Value != breastSize)
{
//パラメータの値を用意した変数に同期
paramBreastSize.Value = breastSize;
}
}
}
と、このように記述すると用意した変数の値とLive2Dモデルのパラメータの値を同期させることができます。
長々と書いていますが端的に言えば、CubismParameterのValueを変更する、これだけでスクリプトからパラメータの値を操作することができる、ということですね。
上記のものは説明のため簡略化していますが、これを応用すると服装などの差分を簡単に切り替えることができます。