OpenSiv3D
OpenSiv3D copied to clipboard
Mac OSにおいて、Joy-Conの入力が反映されない
予期しない動作の内容 | Describe the unexpected behavior Mac OSにおいて、Joy-Con (L/R)の入力を与えてもJoyConクラスのボタン・スティック入力値に反映されない。
- ボタン入力が反映されず、どれだけボタンを押し込んでも無入力として扱われる。
- これはJoy-Conに備え付けられている全てのボタンにおいて発生する。
- スティック入力も一切反応しない。(メソッド
povD8()
からは常にnone値が返ってきている。) - Joy-Con自体は認識しているようで、JoyConインスタンスのbool値評価ではtrueが返ってきている。
- 両方のJoy-Con L/Rを接続、アプリケーションを起動した状態で、片方のJoy-Conの接続を切断した場合、接続され続けている他方のJoy-Conの入力が全て正しく反映されるようになる。
- その状態からさらに接続を外したJoy-Conを再度接続した場合、また入力が反映されなくなる。
再現方法 | To Reproduce
- 実行前、Joy-Con(L)とJoy-Con(R)を当PCにBluetooth接続しておく。
- HTML5 Gamepad APIによる入力テスト*1やSteam の入力テストにおいては反応があり、正しく接続できていると考えられる。
- *1 https://hardwaretester.com/gamepad
- 発生環境において、JoyConクラスを紹介する公式リファレンスのコード*2を実行する。
- *2 https://zenn.dev/reputeless/books/siv3d-documentation/viewer/tutorial-gamepad#32.2-joy-con-%E3%81%AE%E5%85%A5%E5%8A%9B%E3%82%92%E6%89%B1%E3%81%86
- その他のJoyConクラスを利用するコードでも同様に発生する。
- 検証に利用したJoy-Conのソフトウェアは、2024-08-24地点で最新のもの。
*2のコード
# include <Siv3D.hpp>
void Main()
{
Scene::SetBackground(ColorF{ 0.9 });
Window::Resize(1280, 720);
Effect effect;
Vec2 left{ 640 - 100, 100 }, right{ 640 + 100, 100 };
double angle = 0_deg;
double scale = 400.0;
bool covered = true;
while (System::Update())
{
Circle{ Vec2{ 640 - 300, 450 }, scale / 2 }.drawFrame(scale * 0.1);
Circle{ Vec2{ 640 + 300, 450 }, scale / 2 }.drawFrame(scale * 0.1);
// Joy-Con (L) を取得
if (const auto joy = JoyConL(0))
{
joy.drawAt(Vec2{ 640 - 300, 450 }, scale, -90_deg - angle, covered);
if (auto d = joy.povD8())
{
left += Circular{ 4, *d * 45_deg };
}
if (joy.button2.down())
{
effect.add([center = left](double t) {
Circle{ center, 20 + t * 200 }.drawFrame(10, 0, AlphaF(1.0 - t));
return t < 1.0;
});
}
}
// Joy-Con (R) を取得
if (const auto joy = JoyConR(0))
{
joy.drawAt(Vec2{ 640 + 300, 450 }, scale, 90_deg + angle, covered);
if (auto d = joy.povD8())
{
right += Circular{ 4, *d * 45_deg };
}
if (joy.button2.down())
{
effect.add([center = right](double t) {
Circle{ center, 20 + t * 200 }.drawFrame(10, 0, AlphaF(1.0 - t));
return t < 1.0;
});
}
}
Circle{ left, 30 }.draw(ColorF{ 0.0, 0.75, 0.9 });
Circle{ right, 30 }.draw(ColorF{ 1.0, 0.4, 0.3 });
effect.update();
SimpleGUI::Slider(U"Rotation: ", angle, -180_deg, 180_deg, Vec2{ 20, 20 }, 120, 200);
SimpleGUI::Slider(U"Scale: ", scale, 100.0, 600.0, Vec2{ 20, 60 }, 120, 200);
SimpleGUI::CheckBox(covered, U"Covered", Vec2{ 20, 100 });
}
}
発生環境(デスクトップの場合) | Desktop (please complete the following information):
- MacBook Pro 16-inch, 2023
- OS: Sonoma 14.6.1
- バージョン | Version: 0.6.15
- CPU/GPU: Apple M2 Pro
- Rosettaモードでアプリケーションが動作している。
備考 | Additional context
- Joy-Conを両方接続した時、Mac上ではJoy-Con L/Rが一つのゲームコントローラーとして認識されているようで、これが原因に関連しているかもしれない。
-
- (画像中ではバッテリー0%と記載されているが、実際には十分に充電されている)
-
- Gamepadの挙動を確かめられるコード*3では、次のような出力を見せた。
- コントローラー自体はJoyCon(L) / JoyCon(R)として認識できており、それぞれ別々のプレイヤーインデックスにマッピングされている。
- しかし、全てのボタン入力は
false
になっており、axe1
, ...,axe4
値も全て0となっている。POV
値もnoneとなっている。 - *3 https://zenn.dev/reputeless/books/siv3d-documentation/viewer/tutorial-gamepad#32.4-%E3%82%B2%E3%83%BC%E3%83%A0%E3%83%91%E3%83%83%E3%83%89%E3%81%AE%E5%85%A5%E5%8A%9B%E3%82%92%E6%89%B1%E3%81%86
- XInput 対応コントローラとして入力した際は一切動作しなかった。
- 片方のJoy-Conを接続し直す時に一方のJoy-Conに何らかのスティック入力を与え続けていると、そのスティック入力が継続され続けながら入力を受け付けなくなる。
- 片方のJoy-Conを接続してから起動した場合には、うまく反応する場合としない場合がある。
- 再現方法はよく分からないが、二つのジョイコンが同時に動いていたことはあった。
- ただしMacを再起動すると動かなくなってしまった。