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