コガネブログ

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

【Unity】【C#】簡易モンキーテストツールを作りました

はじめに

Unity 製のスマホゲームの開発中に使用していた
自作のモンキーテストツールを GitHub に公開しました

このツールを使うと指定された範囲内を高速かつランダムにクリックし続けるため
ボタンが連打できたり意図しないタイミングで押せてしまったりという不具合を見つけられます

概要

2017-09-17_163505

モンキーテスト用の簡易ツールです。
このツールを使用することで指定された範囲内を高速かつランダムにクリックし続けます。

使い方

設定項目 内容
座標 クリックする範囲
押下間隔 次のクリックを行うまでの時間
押下時間 マウスボタンを押してから離すまでの時間
  • 「開始」ボタンを押すと入力された設定をもとにモンキーテストを開始します。
  • Shift + Esc キーでモンキーテストを終了します。

コマンドライン引数

--xMin <X 座標の最小値> --xMax <X 座標の最大値> --yMin <Y 座標の最小値> --yMax <Y 座標の最大値> --interval <押下間隔(ミリ秒)> --downTime <押下時間(ミリ秒)>

注意

  • このツールはマウスカーソルの座標を強制的に移動させてクリックさせるツールなので、
    誤った設定でモンキーテストを開始すると意図しないボタンを押してしまう可能性があるのでご注意ください。

【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;
    }
}

【Unity】【Arduino】ビルド中に LED を光らせる

スクリプト

Arduino

void setup()
{
  Serial.begin( 9600 );
  pinMode( 13, OUTPUT );
}

void loop()
{
  if ( Serial.available() <= 0 ) return;

  char data = Serial.read();
  int num = data == '1' ? HIGH : LOW;
  digitalWrite( 13, num );
  Serial.flush();
}

Unity

using System.IO.Ports;
using UnityEditor;
using UnityEditor.Build;

public class Example: IPreprocessBuild, IPostprocessBuild
{
    private SerialPort serial;

    public int callbackOrder { get { return 0; } }

    public void OnPreprocessBuild( BuildTarget target, string path )
    {
        serial = new SerialPort( "COM3", 9600 );
        serial.Open();
        serial.Write( "1" );
    }
    
    public void OnPostprocessBuild( BuildTarget target, string path )
    {
        serial.Write( "0" );
        serial.Close();
    }
}

【Unity】【Arduino】Unity エディタ再生中や一時停止中に LED を光らせる

スクリプト

Arduino

void setup()
{
  Serial.begin( 9600 );
  pinMode( 13, OUTPUT );
  pinMode( 12, OUTPUT );
}

void loop()
{
  if ( Serial.available() <= 0 ) return;

  int data = Serial.read();
  
  digitalWrite( 13, ( data & 1 ) != 0 ? HIGH : LOW );
  digitalWrite( 12, ( data & 2 ) != 0 ? HIGH : LOW );

  Serial.flush();
}

Unity

using System;
using System.IO.Ports;
using UnityEditor;

public static class Example
{
    [Flags]
    private enum State
    {
        NONE    = 0, 
        PLAYING = 1 << 0, 
        PAUSED  = 1 << 1, 
    }

    [InitializeOnLoadMethod]
    private static void Init()
    {
        var serial = new SerialPort( "COM3", 9600 );
        serial.Open();

        EditorApplication.playmodeStateChanged = () =>
        {
            var isPlaying   = EditorApplication.isPlaying;
            var isPaused    = EditorApplication.isPaused;
            var state       = State.NONE;
            
            state |= isPlaying ? State.PLAYING : State.NONE;
            state |= isPaused  ? State.PAUSED  : State.NONE;
            
            serial.Write( new byte[] { ( byte )state }, 0, 1 );
        };
    }
}

【Unity】【Arduino】Unity エディタ再生中に LED を光らせる

スクリプト

Arduino

void setup()
{
  Serial.begin( 9600 );
  pinMode( 13, OUTPUT );
}

void loop()
{
  if ( Serial.available() <= 0 ) return;

  char data = Serial.read();
  int num = data == '1' ? HIGH : LOW;
  digitalWrite( 13, num );
  Serial.flush();
}

Unity

using System.IO.Ports;
using UnityEditor;

public static class Example
{
    [InitializeOnLoadMethod]
    private static void Init()
    {
        var serial = new SerialPort( "COM3", 9600 );
        serial.Open();

        EditorApplication.playmodeStateChanged = () =>
        {
            var isPlaying   = EditorApplication.isPlaying;
            var str         = isPlaying ? "1" : "0";

            serial.Write( str );
        };
    }
}