見出し画像

音ゲーのコントローラーをスマホアプリで作ってみた

こんにちは、もやしの刺身です。
スマホでボタンを押したときに、PCでキーボードが押されるアプリを作ったので色々メモしておきます。
興味のある方は参考にしていただければ幸いです。

Xユーザーのもやしの刺身さん: 「超楽しい https://t.co/yP3g8CgGuz」 / X (twitter.com)

4台もスマホあるけどどうやって用意するの?

高性能である必要はないので適当に中古で買いましょう、おすすめは初代AQUOS senseです。
有機ELディスプレイのスマホでは絶対にやらないでください修理するまで一生残像が残ります。
スマートフォンの有機ELはどれぐらいで焼き付くのか?焼き付きの原因と確認方法・予防策を解説! (taku-blog.com)

開発環境(合わせる必要はないけど一応参考までに)

スマホからPCにキー操作を送信するアプリ→Unity 2019.4.2f1
このUnityバージョンだとAndroid4.4未満では動かないので、更に古い端末に対応させたい場合は、Android2.3.1対応のUnity 5.5.6f1で作ってあげればいいと思います。試してないのでできなかったらごめんなさい

PC側でキー操作を受け取り、キーボードを押すアプリ→Unity 2022.3.9f1
WindowsInput.dllも必要です

スマホ側でやってること

InputFieldにPCのIPアドレスを入力すると、ボタンを押したときにそのIPへキー操作を送信するようにしてます

public InputField ipInputField; // InputFieldを参照するための変数。
public int remotePort = 4655; //端末ごとにポートを分ける。1台目は4655で2台目は4656って感じに
private UdpClient udpClient;

void Start()
{
    udpClient = new UdpClient();
}

public void L1() //Left1の略、つまり左の赤ボタン
{
    string remoteIP = ipInputField.text; // InputFieldからIPアドレスを取得
    byte[] jKeyData = Encoding.ASCII.GetBytes("J");
    udpClient.Send(jKeyData, jKeyData.Length, remoteIP, remotePort); //Jを送信
}
public void L1r() //rはreleaseの略、ボタンを離したときに呼び出される
{
    string remoteIP = ipInputField.text; // InputFieldからIPアドレスを取得
    byte[] j2KeyData = Encoding.ASCII.GetBytes("J2");
    udpClient.Send(j2KeyData, j2KeyData.Length, remoteIP, remotePort); //J2を送信。これをPC側で受け取ったときはJキーを離すようにしています
}
ボタン1の処理。ボタンを押すとL1が呼び出され、離したらL1rが呼び出される

PC側でやってること

public int localPort = 4655; // 同じポート番号を使用
private UdpClient udpClient;
private ConcurrentQueue<string> receivedMessages = new ConcurrentQueue<string>();

async void Start()
{
udpClient = new UdpClient(localPort);
await Task.Run(async () =>
{
while (true)
{
try
{
UdpReceiveResult result = await udpClient.ReceiveAsync();
string receivedMessage = Encoding.ASCII.GetString(result.Buffer);
receivedMessages.Enqueue(receivedMessage);
   }
         catch (SocketException ex)
         {
             Debug.LogError(ex.ToString());
         }
     }
 });
 }
    void Update()
{
while (receivedMessages.TryDequeue(out string receivedMessage))
{
InputSimulator sim = new InputSimulator();
if (receivedMessage == "J") //Jをスマホから受け取ったら
{
sim.Keyboard.KeyDown(WindowsInput.Native.VirtualKeyCode.VK_J); //Jキーを押す
}
if (receivedMessage == "J2") //J2をスマホから受け取ったら
{
sim.Keyboard.KeyUp(WindowsInput.Native.VirtualKeyCode.VK_J); //Jキーを離す
}
}


この記事が気に入ったらサポートをしてみませんか?