[Unity+Live2D]UnityRawInputの設定

Live2Dで作成したモデルをUnityで動かすCubism SDK for Unityを使用してアバターを作成します。
今回はUnity Raw Inputでキーが離された時の動作について設定を行います。

スポンサーリンク

前回記事のサンプル

前回の記事(キー入力に応じて動作するアバターの作成)で作成したアバターの動画です。

UnityでLive2Dのアバターを作ってみる
この記事ではCubism SDK for Unityを使用して、プレイヤーのキー入力に応じてアニメーションするアバターを作成する手順を紹介しています。

改善したい点

キーが2つ以上同時に入力されている時に、どれか1つキーを離すと、全ての指が同時に離れてしまう。

今回試してみた方法

どのキーが離されたか識別する(IsKeyUpのような動作の)記述を追加する。

Unity Raw Inputの設定

Unity Raw Inputの基本的な使い方は Qiita の記事 バックグラウンド動作時のキー入力取得 が参考になりました。
サンプルコードも用意されているので、簡単に設定することができます。

1. キーが離された時の動作

Qiitaの記事で紹介されているサンプルコードをベースにして、キーが離された時の動作(離されたキーの識別)を追加します。変数 key を利用して、キーの識別を行うことにしました。

RawKeyInputTest.cs
private void LogKeyUp (RawKey key)
{
  // keyの内容を文字列に変換
  string str = key.ToString();
  // Wキーが離されたら
  if(str == "W"){
    // 対応する指の論理値を切り替える
    is_L1 = false;
  }else if(str == "A"){
    is_L2 = false;
  }else if(str == "S"){
    is_L3 = false;
  }else if(str == "D"){
    is_L4 = false;
  }else if(str == "Space"){
    is_R1 = false;
  }
}

2. キーが押された時の動作

Unity Raw InputにはIsKeyDownが用意されているので、これを利用してキー入力を識別して、その後の動作を設定することができます。
もしくは1.の識別方法と同様に変数 key を利用して、下記コードのようにキー入力を識別することもできます。

RawKeyInputTest.cs
private void LogKeyDown (RawKey key)
{
  // IsKeyDownを使う場合
  // if (RawKeyInput.IsKeyDown(RawKey.W)) {
  //   is_L1 = true;
  // }
  string str = key.ToString();
  switch (str){
    case "W":
      is_L1 = true;
      break;
    case "A":
      is_L2 = true;
      break;
    case "S":
      is_L3 = true;
      break;
    case "D":
      is_L4 = true;
      break;
    case "Space":
      is_R1 = true;
      break;
    default:
      break;
  }
}

3. 他のスクリプトに値を渡すための関数

キー入力を別のスクリプトに渡すための関数を用意します。

RawKeyInputTest.cs
public bool GetIsL1 () {
  return is_L1;
}

4. 値の受け取り方

Live2DのCubism SDKチュートリアルで紹介されているスクリプト「ParameterLateUpdate.cs」で値を受け取る際の例です。ParameterLateUpdate.csはLive2Dのモデルのパラメータを更新する際に用いるスクリプトです。

下記コードではRawKeyInputTestから渡される値を基にして、パラメータの更新を行っています。

ParameterLateUpdate.cs
public class ParameterLateUpdate : MonoBehaviour
{
  private CubismModel _model;
  public RawKeyInputTest rawKeyInputTest;
  private bool is_L1;
  . . . . .
  private void LateUpdate()
  {
    //値を受け取る
    is_L1 = rawKeyInputTest.GetIsL1();
    . . . . .
    //受け取った論理値で条件を分岐
    if(is_L1 == true){
      var parameter = _model.Parameters[1];
      parameter.BlendToValue(CubismParameterBlendMode.Override, value);
    }
  }
}

Cubism SDK for Unity Sample

今回の内容(離されたキーの識別)でスクリプトを更新して、画面の録画したサンプルです。
離されたキーが識別されているため、それぞれの指を個別に動かすことができました。

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