tetu式

ゲームと音楽・作曲の自己満足と悩みどころの多いプログラムのブログ。

UnityとfuelPHPでなんか送受信してみる。

今作っているゲームにネットランキング機能をつけたいのでネットアクセスの送受信の勉強です。


とりあえず今回のテスト内容。

1.Unity上でキーボードを何か押したらPHPにPOST送信する
2.PHPでPOST内容を元に返す値を決める
3.Unityで帰ってきた値を表示する




まずは1と3から。同じスクリプト内に書くので同時に。
C#で書いていきます。

using UnityEngine;
using System.Collections;

public class NetworkTest : MonoBehaviour {


	// Use this for initialization
	void Start () {
	}
	
	// Update is called once per frame
	void Update () {
	
		if(Input.GetKeyDown (KeyCode.K))
		{
			StartCoroutine("AccessTest");
		}
	}

	private IEnumerator AccessTest()
	{
		WWWForm wwwForm = new WWWForm ();
		wwwForm.AddField("form1" , "test1");
		WWW testAccess = new WWW("http://localhost/test/return" , wwwForm);
		yield return testAccess;
		Debug.Log ("result : " + testAccess.text);
	}
}

キーボードの「K」を押したら下のAccessTest()というコルーチンを実行するプログラムです。

WWWFormはWebページのテキストフォームそのものです。
WWWForm型の変数を用意したらAddFieldでPOST送信したいだけ追加します。
今回はform1フォームにtest1という値を入れて送信してます。

WWWはWebアクセス用の変数。
new WWWの中でPOST送信するページとフォームを引数にします。

その後のyield return testAccessですが、これがネットアクセスにおいて結構重要なところ。
これを飛ばすと送信した結果が返ってくる前にDebug.LogでtestAccessの変数を見ようとしてしまうのでWWW is not ready downloading yet(まだダウンロードしきってねぇよ!)って怒られます。

yield return ○○を入れておくと○○に結果が返ってくるまでそこで処理を中断する、という流れになります。
普通のプログラムの流れでは考えにくいのですがこれで通るから怖いです・・・

Debug.Logで入れているtestAccess.textがPHP上での結果を表示する部分です。


続いて2。fuelPHPサイドです。
fuelPHPの環境実装については過去記事を見てやってください。
http://stickpan.hatenablog.com/entry/2013/09/24/170045


まずはcontrollerフォルダにtest.phpを新規作成。
ファイルの中身は

<?php
use \Model\Test;

class Controller_Test extends Controller
{
	public function action_return()
	{
		$ret = Response::forge(Model_Test::Return_test());
		return $ret;
	}
}

とりあえずこれだけで。

せっかくなのでModelも使います。
use \Model\Test;でModel_Testを使えるようにします。
Unityからはtestコントローラーのaction_returnを見るようにしてるのでこんな書き方になる・・・はず。

続いてModelの実装。
Modelフォルダにもtest.phpを新規作成します。

<?php
class Model_Test extends \Model
{
	public static function Return_test()
	{
		$ret = "";
		 if(Input::post('form1') == "test1")
		 {
		 	$ret = "yes,test1";
		 }
		 else if(input::post("form1") == "test2")
		 {
		 	$ret = "yes,test2";
		 }
		 else
		 {
		 	$ret = "don't match...";
		 }
		 return $ret;
	}
}

中身は送られてきたPOSTのform1の値を見て返す文字を変えるというもの。
Unityからはform1に"test1"という値を入れているので$retには"yes,test1"が入ります。


別にWebコンテンツページを見せるようなものではないので今回はViewsには何も追加しません。
ちなみにhttp://localhost/test/returnをブラウザで見ると何もPOST送信してないのでdon't match...とだけ表示されます。



とりあえずこんな感じです。
実際にランキングの送受信をする事になったらデータベースとかSSLとか絡んできそうです。