はじめに
こんにちは、@codaponです。
Live2DのUnityでの導入方法や実際に動かす方法をまとめた記事です。
3. Unityのパラメータによってモーションを切り替える方法
環境構築
-
Live2D Cubism SDK for Unityをダウンロードします。
https://www.live2d.com/sdk/download/unity/
Live2DにAnimationを適用して動かす
- Live2Dをプロジェクトにドラッグ&ドロップ
- Prehub(青立方体)が生成されるのでヒエラルキーにドラッグ&ドロップ
- AnimationクリップをPrehubにドラッグ&ドロップ
- 実行ボタン押して適用したアニメーションが動くことを確認してみてください。
-
Animationクリップと、Animator Controllerの意味
・Animationクリップ :1つのモーション。最小単位。
・Animator Controller :複数のモーションの関係や遷移を管理する。
Unityのパラメータによってモーションを切り替える方法
パラメータを使用することで、任意のタイミングでモーションを切り替えることができます。パラメータはBooleanやTriggerの形式で持つことができす。
- 以下の図のように新しくステートを作成し、右クリックで遷移を作成をクリックし、矢印を相互に引きましょう。
※以下の例ではmo_1がtrueの場合に矢印の先に遷移します。
- Animatorに対してSetBoolする処理をスクリプトに記載する例です。
public Animator anim;
public void SetBoolParam(string boolPamamName, bool setTrue)
{
anim.SetBool(boolPamamName, setTrue); //Boolean
}
public void SetTrigger(string triggerName)
{
anim.SetTrigger(triggerName); //Triggerも同様
}
スクリプトからLive2Dのパラメータを変化させる
必ずLateUpdateの中から動かさないとパラメータが変化しないので注意してください。
using UnityEngine;
using Live2D.Cubism.Core;
public class Live2dCustomScript : MonoBehaviour
{
private CubismModel _model;
void LateUpdate() // LateUpdate・・・様々な計算が終わった後の最終調整を書くところ
{
FindParam("ParamEyeLOpen").Value -= 20; //直接パラメータを変化させる。
}
//パラメータ名をCubismParameterに変換する
public CubismParameter FindParam(string paramId)
{
CubismParameter[] cp = _model.Parameters;
foreach (CubismParameter cubismParameter in cp){
if (paramId == cubismParameter.Id){
return cubismParameter;
}
}
throw new System.Exception("指定されたIDを持つParametaterがありません。" + "ID:" + paramId);
}
}
参考資料
【Unity+Live2D】UnityからLive2Dモデルを触るときの個人的メモ
Live2Dのスピードを変化させる
public Animator anim;
public slider;
public void SpeedChange()
{
anim.speed = slider.value / 10f; //総数10のsliderを使う場合
}
アニメーションのフレーム位置にSEなどの音を付ける
-
アニメーションタブを開く。(アニメーションタブはCtrl + 6でも開けます)
-
実行したいスクリプトを、Live2DのPrehubオブジェクトにAddComponentします。
-
インスペクターのFunctionの中から、実行したいスクリプトを選択してください。
スクリプトの例。以下のように配列でAudioClipを整理すると管理しやすいと思います。
手順としては以下の流れです。
- SoundFlame.csを作成し、Live2DにAddcomponentする
- インスペクターのFunctionでrunSeMethod1を選択する。
-
SoundSeManager.csを作成し、別のオブジェクトに付けておく。
これを応用すれば任意のスクリプトを実行することも可能となります。
using UnityEngine;
public class SoundFlame : MonoBehaviour
{
public AudioClip[] soundSe1;
public SoundSeManager
private void runSeMethod1(int no)
{
soundSeManager.Call(soundSe1[no]);//SoundSeManagerを呼ぶ
}
}
using UnityEngine;
public class SoundSeManager : MonoBehaviour
{
private AudioSource audioSource;
void Awake()
{
audioSource = GetComponent<AudioSource>();
}
public void Call(AudioClip audioClip)
{
audioSource.PlayOneShot(audioClip);
}
}
終わりに
最後まで読んでいただきありがとうございました。読者の皆様がこの記事から何かしらのヒントや情報を得てくださり、少しでもお役に立てたなら幸いです。
今まで他の記事みてクソ長コード貼り付けられてたら不親切だなあと思ってたんですが、同じことを自分もやりかけてるというな。これは非常によくないことです。
参考資料
【もう悩まない】初心者が押さえたいブログの書き方の基本18個
Unity初心者がUnityでLive2Dモデルを動かすため環境構築をした
Unityゲーム開発記・アドバイスお願いします ~ゲームをリスタートできるようにする1~
追記予定