Unity と Oracle バックエンドを使ってモバイル マルチプレイヤー ゲームを数分で開発 (2023/04/26)

Unity と Oracle バックエンドを使ってモバイル マルチプレイヤー ゲームを数分で開発 (2023/04/26)

https://blogs.oracle.com/developers/post/develop-a-mobile-multiplayer-game-in-minutes-with-unity-and-oracle-backend-for

投稿者: Paul Parkinson | Architect and Developer Evangelist, Microservices and Converged Database


ここでは、いくつかの簡単なステップで、UnityとOracleのBackend for Parseを使用してモバイルマルチプレイヤーゲームを開発します。


ゲームの開発プロセスの対応するデモンストレーションと説明は、次のビデオでも表示できます。





Unity and Parse Platformの概要...Unityは、Unity Technologiesが開発したクロスプラットフォームのゲームエンジンで、Mac OS XゲームエンジンとしてApple Worldwide Developers Conferenceで2005年6月に初めて発表およびリリースされました。エンジンが徐々に拡張されて、さまざまなデスクトップ、モバイル、コンソール、およびバーチャルリアリティプラットフォームをサポートするようになりました。Parse Platformは、2016年にFacebook/Metaによってオープンソースのモバイル開発者向けのバックエンドで、クラウドへのデータの格納、アイデンティティログインの管理、プッシュ通知の処理、クラウドでのカスタムコードの実行に役立ちます。Oracleは、Parse APIの使用中にOracleコンバージドデータベースのすべての機能を利用するアダプタを作成しました。


最初のステップには、Parse プラットフォーム用のOracleバックエンドのインストールが含まれます。これはOracle Cloud Marketplaceにあります。インストール後、モバイルアプリがアクセスするために使用するParse サーバーURIが設定されます。バックエンド/プラットフォームは、使用するParse サーバーおよびOracle Database、およびParse サーバーが実行するKubernetesクラスタを自動的にプロビジョニングおよび構成するため、非常に便利です。このため、スケーリング、マイクロサービス、可観測性などの機能も提供されます。これに関するブログや情報はこちらからご覧いただけます。




2番目のステップでは、Unityのインストールとプロジェクトの作成を行います。ここからUnity Hubをインストールし、「新規プロジェクト」ボタンをクリックして新規プロジェクトを作成できます。「2Dモバイル(コア)」プロジェクトテンプレートを使用しましたが、プロジェクトテンプレートはいくつでも使用でき、Unityのバージョン2021.2.21f1を使用しました。ただし、ゲームに使用されるUnityリソースと同様に、解析ライブラリは多くのバージョンで互換性があるため、Unityの少なくとも2018から現在のバージョンまでの任意の数のバージョンが動作します。




次に、githubリポジトリからゲームを含むUnityパッケージをクローニングまたはダウンロードします: https://github.com/paulparkinson/unity-parse-multiplayer-game


このリポジトリの内容をUnityプロジェクトのAssetsディレクトリにドラッグ・アンド・ドロップして、「Looking close at the Unity project...」セクションに進むことができます。UnityプロジェクトへのParse .NET SDKの追加方法については、次の項を参照してください。


Unityプロジェクトへの解析.NET SDKの追加には、非常に簡単な2つのステップがあります。


まず、UnityプロジェクトのAssetsディレクトリにlink.xmlファイルを追加します。これにより、Unityは、Parse ライブラリをモバイルアプリケーション・ビルドに保持/含めるように指示します。link.xmlファイルは、前述のリポジトリに含まれ、次のようになります。


<linker>
  <assembly fullname="UnityEngine">
    <type fullname="UnityEngine.iOS.NotificationServices" preserve="all"/>
    <type fullname="UnityEngine.iOS.RemoteNotification" preserve="all"/>
    <type fullname="UnityEngine.AndroidJavaClass" preserve="all"/>
    <type fullname="UnityEngine.AndroidJavaObject" preserve="all"/>
  </assembly>

  <assembly fullname="Parse.Unity">
    <namespace fullname="Parse" preserve="all"/>
    <namespace fullname="Parse.Internal" preserve="all"/>
  </assembly>
</linker>


次に、Parse ライブラリ自体を追加します。これは、次の2つの方法のいずれかで実行できます。


1. https://www.nuget.org/packages/parse/absoluteLatest.からlibをダウンロードする  単純にパッケージをダウンロードして抽出し、parse.DLLファイルを取得してUnityプロジェクトのAssetsディレクトリの下の任意の場所にドロップします。ただし、Unityの規則はプラグイン・ディレクトリを使用することです。つまり、Assets/Plugins/Parse/parse.DLLに配置します。これは最新の2.0.0-develop-1 DLLバージョンであり、便宜上、githubリポジトリにも同じバージョンが含まれています。

OR

2. ここからsrcコードをクローニングまたはダウンロードします: https://github.com/parse-community/Parse-SDK-dotNET (これはライブラリの最新/マスター・ブランチ・バージョンでも可能)。UnityプロジェクトのAssetsディレクトリの下の任意の場所にドロップします。ここでも、このディレクトリは機能性ほど重要ではありませんが、論理的な場所が推奨されます。この方法を使用すると、Parse ライブラリがUnityプロジェクトの一部として構築されます。これは、Parseがオープンソースであることの利点の1つであり、コードを検索して理解したり、非常に歓迎されたコミュニティへの貢献をすることさえできます。


https://docs.parseplatform.org/unity/guide/#getting-startedのドキュメントには、Unityからの解析の使用に役立つ情報があります。ただし、Parseバージョン1.7.0とUnityの古いバージョンに基づきます。前述のとおり、最新の2.0.0-develop-1/マスター・バージョンを使用しています。ただし、API名の一部が変更されたなど、いずれも使用できます。




Unityプロジェクトを詳しく見る...



RockPaperScissorsParseGameプロジェクトのScenesディレクトリでParsePaperScissorRockGameをダブルクリックします。


左上には「階層」ペインが表示され、ボタン、画像、サウンドなど、ゲームの様々なUnity GameObjectsが表示されます。


右側には、「インスペクタ」ペインに、選択したGameObjectに関する情報と設定が表示されます。RPSGameObjectの場合、ParseRockPaperScissorsGame C#スクリプトがアタッチされていることがわかります。ゲームのすべてのコードはこの1つのスクリプトにあります。Unityでは、スクリプト内の変数およびアクションをGameObjectsに視覚的にマップできます。たとえば、コードをトリガーするボタン、ボタンのプッシュ時に表示されるイメージ、ウィナーの発表時に再生されるサウンド、テキストなど。Parse サーバーの接続情報は、ここに示すように設定することもできます(ApplicationID、ServerURIなど)。プレイヤ名はアプリ自体に組み込まれていますが、相手の選択やスローするオブジェクトと同じように、ゲームのプレイボード・インターフェイスのテキストフィールドから動的に取得するのも簡単です。


中央には、シーンを視覚的に設計するための「シーン」パネルと、ゲームを再生およびテストできる「ゲーム」ウィンドウがあります。



ParseRockPaperScissorsGame.csのUnityスクリプトおよびParse コードの詳細を確認しています...


ParseRockPaperScissorsGameは、すべてのUnityスクリプトが導出されるベース・クラスであるMonoBehaviourです。これには、多くの主要なライフサイクルメソッドが含まれています。ゲームで最も一般的な2つであるStartとUpdateを実装しています。


Startメソッドは、スクリプト(またはアタッチ先のGameObjectの一部として本質的に)がアクティブ化されるときに1回のみコールされます。Startメソッドでは、使用する準備が整うように、Parse サーバーおよびParseClientのpublicize()への接続を作成します。次に、相手のドロップダウン・ボックスに、RockPaperScissorsPlayersクラスに対する問合せの結果を移入します(Parse クラスは、基本的に表またはドキュメントです)。Parse APIに関する優れた点の1つは、ここでのParseQuery APIコールでわかる簡潔さです。


    ParseQuery<ParseObject> query = new ParseQuery<ParseObject>(client, ROCKPAPERSCISSORSPLAYERS_CLASS);
   var results = await query.FindAsync();
   foreach (ParseObject obj in results)
   {
          opponentsDropDownList.Add(obj.Get<string>(PLAYERNAME));


Parse ダッシュボードには使いやすいGUIがあり、このデータをRockPaperScissorsPlayersや、ゲーム内の対戦相手による移動の格納に使用されるRockPaperScissorsクラスから確認できます。



前述のとおり、前述のように、Unityで「rock」、「paper」および「scissors」に追加されたボタンは、クリックしたときにスクリプト内の対応するメソッドをトリガーします。ここでは、Rock()メソッドについて説明します。


public void Rock()
{
 Debug.Log("player throws rock");
 rock.SetActive(true);
 insertPlayerThrow(ROCK);
}


このメソッドは、プレイヤから見えるようにロックイメージをアクティブに設定し、相手の移動を格納するために使用されるRockPaperScissorsクラスに対してSaveAsync/insertコールを実行するinsertPlayerThrowメソッド/関数をコールします。ParseObject APIは、このようなデータ変更を行うために使用され、GameScoresを保持するために役立つIncrement()などの便利なAPIコールもあります。最後に、変数isWaitOnReplyはtrueに設定されています。これは、次に説明するUpdate()メソッドによって定期的にチェックされる値です。


ParseObject psrGame = new ParseObject(ROCKPAPERSCISSORS_CLASS);
psrGame[PLAYERNAME] = playerName;
psrGame[OPPONENTNAME] = opponent;
psrGame[PLAYERTHROW] = playerThrow;
await psrGame.SaveAsync();
isWaitOnReply = true;


Updateメソッドは、Unityエンジンによってすべてのフレームで呼び出され、ゲームで相手の動きをチェックするために使用されます。Parse には様々な通知機能がありますが、このゲームでは単にポーリングします。すべてのフレームが頻繁すぎるため、3秒ごとにチェックするようにUpdateメソッドを設定しました(ただし、この目的のためにFixedUpdateメソッドも使用できますが、少し動作が異なります)。Updateメソッドは、checkOpponent()メソッドをコールし、次の問合せを実行して相手の移動を取得します(WhereEqualToコールを使用して問合せを作成)、テキストによるウィナーを比較および通知し、適切なサウンドのアクティブ化(ロック・クラッシュ・ハサミ、ペーパー・ラッピング・ロックまたはscissors cutting paper)を行います。最後に、処理された相手の移動にDeleteAsync/deletedが発行されます。対戦相手がまだ読んでいないため、実際のプレーヤーの動きはこの時点では削除されません。したがって、各プレーヤは、対戦相手がクリーンアップのために移動する削除の責任を負います。(また、Unityプロジェクトにはデフォルトで非表示の「すべてのゲームを削除」ボタンと、相手がチェックしない場合にすべてのゲームを削除するためにコールする対応する方法もあります。


ParseQuery<ParseObject> query = new ParseQuery<ParseObject>(client, ROCKPAPERSCISSORS_CLASS);
query = query.WhereEqualTo(PLAYERNAME, opponent).WhereEqualTo(OPPONENTNAME, playerName);
var results = await query.FindAsync(); 
foreach (ParseObject obj in results)
{
 string opponentsMove = obj.Get<string>(PLAYERTHROW);
 Debug.Log("opponentsMove:" + opponentsMove);
 if (string.Equals(opponentsMove, "")) isWaitingOnReply = true;
 else
 {
  switch (opponentsMove)
  {
   case "rock":
    rockOpponent.SetActive(true);
    if (string.Equals(opponentsMove, playerThrow)) outcomeTextMesh.text = "Tie";
    else if (string.Equals(playerThrow, PAPER))
    {
       outcomeTextMesh.text = "You won!";
       paperWinAudio.SetActive(true);
    }
[...]
await obj.DeleteAsync(); 


アプリには、「コンピュータ」が相手として選択されているが、UnityやParseに特に特別なものがないため、リーダーはそのソースコードを参照する場合の特別なロジックもあります。




最後に、アプリケーションを構築してデプロイします。


「ファイル」->「ビルド設定」で、単にプラットフォーム(AndroidやAppleなど)のビルドと実行を選択できます。「プレーヤ設定」ボタンをクリックして、その他のプロパティを編集できます。




Unity Engineでプレイをヒットしてアプリをテストし、そこでゲームをプレイすることもできます。


これで終わりです。そこから取り出して、paper, scissors, rockなど、好きなものを建てることができます。Oracleコンバージドデータベースへのアクセスは、そのすべてのデータ型と機能を通じて多くの興味深い可能性をもたらし、最小限の労力でそれをサポートする強力なデータおよびアプリケーションバックエンドを備えるため、アプリケーションに集中できます。


お読みいただきありがとうございます。他の資料やデモについて質問、フィードバック、リクエストがあるかどうかをお知らせください。ご連絡をお待ちしております。


コメント

このブログの人気の投稿

Oracle RACによるメンテナンスのためのドレインとアプリケーション・コンティニュイティの仕組み (2023/11/01)

Oracle Cloud Infrastructure Secure Desktopsを発表: デスクトップ仮想化のためのOracleのクラウドネイティブ・サービス (2023/06/28)

Oracle Cloudのデータベースをオブジェクト・ストレージにバックアップする3つの方法 (2021/12/13)