音ゲーのコントローラーをスマホアプリで作ってみた
こんにちは、もやしの刺身です。
スマホでボタンを押したときに、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キーを離すようにしています
}
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キーを離す
}
}
この記事が気に入ったらサポートをしてみませんか?