まず、サーバーサイド。
ubuntu18.04TSL、mysql、php、apache2(Nginx)、MYSQLでDBとTBは作っておく
サーバー側PHP:解説
clientからappcodeがPOSTされて、user_agentがandroidでacountとpasswordがPOSTされたら処理をtryする
if($_POST['appcode']==$appcode && stripos($user_agent,'Android') !== false){ //終了コードが送られてこない場合は端末のゲームシステムに依存し、サーバの処理を終了する //初めてのログインならばfalseを返して端末の初期値を端末で生成し、送り、アカウントを登録してDBを生成 if($_POST['acount'] && $_POST['password']){ try{ //Sql connect $db = new PDO($host,$user,$pass); //view databases $sql = 'SHOW DATABASES'; $results = $db->query($sql); //array loop while ($result = $results->fetch(PDO::FETCH_NUM)){ //Does the database exist(DBがあった場合) if($result[0]==$db_name){ $sql = 'use '.$db_name;//DBを選択 if($db->query($sql)){ $sql = "SELECT * FROM ".$tb_name; $sql=$db->query($sql); //rowを$sqlから取り出して送られたacountとpasswordが照合するものがあるか調べる foreach($sql as $row){ if($row['acount']==$_POST['acount'] && $row['password']==$_POST['password']){ if($_POST['end_code']){ //end_codeが送られてきた場合はステータスをUPDATEしてserverでの冒険を始める $sql = 'UPDATE '.$tb_name.' set time=:time where id=:id'; $sql = $db->prepare($sql); $param = array(':time'=>time(),':id'=>$row['id']); $sql->execute($param); session_destroy();//セッションをクリアする //冒険の関数を作っていれる echo '最新の情報を更新しパーティは冒険に出ました'; }else{ //endでない場合で一回目ならはserverのデータをappへ送る if(!$_SESSION['count']){//countが0なら $row = array( 'id' => $row['id'], 'acount' => $row['acount'], 'password' => $row['password'], 'time' => $row['time'] ); //jsonとして出力 header('Content-type: application/json'); echo json_encode($row);//jsonをclientに出力 $_SESSION['count']++;//インクリメント echo '本日最初のログインです更新情報を送ります'; }else{//2回目以降はDBに書き込む $sql = 'UPDATE '.$tb_name.' set time=:time where id=:id'; $sql = $db->prepare($sql); $param = array(':time'=>time(),':id'=>$row['id']); $sql->execute($param); echo $_SESSION['count'].'回目の更新です'; $_SESSION['count']++;//インクリメント } } $sql = $db->prepare($sql); $exists=true;//存在している continue;//あったら終わりで次の処理へ } } //アカウントがない場合は作成する if(!$exists){ //testなので3項目 $sql = 'INSERT INTO '.$tb_name.' (acount,password,time) VALUES (:acount,:password,:time)'; $sql = $db->prepare($sql); $param = array(':acount'=>$_POST['acount'],':password'=>$_POST['password'],':time'=>time()); $sql->execute($param); echo 'アカウントを作成しました'; } } } } //connect close $db = null; }catch(PDOException $e){ echo "DB connect failure..." . PHP_EOL; echo $e->getMessage(); exit; } } //終了コードが送られてきた場合:勝手に冒険が始まりログインするまでサーバのゲームシステムに依存 //端末のGPSの移動距離を元にサーバMapを移動してイベントを発生させる }
clientの処理
VaRestでPOSTします。POSTしたらイベントが発生するようにします。
POSTするのはアカウントとパスワード、時間、そしてアプリの終了をPOSTするものも用意しておきます。
appcodeもPOSTしてサーバのアドレス(ここではローカル)を指定します
POSTが行われたらイベントが発生して戻り値を受け取ります。戻り値はPHPで作ったjsonです
$row = array( 'id' => $row['id'], 'acount' => $row['acount'], 'password' => $row['password'], 'time' => $row['time'] ); //jsonとして出力 header('Content-type: application/json'); echo json_encode($row);//jsonをclientに出力
受け取ったjsonは配列なのでindex順で変数に格納します。
tableは以下のようになっています。
今回ログインして得たのはidが4のrowです。
配列は受け取れています。変数に格納されました。
実際のゲームはパラメータも多くこんな単純ではないですが基本これであとは応用と工数です。
UE4のVaRestプラグインの設定はこちら
①初めて起動したらCliant内でアカウントを自動生成してアプリを終了させたら終了フラグを立てて、サーバーに終了コードを送ってアカウントがなければDBに登録してデーターを保存してClientの処理を終了させて、サーバーの処理をスタートさせるのがいいかな。
で、またClientが起動して終了フラグが立っていたらサーバーにログインしにいってデータをGETする。フラグが立っていなかったらサーバーにはアクセスしにいかないでClientに保存しているデータを読んで始めるのがいいと思う。(異常終了したとき用)
サーバが貧弱(なんといってもMacBook2007のUbuntu18.04LTSなので)回線も貧弱(縛りなしWIFI)なのでなるだけ負荷がかからないようにしなければならないなあ。