5年後起業することを夢見る、初心者ゲームプログラマーの神楽坂 冬月による同人と気ままな日記ブログです。

スポンサーサイト

--.--.--
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Unityの通信

2016.03.27
クロ 久しぶりに真面目回です
今回はUnityでWeb通信を行う
事をやってみました


難しそうに見えたけど
さほど難しくなかったわ
セキュリティとか考えるともうちょっと手を加える必要があるんだけどね
霊夢


魔理沙 とはいえ、これを使えば
PCとスマホで同じセーブデータを使ったゲームが出来る
といったちょっとかっこいい事ができるぞ


まあ、
WebサーバーとDBサーバーを運用る必要がありますが……
ということで、作り方は「続きを読む」をどうぞ
妖夢


クロ ってことで、Unityとネットワークを接続する方法はいくつかあるのですが
個人で開発する上のコストを考えると
Webで接続する方法を選びました


Web接続も
Unity(C#)⇔PHP⇔DBと
使える言語が増えるのが難点だけどね
霊夢


魔理沙 改修作業をする場合も
複数の言語を触る必要があるから
手間がかかってしまうしな


とはいえ、基本のAPIで実装可能ですし
マルチプラットフォームな環境を作る場合は
使いやすいんじゃないでしょうか?
妖夢


using UnityEngine;
using System.Text;
using System.Collections;
using SimpleJSON;

/// 
/// 受信したデータの構造体
/// 
public class wwwLoadData
{
	///  ユーザーID 
	public int mUserID = 0;
	///  ユーザー名 
	public string mName = "";
	///  ユーザーパスワード 
	public string mPass = "";

	//ゲームデータ系
	///  ゲームデータ1 
	public string mGameData1 = "";
	///  ゲームデータ2 
	public string mGameData2 = "";
	///  ゲームデータ3 
	public string mGameData3 = "";

	//エラー系
	///  エラーテキスト 
	public string mErrorText = "";
}


/// 
/// PHPへの通信用の処理
/// 
public class WwwLoginScript : MonoBehaviour 
{
	///  接続するPHPのURL先 
	private string mURL = "http://ここに接続したいPHPのURL先を入れる.php";

	///  通信用の変数 
	private WWWForm mLoginWWWForm;
	///  Webにアクセスするためのクラス 
	private WWW mResponseWWW;

	//ログイン情報
	///  ユーザー名 
	private string mUserName = "ユーザー登録時のログイン名";
	///  ユーザーパスワード 
	private string mUserPass = "ユーザー登録時のパスワード";
	///  ロードが完了したかどうか 
	private bool mIsLoadData = false;

	//初期化
	void Start ()
	{
		mIsLoadData = false;

		mLoginWWWForm = new WWWForm();
		mLoginWWWForm.AddField("name", mUserName);  //ユーザー名
		mLoginWWWForm.AddField("pass", mUserPass);  //ユーザーパスワード

		//レスポンス
		mResponseWWW = new WWW(mURL, mLoginWWWForm);
		
    }
	
	//更新
	void Update () 
	{
		GetResponseData();
    }


	private wwwLoadData GetResponseData()
	{

		//すでに読み込みが終了した
		if (mIsLoadData == true)
		{
			return null;
		}
		

		wwwLoadData loadData = null;

		if (mResponseWWW.isDone == true)
		{
			mIsLoadData = true;
			loadData = new wwwLoadData();

			if (mResponseWWW.error == null)
			{
				if (mResponseWWW.text.Length > 0)
				{
					//読み込み成功
					Debug.Log(mResponseWWW.text);

					/*==========================================================
					JSONで出力されるデータの形
					============================================================
					{
					  "UserID": 1,
					  "Name": "testname",
					  "Pass": "testpass",
					  "Data1": "hogehoge",
					  "Data2": "hagehage",
					  "Data3": "hogehage"
					}
					*/
					//受信したデータをJSONパースする
					JSONNode json = JSON.Parse(mResponseWWW.text);

					loadData.mUserID	= json["UserID"].AsInt; //ユーザーID(int
					loadData.mName		= json["Name"];			//ユーザー名(string
					loadData.mPass		= json["Pass"];			//ユーザーパスワード(string
					loadData.mGameData1 = json["Data1"];		//セーブデータ1(string
					loadData.mGameData2 = json["Data2"];		//セーブデータ2(string
					loadData.mGameData3 = json["Data3"];		//セーブデータ3(string
				}
				else
				{
					//データがない
					loadData.mErrorText = "NoData";
				}

				return loadData;
			}
			else
			{
				//エラーが発生した
				loadData.mErrorText = mResponseWWW.error;

				return loadData;
			}
        }

		//読み込み失敗
		return loadData;
	}

}


クロ Unity側のソースコード全文です
1部を除いてこのコードをコピペすれば
PHPへの通信は可能です


大丈夫だと思うけど各変数の値は各自のデータに合わせてね
ここだとPHPのURL先、ユーザー名、ユーザーパスワードの3つです
ユーザー名とパスワードはデータ上のものだから必要ないときもあるかもね
霊夢


魔理沙 で、接続を試すときにDBサーバーが必要なんだけど
ローカル環境の場合、Xamppを入れるなどしてサーバー環境を作ってくれな
VPNとかサーバー構築が出来る人は各々で用意してね


【LoginDataBase】ログインデータベース構造
UserID Name Pass
1 なまえ1 パスワード1
2 なまえ2 パスワード3


【TestGameDataBase】ユーザーデータデータベース構造
UserID savedata1 savedata2 savedata3
1 ゲームデータ1 ゲームデータ2 ゲームデータ3
2 ゲームデータ1 ゲームデータ2 ゲームデータ3


そして、データベースの構造は上記の様な形にしています
導入テストのため、必要最低限ですが、ここから拡張していけば良いかと思います
PhpMyAdminや各々のツールで作成してください
妖夢


クロ PHPからの返信ですが
基本文字列しか返信できないため
アセットを使って解決しています


using SimpleJSON;

それが、SimpleJSONというアセットになるわ
入力したString型のJSONデータを各々の変数へと変換してくれるわ
使い方もソースコードを見ればだいたいわかると思うわ
霊夢


魔理沙 文字列で帰ってくるので
データの制限(文字列制限)があるけど
複数のデータを送るにはこうしたほうが都合が良いんだ


でも、今回はJSONを採用しましたが
CSVとかいろいろあるのでそこは
各自の都合のよう方法を使ってください
妖夢


 'DBへの接続するためのユーザー名',
	      'PWD' => 'DBへ接続するためのパスワード',
	      'Database' => 'TestDataBase'	//ログインDB
	);
	
	//SQL接続
	$conn = sqlsrv_connect( $serverName, $connectionInfo );
	
	//接続できなかった
	if( $conn === false )
	{
		echo "{Error:Cound not connect}";
		die( print_r( sqlsrv_errors(), true)); 
	}
	
	//ユーザーDBへの接続
	$user_tsql = 'SELECT * FROM dbo.LoginDataBase WHERE CAST(Name as nvarchar(20))=\''.$Name.'\' AND CAST(Pass as nvarchar(20))=\''.$Pass.'\'';
	$user_stmt = sqlsrv_query( $conn, $user_tsql );
	
	if( !$user_stmt ) 
	{
		die( print_r( sqlsrv_errors(), true));
	}
	
	//取得したデータの表示
	$user_ID = 0;
	while($user_data_row = sqlsrv_fetch_array( $user_stmt ))
	{
		//ユーザーIDの取得
		$user_ID = $user_data_row['UserID'];
	}
	
	//ユーザーIDの取得に失敗している場合処理を終了する
	if($user_ID == 0)
	{
		echo "{Error:no database}";
		return;
	}
	
	//終了処理
	sqlsrv_free_stmt($user_stmt);
	
	//==============================
	//ユーザーのセーブデータの取得
	//==============================
	//
	//
	//------------------------------
	
	//ユーザーDBへの接続
	$data_tsql = 'SELECT * FROM dbo.TestGameDataBase WHERE CAST(UserID as bigint)=\''.$user_ID.'\'';
	$data_stmt = sqlsrv_query( $conn, $data_tsql );
	
	if( !$data_stmt ) 
	{
		die( print_r( sqlsrv_errors(), true));
	}
	
	//取得したデータの表示
	while($game_data_row = sqlsrv_fetch_array( $data_stmt ))
	{
		//各データの表示(デバッグ
		echo "{";
		echo "\"UserID\":".$game_data_row['UserID'].",";
		echo "\"Name\":\"".$Name."\",";
		echo "\"Pass\":\"".$Pass."\",";
		echo "\"Data1\":\"".$game_data_row['savedata1']."\",";
		echo "\"Data2\":\"".$game_data_row['savedata2']."\",";
		echo "\"Data3\":\"".$game_data_row['savedata3']."\"";
		echo "}";
	}
	
	//終了処理
	sqlsrv_free_stmt($data_stmt);
	sqlsrv_close($conn);
?>


クロ Unityから送信したPOST送信を受け取るPHPになります
受け取った後DBと通信を行い
その結果をechoでJSON形式として出力します


ここもJSON型に書き出す方法はたくさんあるんだろうけどね
めんどくさいので直書きしてるわ
冬月はバックエンドエンジニアじゃないしね
霊夢


魔理沙 それはさておき、このPHPをWebサーバーに置けば
Unity⇔PHP⇔DBへの
通信が出来るぞ


この辺りはFlashに近い身軽さが有りますね
本当は暗号化とか難読化しないとチートとかされるので
もうちょっと手をいれる必要が有りますけどね……
妖夢


関連記事

テーマ : ゲーム製作 関連

ジャンル : ゲーム

タグ : Unity
コメント
コメントの投稿


管理者にだけ表示を許可する

FC2カウンター
プロフィール

神楽坂 冬月(かぐらざか ふゆつき)

Author:神楽坂 冬月(かぐらざか ふゆつき)
【イベント情報】

2015年08月14日(1日目)
コミックマーケット88に参加します!
【金曜日 東地区 "ソ" ブロック 43a】
です!
東方紅魔烏【ウォーシミュレーション】
妖夢龍剣伝(体験版)【アクション】
の2点を出店予定です
よろしくお願い致します!

-----------------------------------------
2014年12月29日
コミックマーケット87に参加します!
【月曜日 東地区 "ハ" ブロック 50a】
参加してくださった型、ありがとうございます&
お疲れ様でした!

-----------------------------------------

めざせ!業界有名人!ということで新米ゲームプログラマーとして活動しています。
次の段階へ移行!
5年後起業という目標に目指してがんばりますぞ!

バナー2
http://studio-cross.com/
HPも作ってますので、どうぞよろしくお願いします

pixiv
月別アーカイブ
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。