Live2Dで作成したモデルをUnityで動かすCubism SDK for Unityを使用してアバターを作成します。
今回はUnity Raw Inputでキーが離された時の動作について設定を行います。
前回記事のサンプル
前回の記事(キー入力に応じて動作するアバターの作成)で作成したアバターの動画です。
改善したい点
キーが2つ以上同時に入力されている時に、どれか1つキーを離すと、全ての指が同時に離れてしまう。
今回試してみた方法
どのキーが離されたか識別する(IsKeyUpのような動作の)記述を追加する。
Unity Raw Inputの設定
Unity Raw Inputの基本的な使い方は Qiita の記事 バックグラウンド動作時のキー入力取得 が参考になりました。
サンプルコードも用意されているので、簡単に設定することができます。
1. キーが離された時の動作
Qiitaの記事で紹介されているサンプルコードをベースにして、キーが離された時の動作(離されたキーの識別)を追加します。変数 key を利用して、キーの識別を行うことにしました。
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 を利用して、下記コードのようにキー入力を識別することもできます。
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. 他のスクリプトに値を渡すための関数
キー入力を別のスクリプトに渡すための関数を用意します。
public bool GetIsL1 () { return is_L1; }
4. 値の受け取り方
Live2DのCubism SDKチュートリアルで紹介されているスクリプト「ParameterLateUpdate.cs」で値を受け取る際の例です。ParameterLateUpdate.csはLive2Dのモデルのパラメータを更新する際に用いるスクリプトです。
下記コードではRawKeyInputTestから渡される値を基にして、パラメータの更新を行っています。
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
今回の内容(離されたキーの識別)でスクリプトを更新して、画面の録画したサンプルです。
離されたキーが識別されているため、それぞれの指を個別に動かすことができました。