Nintendo SwitchのJoy-ConをHoloLensで利用してみたのでその内容をまとめました。

Joy-Con

UnityでJoy-Conを利用する方法についてはすでにいくつかブログで紹介されているのでそちらが参考になります。

その中で個人的に分かりやすいと感じたサイトは【Unity】Nintendo Switch の Joy-Con を使用する方法 です。

HoloLensで利用する場合は以下画像にあるPlayer Settings –> Capabilitiesの[HumanInterfaceDevice]と[Bluetooth]にチェックを入れます。

joy-con01

以下画像にある、ボタンのJoystick番号については各環境により異なる値になるため注意が必要です。

joy-con02

以上の設定が済めばあとは以下のようなコードで動作を確認できます。全ボタンをアサインしたので興味がればご自由にご利用ください。ただしアナログスティックについてはHoloLens実機上では正しい値はとれませんでした。

※Joystick番号は上述の通り適宜修正してください、またDebug.Logはエディタ上でしか表示されないため実機で何かしら表示する場合はTextMesh等を配置してください

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
using UnityEngine;
 
/// <summary>
/// Nintendo SwitchのJoy-Conのインプットサンプル
/// </summary>
public class JoyConSample : MonoBehaviour
{
    void Update()
    {
        #region Joy-Con(R)
        // axisNameはInputManagerで設定した名前にする
        var hR = Input.GetAxis("Joy-Con(R) Horizontal");
        var vR = Input.GetAxis("Joy-Con(R) Vertical");
        if (hR != 0 || vR != 0)
        {
            Debug.LogFormat("Joy-Con(R) : H({0}), V({1})", hR, vR);
        }
 
        // KeyCode.Joystick「番号」は各自の環境に合わせた番号にする
        if (Input.GetKeyDown(KeyCode.Joystick3Button0))
        {
            Debug.Log("A");
        }
 
        if (Input.GetKeyDown(KeyCode.Joystick3Button2))
        {
            Debug.Log("B");
        }
 
        if (Input.GetKeyDown(KeyCode.Joystick3Button1))
        {
            Debug.Log("X");
        }
 
        if (Input.GetKeyDown(KeyCode.Joystick3Button3))
        {
            Debug.Log("Y");
        }
 
        if (Input.GetKeyDown(KeyCode.Joystick3Button14))
        {
            Debug.Log("R");
        }
 
        if (Input.GetKeyDown(KeyCode.Joystick3Button15))
        {
            Debug.Log("ZR");
        }
 
        if (Input.GetKeyDown(KeyCode.Joystick3Button5))
        {
            Debug.Log("SR");
        }
 
        if (Input.GetKeyDown(KeyCode.Joystick3Button4))
        {
            Debug.Log("SL");
        }
 
        if (Input.GetKeyDown(KeyCode.Joystick3Button9))
        {
            Debug.Log("+");
        }
 
        if (Input.GetKeyDown(KeyCode.Joystick3Button12))
        {
            Debug.Log("HOME");
        }
 
        if (Input.GetKeyDown(KeyCode.Joystick3Button11))
        {
            Debug.Log("R Stick");
        }
        #endregion
 
        #region Joy-Con(L)
        var hL = Input.GetAxis("Joy-Con(L) Horizontal");
        var vL = Input.GetAxis("Joy-Con(L) Vertical");
 
        if (hL != 0 || vL != 0)
        {
            Debug.LogFormat("Joy-Con(L) : H({0}), V({1})", hL, vL);
        }
 
        if (Input.GetKeyDown(KeyCode.Joystick2Button2))
        {
            Debug.Log("UP");
        }
 
        if (Input.GetKeyDown(KeyCode.Joystick2Button3))
        {
            Debug.Log("RIGHT");
        }
 
        if (Input.GetKeyDown(KeyCode.Joystick2Button1))
        {
            Debug.Log("DOWN");
        }
 
        if (Input.GetKeyDown(KeyCode.Joystick2Button0))
        {
            Debug.Log("LEFT");
        }
 
        if (Input.GetKeyDown(KeyCode.Joystick2Button14))
        {
            Debug.Log("L");
        }
 
        if (Input.GetKeyDown(KeyCode.Joystick2Button15))
        {
            Debug.Log("ZL");
        }
 
        if (Input.GetKeyDown(KeyCode.Joystick2Button5))
        {
            Debug.Log("SR");
        }
 
        if (Input.GetKeyDown(KeyCode.Joystick2Button4))
        {
            Debug.Log("SL");
        }
 
        if (Input.GetKeyDown(KeyCode.Joystick2Button8))
        {
            Debug.Log("-");
        }
 
        if (Input.GetKeyDown(KeyCode.Joystick2Button13))
        {
            Debug.Log("CAPTURE");
        }
 
        if (Input.GetKeyDown(KeyCode.Joystick2Button10))
        {
            Debug.Log("L Stick");
        }
        #endregion
    }
}

モデルデータ

女子高生アセットはセールのときに$0.83だったのでうっかり買ったものです。

Fighter – School Girl

school_giel

SpatialUnderstanding

SpatialUnderstandingで注意が必要な点として以下の動画のような点があります。

いきなりシーンにオブジェクトを配置してしまうとまだメッシュが生成されていないため落下してしまいます。そのため、メッシュが生成されてからオブジェクトを生成するなり位置を調整する必要があります。

これを実現する方法として以下手順を踏む必要があります。

  • スキャンが終了したときに呼ばれるコールバックを設定する
  • スキャンが終了したことをアプリケーション側の任意のタイミングで設定する
  • コールバック内でオブジェクトの生成等を行う

具体的には以下のようなコードになります。サンプルでは5秒経過したらスキャンが終了したものとみなして位置を再設定しています。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
using System.Collections;
using UnityEngine;
using HoloToolkit.Unity;
 
public class GameInitializer : MonoBehaviour {
    public TextMesh textMesh;
    public GameObject girl;
 
    void Start () {
        textMesh.text = "Start scanning.";
 
        // スキャン終了時に呼ばれるコールバックにInitializeメソッドを設定する
        SpatialUnderstanding.Instance.OnScanDone += Initialize;
 
        // 5秒間待つコルーンチを開始する
        StartCoroutine(ScanWaitCoroutine());
    }
 
    IEnumerator ScanWaitCoroutine()
    {
        // 5秒待つ
        textMesh.text = "Now scanning ...";
        yield return new WaitForSeconds(5f);
 
        // 5秒経過したらスキャン終了と見なす
        textMesh.text = "Scan finished.";
        SpatialUnderstanding.Instance.RequestFinishScan();
    }
 
    void Initialize()
    {
        // スキャン終了後の初期化処理等
        textMesh.gameObject.SetActive(false);
        girl.transform.position = new Vector3(0f, 0f, 2f);
    }
}

トラックバック

コメント

  1. […] Nintendo SwitchのJoy-Conを利用した動画を撮影したときに、両手がふさがって停止ボタンが押せなかったので録画時間を指定できるUnityのエディタ拡張を作りました。 […]

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です