Easy WiFi Controllerであそんでみた

ちょっとあこがれていたwifiでスマホをコントローラーにするプラグインが安かったので買ってしまった。
<a href="https://www.assetstore.unity3d.com/jp/#!/content/31991" target="_blank"><img src="https://qiita-image-store.s3.amazonaws.com/0/46444/ee11c7e9-d914-aed6-36bf-62b5ad7f062b.png"></a>

##インポートしたところ
<img src="https://qiita-image-store.s3.amazonaws.com/0/46444/b1f73d7f-840d-cffc-d68f-a9ffc24da6fd.png" width="250px" />

ClientとServerに入っているシーンが対になっています。
Clientフォルダに入っているのがコントローラーで、これをそれぞれビルドして端末などに入れます。
あとはServerの方をPCで起動するかスマホに入れて起動するだけでうごきます。

##デモをいろいろいろいろな端末で動かしてみた
Androidをサーバーに、PCとIpodtouch２つをクライアント(コントローラー)にして動かしていたところ
<img src="https://qiita-image-store.s3.amazonaws.com/0/46444/b743251b-b822-e7de-6753-e4af57bf3bfa.jpeg">
ばっちり動きました。これで１人で楽しく遊べるね！

##簡単にジャンケンでもつくってみる
###とりあえずクライアント側を作る
GameObject->Easy WiFi Manager->Add EasyWiFiManagerでオブジェクトを作成
<img src="https://qiita-image-store.s3.amazonaws.com/0/46444/313e707e-b6ec-457f-dbe9-6c13cbf638d0.png" width="400px">

するとオブジェクトが作成されるのでそのインスペクタのPeer TypeをClientに
サーバーの場合はこれをServerにすればOK
<img src="https://qiita-image-store.s3.amazonaws.com/0/46444/da6e6aa2-5b70-05bd-ca03-767ac999bdfd.png" width="400px">

コントローラーは用意されているので好きなものを配置する
PCでも動作するし、スマホでも動作するScriptがすでについております。
uGUIです
<img src="https://qiita-image-store.s3.amazonaws.com/0/46444/e0926644-1781-2414-0dbe-85bb1e6253f5.png" width="400px">

タッチパッドまであります。
<img src="https://qiita-image-store.s3.amazonaws.com/0/46444/64d7f9bc-e27f-0c6f-9b8b-388052ffb6d0.png" width="400px">

とりあえずクライアント側はこんな感じで作成しました。
Connection Widgetは任意にWifiをつなげたりできるものです。
クライアント側はまったくノーコーディングでした。らくちんらくちん！
<img src="https://qiita-image-store.s3.amazonaws.com/0/46444/e72c22c3-e809-5391-d088-2a82f036f5d4.png" width="400px">

各ボタンにアタッチされているScriptのControl Nameだけ変更する必要があります。
これがサーバーがわで設定する名前になります
<img src="https://qiita-image-store.s3.amazonaws.com/0/46444/e1c226d0-cdab-044f-cd2b-9a233f9cdbba.png" width="400px">

###サーバー側を作る
サーバーがわはClient側でもつくったEasyWiFiManagerをServerで作成します。
その後各ボタンの判定のScriptをどこかにアタッチします。
数が多い場合は独自に作成しても良さそうですが、めんどくさいので今回は用意されている
Cusstom Button Server Controller.csを使いました。
<img src="https://qiita-image-store.s3.amazonaws.com/0/46444/1caaa6fa-f859-67e2-3c97-43896fbe7e7f.png" width="400px">

こんな感じでClientでControl Nameに指定した値をControlに設定し、Notify Methodに呼び出すメソッド名を記載します。
SendMessageでその関数が呼ばれるので処理するScriptを同じ所にアタッチする必要があります。
あとは処理を書くだけ
ざっと書いたものですが

```csharp

using UnityEngine;
using System.Collections;
using EasyWiFi.Core;
using UnityEngine.UI;

public class GameManager : MonoBehaviour {

	public Text label;
	public Text resultLabel;
	public Image player1Img;
	public Image player2Img;
	public Sprite[] handTexture;

	private Hand player1Hand;
	private Hand player2Hand;

	private enum Hand
	{
		NONE = 0,
		GU,
		CHOKI,
		PA,
	}

	void Awake()
	{
		Init();
	}

	private void Init()
	{
		label.text = "ジャンケン";
		resultLabel.text = "";
		player1Hand = Hand.NONE;
		player2Hand = Hand.NONE;
	}
	
	private void Result()
	{
		//if(player1Hand == Hand.NONE || player2Hand == Hand.NONE) return;
		if(player1Hand == Hand.NONE)
		{
			resultLabel.text = "Player1を待っています・・・";
			return;
		}
		else if(player2Hand == Hand.NONE)
		{
			resultLabel.text = "Player2を待っています・・・";
			return;
		}

		switch(player1Hand)
		{
		case Hand.GU:
			player1Img.sprite = handTexture[0];
			break;
		case Hand.CHOKI:
			player1Img.sprite = handTexture[1];
			break;
		case Hand.PA:
			player1Img.sprite = handTexture[2];
			break;
		}

		switch(player2Hand)
		{
		case Hand.GU:
			player2Img.sprite = handTexture[0];
			break;
		case Hand.CHOKI:
			player2Img.sprite = handTexture[1];
			break;
		case Hand.PA:
			player2Img.sprite = handTexture[2];
			break;
		}
		label.text = "ポイ！";

		if(player1Hand == player2Hand)
		{
			resultLabel.text = "引き分け";
		}
		else if((int)player1Hand - (int)player2Hand == -1 || (int)player1Hand - (int)player2Hand == 2)
		{
			resultLabel.text = "Player1の勝ち";
		}
		else
		{
			resultLabel.text = "Player2の勝ち";
		}	
		Invoke ("Init", 3f);
	}


	public void GuClick(ButtonControllerType button)
	{
		bool isPressed = button.BUTTON_STATE_IS_PRESSED;
		
		if (isPressed && player1Hand == Hand.NONE)
		{
			player1Hand = Hand.GU;
			Result();
		}
	}

	public void ChokiClick(ButtonControllerType button)
	{
		bool isPressed = button.BUTTON_STATE_IS_PRESSED;
		
		if (isPressed && player1Hand == Hand.NONE)
		{
			player1Hand = Hand.CHOKI;
			Result();
		}
	}

	public void PaClick(ButtonControllerType button)
	{
		bool isPressed = button.BUTTON_STATE_IS_PRESSED;
		
		if (isPressed && player1Hand == Hand.NONE)
		{
			player1Hand = Hand.PA;
			Result();
		}
	}

	public void GuClick2(ButtonControllerType button)
	{
		bool isPressed = button.BUTTON_STATE_IS_PRESSED;
		
		if (isPressed && player2Hand == Hand.NONE)
		{
			player2Hand = Hand.GU;
			Result();
		}
	}
	
	public void ChokiClick2(ButtonControllerType button)
	{

		bool isPressed = button.BUTTON_STATE_IS_PRESSED;
		
		if (isPressed && player2Hand == Hand.NONE)
		{
			player2Hand = Hand.CHOKI;
			Result();
		}
	}
	
	public void PaClick2(ButtonControllerType button)
	{
		bool isPressed = button.BUTTON_STATE_IS_PRESSED;
		
		if (isPressed && player2Hand == Hand.NONE)
		{
			player2Hand = Hand.PA;
			Result();
		}
	}
}
```



##サーバー側の状態
クライアントをIpodTouch2台にいれて一人むなしく遊んでいる様子。
<img src="https://qiita-image-store.s3.amazonaws.com/0/46444/aa87e999-a8d0-b8aa-4903-cff8d5e3d6f5.gif" width="400px">