- 第1回:レンタルサーバーからデータベース作成
- 第2回:PHPでデータベースを呼び出す
- 第3回:UnityからPHPを介して、データベースを表示する
前々回(第1回)は、レンタルサーバー「ConoHa Wing」でデータベースを作成し、「phpMyAdmin」を使って、テーブル(表)を作成しました。
前回(第2回)は、FTPソフトを使用して、PHPコードをサーバーにアップロードして、データベースにアクセスできるようにしました。
本記事では、PHPのURLをUnityから読み込んでUnity上にサーバーにあるデータベースを出力します。
- UnityとPHPを連携したい。
- Unityでデータベースを連携したい。
- UnityでURLを認識させたい。
Unityオンラインゲーム化
Unityの開発は、何も開発をしない状態ではオフラインゲームの開発となります。
しかし、昨今のゲームは、匿名のプレイヤーと対戦、顔見知りの人とインターネットをつないでゲームをすることが主流です。
スマホゲーム(ソシャゲ)であれば、セーブデータは企業が運営・保有するサーバー上に何千万ものユーザーの情報が管理させています。
このように、ノベルゲームのようなインターネット接続が不要なジャンル以外、現在のゲームはオンラインが当たり前です。
したがって、オンラインでのゲーム開発する技術が必要不可欠です。
本シリーズ「UnityとPHP連携」での内容を完璧に理解したとしても巷で出回っているオンラインゲームを再現することは不可能です。
しかし、オンライン化のはじめの一歩としてPHPのコードを介して、サーバー上のデータベースをUnityで表示させます。
Unity学習ができる教本
タイトル | 対象 | 特徴 |
Unityの教科書 2023完全対応版 | 入門・初心者 | プログラミング未経験でも、ゲーム制作したい人 |
マンガでわかる Unityゲーム開発入門 | 入門・初心者 | Unityを挫折したけど、もう一度挑戦したい人 2Dゲームの作成をマンガで丁寧に解説 |
作って学べる Unity本格入門 | 中級者~ | RPG、特に3Dゲームを作りながら学習したい人 |
Unity ソーシャルゲーム開発ガイド | 中・上級者 | ガチャ・ログインボーナスなどのソシャゲの機能を開発したい人 |
テーブル(表)の内容をすべて表示
Debugするときに、すべてを出す方法と、一つずつ区切って出力する方法があります。
この項では、表の内容をまとめて出力するソースコードを解説します。
ソースコード1
// データベースの全て
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
public class WebAccess : MonoBehaviour
{
// データベースの情報を取得するためのURL
static string URL_SELECT = "https://www.alicia-ing.com/test/test.php";
// コルーチンの開始
IEnumerator Start()
{
// UnityWebRequestを作成してURL_SELECTのページにアクセス
UnityWebRequest request = UnityWebRequest.Get(URL_SELECT);
yield return request.SendWebRequest(); // リクエストを送信し、レスポンスを待つ
if (request.result == UnityWebRequest.Result.Success) // レスポンスの結果をチェック
{
// レスポンスデータを取得
string data = request.downloadHandler.text;
// HTMLエンコードされた文字列をデコード
string decodedData = System.Web.HttpUtility.HtmlDecode(data);
// 改行タグを実際の改行文字に変換
string NewData = decodedData.Replace("<br>", "\n");
Debug.Log(NewData);
}
else
{
Debug.LogError("WebAPI Error: " + request.error);
}
}
}
思い通りのゲームが作れない
Unityでゲーム開発しているけど完成しない。
技術的な壁や知識不足が原因で、思い描いたゲームを実現するのは難しいです。
しかし、Udemyは動画で実践的なゲーム開発を解説していて、
購入した講座は再生・停止・スキップなどが可能なオンデマンド形式なので、
専門的な内容を自分のペースで学習できます。
Unityの機能を網羅したいや作りたいゲームがある人はUdemy学習を取り入れましょう。
数多くある講座の中から特におすすめな講座を3つ紹介します。
ビックセール開催中(10月11日まで)
対象のコースが1500円から(最大95%OFF)
Unityのはじめの一歩としておすすめ。開発例に物理挙動やアニメーションを使用しているので、今後の開発が円滑になる。
トランプを題材にした講座。カードゲームやボードゲーム開発に応用可能
UnityエンジンのインストールやC#の文法に加えて、App StoreとGoogle Playにゲームをリリース方法を解説。
容量不足を解消
Unityのプロジェクトは1.5GB~3.5GBと大きく、クリエイターはHDD・SSD増設が必要です。
価格 | 耐久性 | 静音性 | 読み書き | サイズ | |
HDD | 低 | 低 | 低 | 遅 | 大 |
SSD | 高 | 高 | 高 | 速 | 小 |
注目点は、HDDは安価だけど壊れやすい。SSDは丈夫だけど高価。
したがって、データの持ち運びをしない場合はHDD、持ち運びする場合はSSDがおすすめです。
- 据え置きHDD
- 外付けSDD
- 内蔵SSD
ぜひ、あなたのクリエイティブな作業環境に兼ね備えたストレージをお役立てください。
解説1
初めに名前空間を指定します。
「using UnityEngine.Networking;」は、Unityエンジン内でネットワーク関連の機能を使用するために必要な名前空間のインポートです。
この名前空間には、UnityWebRequestのようなさまざまなネットワーク関連のクラスや機能が含まれていて、ウェブリクエストの送信、レスポンスを受け取ることができます。
要するに、ウェブページからデータを取得したり、送信したりするために使用されます。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
次に、スクリプト名「WebAccess」は、MonoBehaviourクラスを継承します。
これによりスクリプトをUnityイベントと連動して動作させて、ゲームオブジェクトにアタッチして利用できるようにします。
静的なstring変数「URL_SELECT」には、 データベースから情報を取得するためのURLを指定しています。
// データベースの情報を取得するためのURL
static string URL_SELECT = "https://www.alicia-ing.com/test/test.php";
start()メソッドでは、voidを使われたことがある方は多いでしょうが、IEnumeratorはあまり馴染みがないかと思います。
関数をストップ・再開などしたい場合は、コルーチンをするために、IEnumeratorを使い、これが戻り値になります。
一方で、voidは、何らかの処理を行う関数が戻り値を返さないことを示すために使用される要素です。
UnityWebRequestクラスを使用して、指定されたURLに対してGETリクエストを送信しています。
yield return request.SendWebRequest()で リクエストを送信し、レスポンスを待つためにコルーチンの実行を一時停止しています。
レスポンスが成功した場合は、取得したデータを変数「data」 に格納し、HTMLエンコードをデコードして実際のテキストに戻します。また、改行タグ「<br>」を実際の改行文字に変換し、結果を変数 「NewData」 に格納しています。これにより、取得したデータが改行されて表示されます。
一方で、もしリクエストが成功しなかった場合、エラーメッセージを表示します。
// コルーチンの開始
IEnumerator Start()
{
// UnityWebRequestを作成してURL_SELECTのページにアクセス
UnityWebRequest request = UnityWebRequest.Get(URL_SELECT);
// リクエストを送信し、レスポンスを待つ
yield return request.SendWebRequest();
// レスポンスの結果をチェック
if (request.result == UnityWebRequest.Result.Success)
{
// レスポンスデータを取得
string data = request.downloadHandler.text;
// HTMLエンコードされた文字列をデコード
string decodedData = System.Web.HttpUtility.HtmlDecode(data);
// 改行タグを実際の改行文字に変換
string NewData = decodedData.Replace("<br>", "\n");
// ログに表示
Debug.Log(NewData);
}
else
{
// エラーが発生した場合の処理
Debug.LogError("WebAPI Error: " + request.error);
}
}
実演1
ここまで、サーバー上のテーブルをUnityに表示できるように解説しました。
完成したスクリプトをHierarchyウィンドウにアタッチしてください。
対象のスクリプトがInspectorウィンドウにあれば、正しくアタッチできています。
その後、再生ボタンを押すと、consoleウィンドウに結果が出力されます。
テーブル(表)の内容を列ごとに表示
先ほどのソースコードの実行は、行ごとで改行するものの1つにまとめて出力されてしまいます。
この項では、Debugするときに、一つずつ区切って出力するようにコードを修正します。
ソースコード2
//行ごとのデータベース
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
public class WebAccess : MonoBehaviour
{
static string URL_SELECT = "https://www.alicia-ing.com/test/test.php";
IEnumerator Start()
{
UnityWebRequest request = UnityWebRequest.Get(URL_SELECT);
yield return request.SendWebRequest();
if (request.result == UnityWebRequest.Result.Success)
{
string data = request.downloadHandler.text;
Debug.Log(data);
// 改行文字 "<br>" を区切りとしてデータを分割
string[] lines = data.Split(new string[] { "<br>" }, System.StringSplitOptions.None);
// 分割したデータを処理
for (int i = 0; i < lines.Length - 1; i++) // 最後の要素(空の文字列)は除外
{
Debug.Log("Line: " + lines[i]);
}
// 取得したデータをUnityのUI要素に表示したり、ゲームオブジェクトに代入することができます
}
else
{
Debug.LogError("WebAPI Error: " + request.error);
}
}
}
解説2
リクエストの結果が成功の場合、取得したデータをdata変数に格納し、デバッグログに表示します。
取得したデータを改行文字 “<br>” を区切りとして配列に分割しています。「System.StringSplitOptions.None」は空の要素を削除せずに配列に含めるためのオプションです。
for文は、分割されたデータを順番に処理してデバッグログに表示します。
最後の要素は空の文字列なので、lines.Length – 1で処理が行われます。
if (request.result == UnityWebRequest.Result.Success)
{
string data = request.downloadHandler.text;
Debug.Log(data);
// 改行文字 "<br>" を区切りとしてデータを分割
string[] lines = data.Split(new string[] { "<br>" }, System.StringSplitOptions.None);
// 分割したデータを処理
for (int i = 0; i < lines.Length - 1; i++) // 最後の要素(空の文字列)は除外
{
Debug.Log("Line: " + lines[i]);
}
// 取得したデータをUnityのUI要素に表示したり、ゲームオブジェクトに代入することができます
}
else
{
Debug.LogError("WebAPI Error: " + request.error);
}
実演2
前回のスクリプトをアタッチしたままでしたら、そのまま実行してください。
1つ目は、何も手を加えていない変数dataのデバッグログの表示です。
移行は、行ごとのデバッグログで<br>がhtml表記ではなく、Unityでもしっかりと改行されていることが分かるかと思います。
まとめ
最近のゲームはインターネットを介した通信を使ったオンラインが主流です。
また、ゲームのセーブデータも運営する企業がサーバー上に保有するなど、オフラインの環境は絶滅しつつあります。
幅広いゲーム作りができるUnityは、「using UnityEngine.Networking;」という名前空間を使用することで、サーバーにアクセスすることができます。
通信には、IEnumeratorをstartメソッドの前に指定して、コルーチンをすることができます。