Unityの通信

クロ 久しぶりに真面目回です
今回は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に近い身軽さが有りますね
本当は暗号化とか難読化しないとチートとかされるので
もうちょっと手をいれる必要が有りますけどね……
妖夢

気軽にコメントをどうぞ!

この記事に関すること冬月に聞きたいこと等、小さいことでもコメントしていただける嬉しいです。
冬月に直接連絡したい方は下のお問合せフォームをお使いください。(メール送信されます)

内容に問題なければ、下記の「コメントを送信する」ボタンを押してください。
※メールアドレスは公開されることは有りません。


reCaptcha の認証期間が終了しました。ページを再読み込みしてください。

ゲーム製作の関連記事