11# UnityJoyCon
22
3- UnityJoyCon は Nintendo Switch の Joy-Con を Unity から扱うためのライブラリです。ボタン入力、 スティック座標、加速度・ジャイロセンサーの生データを取得でき、ゲームロジックやデバッグ表示に組み込めます 。
3+ UnityJoyCon は Nintendo Switch の Joy-Con を Unity Input System に直接統合するライブラリです。Joy-Con を HID デバイスとして自動認識し、ボタン入力・ スティック座標・加速度 / ジャイロの生データをそのまま InputDevice から取得できます。外部の hidapi や ` System.Threading.Channels ` への依存はありません 。
44
5- ## 導入方法
6-
7- ### UnityNuGet レジストリを設定する
8- 本パッケージは ` System.Threading.Channels ` を UnityNuGet ( ` org.nuget.system.threading.channels ` ) から取得します。レジストリが設定されていないと依存関係が解決できないため、導入先プロジェクトで以下のいずれかの方法で UnityNuGet を追加してください。
5+ ## 特徴
6+ - Unity Input System へのレイアウトを自動登録し、左右 Joy-Con を ` SwitchJoyConLeftHID ` / ` SwitchJoyConRightHID ` として認識
7+ - ボタン / スティック / 加速度 / ジャイロを標準の InputControl として取得可能
8+ - ネイティブプラグイン不要。OS にペアリングされている Joy-Con をそのまま利用
99
10- - ** manifest.json を直接編集する**
11- ``` json
12- "scopedRegistries" : [
13- {
14- "name" : " Unity NuGet" ,
15- "url" : " https://unitynuget-registry.openupm.com" ,
16- "scopes" : [
17- " org.nuget"
18- ]
19- }
20- ]
21- ```
22- 既存の ` scopedRegistries ` 配列がある場合は、` Unity NuGet ` のエントリをマージし ` org.nuget ` スコープが含まれるように調整します。
10+ ## 前提条件
11+ - Unity 2022.3.62f3 以降(推奨)
12+ - ` com.unity.inputsystem ` 1.14.2(本パッケージの依存として自動導入されます)
13+ - Joy-Con を事前に OS と Bluetooth ペアリングしておくこと
2314
24- - ** GUI から追加する**
25- 1 . ` Edit > Project Settings... ` を開きます。
26- 2 . ` Package Manager ` セクションの ` Scoped Registries ` で ` + ` を押し、下記を入力します。
27- - Name: ` Unity NuGet `
28- - URL: ` https://unitynuget-registry.openupm.com `
29- - Scope(s): ` org.nuget `
30- 3 . 保存すると manifest.json に反映されます。
15+ ## 導入方法
3116
3217### パッケージを Git から追加する
33- レジストリ設定後、 ` com.tuatmcc.unityjoycon ` を Git パッケージとして導入します 。
18+ Package Manager で Git パッケージとして追加します 。
3419
3520- ** manifest.json を直接編集する**
3621 ``` json
@@ -42,7 +27,10 @@ UnityJoyCon は Nintendo Switch の Joy-Con を Unity から扱うためのラ
4227 2 . 左上の ` + ` ボタンから ` Add package from git URL... ` を選択します。
4328 3 . ` https://github.com/tuatmcc/UnityJoyCon.git?path=Packages/com.tuatmcc.unityjoycon ` を入力して ` Add ` します。
4429
45- Unity の Package Manager を再読み込みすると ` UnityJoyCon ` がインストールされ、` UnityJoycon ` 名前空間の API を参照できるようになります。
30+ ### Input System を有効化する
31+ パッケージ導入時に「新しい Input System を有効にしますか?」と促される場合があります。` Project Settings > Player > Active Input Handling ` を ` Input System Package (New) ` または ` Both ` に設定し、Unity を再起動してください。
32+
33+ Unity の Package Manager を再読み込みすると ` UnityJoyCon ` がインストールされ、` UnityJoyCon ` 名前空間の API を参照できるようになります。
4634
4735### サンプルを試す場合
4836リポジトリ全体を取得すると、サンプルシーンで動作確認が行えます。
@@ -55,57 +43,61 @@ cd UnityJoyCon
5543` Assets/SampleJoyCon.unity ` を開き、Joy-Con をペアリングした状態で Play モードに入ると、ボタン・スティック・IMU の値をリアルタイムで確認できます。
5644
5745## クイックスタート
58- 最初に見つかった Joy-Con に接続し、ボタン / スティック / IMU を取得するサンプルです 。
46+ 最初に見つかった Joy-Con から入力を読み取るシンプルなサンプルです。Input System によって Joy-Con が認識されると、 ` SwitchJoyConLeftHID.all ` / ` SwitchJoyConRightHID.all ` に追加されます。実運用では InputAction(Input Actions アセットまたは ` InputAction ` クラス)にバインドして扱うのが基本です 。
5947
6048``` csharp
6149using System .Linq ;
6250using UnityEngine ;
63- using UnityJoycon ;
64- using UnityJoycon . Hidapi ;
51+ using UnityEngine . InputSystem ;
52+ using UnityJoyCon ;
6553
66- public class JoyConBootstrap : MonoBehaviour
54+ public class JoyConReader : MonoBehaviour
6755{
68- private Hidapi ? _hidapi ;
69- private JoyCon ? _joycon ;
56+ private SwitchJoyConLeftHID _left ;
57+ private SwitchJoyConRightHID _right ;
7058
71- private async void Awake ()
59+ private void Update ()
7260 {
73- _hidapi = new Hidapi ();
74- var info = _hidapi .GetDevices (0x 057e ) // Nintendo Vendor ID
75- .FirstOrDefault (d => d .ProductId is 0x 2006 or 0x 2007 );
76- if (info == null )
61+ // シーン再生中にペアリングされた場合も追従できるよう、毎フレーム取得しています
62+ _left ??= SwitchJoyConLeftHID .all .FirstOrDefault ();
63+ _right ??= SwitchJoyConRightHID .all .FirstOrDefault ();
64+
65+ if (_left != null && _left .leftTrigger .wasPressedThisFrame )
66+ Debug .Log (" ZL が押されました" );
67+
68+ if (_right != null )
7769 {
78- Debug .LogError (" Joy-Con が見つかりません" );
79- return ;
70+ var stick = _right .rightStick .ReadValue (); // -1.0f ~ 1.0f
71+ var accel = _right .accelerometer .ReadValue ();
72+ var gyro = _right .gyroscope .ReadValue ();
73+ // stick / accel / gyro をゲーム内ロジックへ反映
8074 }
81-
82- var device = _hidapi .OpenDevice (info );
83- _joycon = await JoyCon .CreateAsync (device );
8475 }
76+ }
77+ ```
8578
86- private void Update ()
87- {
88- if (_joycon ? .TryGetState (out var state ) != true ) return ;
79+ ### InputAction で使う例(抜粋)
80+ 入力アクションアセットで、デバイスを ` SwitchJoyConLeftHID ` / ` SwitchJoyConRightHID ` に限定したり、左スティックやボタンをバインドできます。スクリプトで生成する場合の最小例:
8981
90- if ( state . IsButtonPressed ( Button . A ))
91- {
92- Debug . Log ( " A ボタンが押されています " ) ;
93- }
82+ ``` csharp
83+ using UnityEngine ;
84+ using UnityEngine . InputSystem ;
85+ using UnityJoyCon ;
9486
95- var stick = state .Stick ; // -1.0f ~ 1.0f に正規化済み
96- var imu = state .ImuSamples [^ 1 ]; // 最新サンプル
97- // stick / imu をゲーム内ロジックに反映
98- }
87+ public class JoyConActions : MonoBehaviour
88+ {
89+ private InputAction _stick ;
9990
100- private async void OnDestroy ()
91+ private void OnEnable ()
10192 {
102- if (_joycon != null )
103- {
104- await _joycon .DisposeAsync ();
105- _joycon = null ;
106- }
93+ _stick = new InputAction (type : InputActionType .Value , binding : " <SwitchJoyConRightHID>/rightStick" );
94+ _stick .Enable ();
95+ _stick .performed += ctx => Debug .Log ($" Right stick: {ctx .ReadValue <Vector2 >()}" );
96+ }
10797
108- _hidapi ? .Dispose ();
98+ private void OnDisable ()
99+ {
100+ _stick .Dispose ();
109101 }
110102}
111103```
@@ -114,9 +106,5 @@ public class JoyConBootstrap : MonoBehaviour
114106- ` Assets/JoyConRight.cs ` は Joy-Con のステートを UI に反映する参考スクリプトです。
115107- ` Assets/SampleJoyCon.unity ` を Play すると、ボタンが点灯し IMU が TextMeshPro で表示されます。
116108
117- ## hidapi バイナリの更新
118- ネイティブライブラリを更新する場合は、GitHub Actions の ` Build hidapi binaries ` ワークフローを Workflow Dispatch で起動してください。macOS / Windows / Linux 向けの hidapi をビルドし、` Packages/com.tuatmcc.unityjoycon/Runtime/Hidapi/Plugins/ ` 下へ自動コミットします。
119-
120109## ライセンス
121110- パッケージ本体: MIT License
122- - hidapi: 各プラットフォーム向けバイナリは hidapi のライセンスに従います
0 commit comments