もりもりゲーム制作ブログ

それほどもりもりしてません。Unityの忘備録的ブログ。

NintendoSwitchのJoyConのジャイロをUnityで遊ぶ

NintendoSwitchのJoyConはBluetoothでPCにもandroidにも使えるということで、Unityで動作確認がてら遊びたいと思います。

コガネブログさんのこちらの記事でとりあえず導入しました。

【Unity】Nintendo Switch の Joy-Con のジャイロ・加速度・傾きの値を取得したり、振動させたりすることができる「JoyconLib」紹介 - コガネブログ

やりたいこと

ジャイロで3Dオブジェクトを回転させて、シューティングとかやる。

必要なもの

  • JoyCon:LとRのふたつ。
  • モデル:JoyConっぽいものをUnity標準の3Dオブジェクトで赤と青の二種類つくりました。
  • JoyController.cs:このスクリプトをモデルにアタッチし、JoyCon入力で動かす。

レシピ

JoyConのモデル

CubeとCylinderを組み合わせただけです。持ってるのがネオンカラーなのでマテリアルはEmittionつけました。

f:id:monimoni114514:20190124155859p:plain
JoyCon(LowPoly)

JoyController.csの中身

  • 左右判別

LとR、どちらにアタッチされているかをInspectorから設定したいので列挙型・・・
InspectorからjoyconTypeがどちらかを選択します。

public enum LorR
{
    Left,
    Right
}
public class JoyConModelMove : MonoBehaviour
{
    [SerializeField]
    LorR joyconType;
}
  • JoyConのための変数

JoyConLibによるJoyconクラスを使います。
接続されているコントローラを取得するListとJoycon変数を宣言し、
joyconTypeによってLとRどちらのコントローラーか代入します。

    List<Joycon> joycons;
    Joycon joycon;
    void Start()
    {
        joycons = JoyconManager.Instance.j;
        switch (joyconType)
        {
            case LorR.Left:
                joycon = joycons.Find(c => c.isLeft);
                break;
            case LorR.Right:
                joycon = joycons.Find(c => !c.isLeft);
                break;
        }
    }
  • ジャイロの入力受け取り

JoyconクラスのGetGyro()関数でジャイロ入力をVector3型に受け取ることができます。

単位時間にどれだけジャイロセンサーに変化があったかという値なため、オブジェクトのtransform.localEulerAnglesにジャイロ入力を加算。
ずれていくことがあるのでオブジェクトの角度をリセットできるよう、トリガーボタンで回転をリセットするようにします。

    void Update()
    {
        var gyro = joycon.GetGyro();//ジャイロ入力
        var angle = transform.localEulerAngles;//オブジェクトの現在の回転
        //座標系が違うため符号やベクトルがすこし違う
        angle.x += -gyro.y;
        angle.y += gyro.z;
        angle.z += -gyro.x;
        transform.localEulerAngles = angle;

        //トリガーボタン(LRボタン)が押されたときに回転リセット
        if(joycon.GetButtonDown(Joycon.Button.DPAD_LEFT))
            transform.localEulerAngles = Vector3.zero;
    }


このスクリプトをモデルにアタッチすることで大体いい感じに動いてくれます。
回転軸の限界でおかしな回転をする時があるのでうまい具合に回転角度に制限をつけます・・・・・がそれは次回の記事で。

後はボタンを押すと球を打ち出すなりすることでジャイロエイムシューティングできます。

追記



Unity2018.3.14f1で再現しようとしたところdllファイルがうまく読み込めず使えませんでした・・・。
現在調査中です・・・。