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