コガネブログ

平日更新を目標に Unity や C#、Visual Studio、ReSharper などのゲーム開発アレコレを書いていきます

【Unity】【Arduino】スイッチが押されたら Unity を再生・停止する

参考サイト様

上記のサイト様のプログラムがとても良かったため、
Windows フォームアプリケーションだけではなく
コンソールアプリケーションでも動作するようにしました

スクリプト

Arduino

const int BUTTON = 7;

void setup()
{
  Serial.begin( 9600 );
  pinMode( BUTTON, INPUT_PULLUP );
}

void loop()
{
  int state = digitalRead( BUTTON );
  if ( state != LOW ) return;
  Serial.println( "1" );
  delay( 200 );
}

コンソールアプリケーション

using System;
using System.Diagnostics;
using System.IO.Ports;
using System.Runtime.InteropServices;
using System.Windows.Forms;

public class Program
{
    static SerialPort serial;
    
    [DllImport( "user32.dll" )]
    static extern IntPtr GetForegroundWindow();
    [DllImport( "user32.dll" )]
    static extern int GetWindowThreadProcessId( IntPtr hWnd, out int id );

    static void Main()
    {
        serial = new SerialPort( "COM3", 9600 );
        serial.DataReceived += OnDataReceived;
        serial.Open();

        while( true ) { }
    }

    static void OnDataReceived( object sender, SerialDataReceivedEventArgs e )
    {
        var data = serial.ReadLine();
        if ( string.IsNullOrWhiteSpace( data ) ) return;
        var name = GetActiveWindowName();
        if ( name != "Unity" ) return;
        SendKeys.SendWait( "^p" );
    }
    
    static string GetActiveWindowName()
    {
        int processId;
        var hWnd = GetForegroundWindow();
        GetWindowThreadProcessId( hWnd, out processId );
        return Process.GetProcessById( processId ).ProcessName;
    }
}