UnityのWWWでHTMLのレスポンスを受け取る

このブログの存在そのものを完全に忘却していた....

最近はUnityを触ることが多い、扱いが非常に楽だがMonoのC#が通常と異なる部分がいろいろある。

WWWもその一つ。(というよりUnityにしか入ってない機能)

UnityではWWWで外部通信を行うのが一般的っぽい。

やりたいこと

  • WWWクラスでHTMLのレスポンスを受け取る(text or image or audio)

準備するもの

  • Unity4.xかUnity5.x

実践 

gistd7f04c6c381162da3de6

便利なもので、これだけで取得できます。

ネットでは、非同期処理のためにコルーチンで処理を一旦返しているサンプルが多かったのでその通りにします。

レスポンスが帰ってきたらResponceAction(WWW www)が実行されます。

さらに有難いことに、レスポンス結果が画像だったなら何もしなくてもWWW.textureにテクスチャデータがすでに入っています、ナンテコッタイ。

結果

以上

 

Python + OpenCVでマウスクリック後の画面遷移判定をする

前々からpythonOpenCVに興味があったので少し触ってみる

やりたいこと

準備する物

  • python2.7.6(3.x系でも問題ないはず)
  • OpenCV(今回はv2.4.8、Cmakeで自前ビルド)
  • ImageGrab(pythonライブラリ、簡単にスクリーンショットが撮れる)
  • numpy(これがないとopencvが動かないようなので必須)

実践

 処理の流れとしては以下のようなイメージ、基本的に345をループ実行する

  1. 一定間隔でスクショ画像を取得
  2. 予め保存してある画面情報と比較して閾値以上の画像を検索、現在の画面状態を把握する
  3. マウス移動&クリック
  4. 指定の遷移状態が確認できるまで待機
  5. 次のマウス操作

 今回は外部設定ファイルにマウスクリック位置と、クリック後の画面状態のセットを登録し、それらを指定順番で実行する形式にしてみた・・・が適当に作りすぎて汚いコードになっちゃったので重要な部分の動きだけ抜粋

画像の比較サンプル
import cv2 as cv
# 画像のロード
img1 = cv.imread(filename1)
img2 = cv.imread(filename2)
# ヒストグラム作成
hist1 = cv.calcHist([img1],[0],None,[256],[0,256])
hist2 = cv.calcHist([img2],[0],None,[256],[0,256])
# この値が1.0に近いほど似た画像であるもよう
value = cv.compareHist(hist1, hist2, 0) 
画面キャプチャ
import ImageGrab
def GetScreenCaptureImg(x, y, w, h) :
    # 指定領域をキャプチャ
    img = ImageGrab.grab((x,y,w,h))
    img.save()
マウス操作
from ctypes import *
user32 = windll.user32
def Move(x,y):
    user32.SetCursorPos(x,y)
def Click():
    user32.mouse_event(0x2,0,0,0,0)#押す
    user32.mouse_event(0x4,0,0,0,0)#離す

結果

  • 誤判定だらけかと思いきや、なかなかの精度で画面遷移判定をしてくれたので満足。
  • マウス操作だけのアプリと比べて画面遷移が確認できてから次のマウス操作を実行するため、タイミングのズレやラグが気にならない
  • マウスのコントロールが取られるので他の作業ができない

以上