【Unity】データベースの情報をPHPを仲介して画面に表示

当サイトで紹介する商品・サービス等の外部リンクは、アフィリエイト広告を含む場合があります。
スポンサーリンク
関連記事
  • 第1回:レンタルサーバーからデータベース作成
  • 第2回:PHPでデータベースを呼び出す
  • 第3回:UnityからPHPを介して、データベースを表示する

前々回(第1回)は、レンタルサーバー「ConoHa Wing」でデータベースを作成し、「phpMyAdmin」を使って、テーブル(表)を作成しました。

前回(第2回)は、FTPソフトを使用して、PHPコードをサーバーにアップロードして、データベースにアクセスできるようにしました。

本記事では、PHPのURLをUnityから読み込んでUnity上にサーバーにあるデータベースを出力します。

本記事は次の人におすすめ
  • UnityとPHPを連携したい。
  • Unityでデータベースを連携したい。
  • UnityでURLを認識させたい。
DB出力に使用するレンタルサーバー
  • 当サイトで使用中のサーバー
  • WordPressを始めやすい
  • 独自ドメインが二つ永久無料
  • 利用者が多く情報が多い
  • 月額1000円以下の破格の価格
  • ドメイン契約・更新費用が不要
スポンサーリンク

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は動画で実践的なゲーム開発を解説していて、
購入した講座は再生・停止・スキップなどが可能なオンデマンド形式なので、
専門的な内容を自分のペースで学習できます。

Udemyの特徴
  • プロのエンジニアによる講習が受けられる
  • 自分のペースで学習を進められる
  • オンデマンド形式だから何度でも視聴可能
  • 不満足なコースは視聴していても返金可能返金ポリシー

Unityの機能を網羅したいや作りたいゲームがある人はUdemy学習を取り入れましょう。
数多くある講座の中から特におすすめな講座を3つ紹介します。

ビックセール開催中(10月11日まで)
対象のコースが1500円から(最大95%OFF)

多彩な講座から自分に合った講座を探そう!

最大94%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";
IEnumeratorとvoid

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メソッドの前に指定して、コルーチンをすることができます。