Unity と Oracle バックエンドを使ってモバイル マルチプレイヤー ゲームを数分で開発 (2023/04/26)
Unity と Oracle バックエンドを使ってモバイル マルチプレイヤー ゲームを数分で開発 (2023/04/26)
投稿者: 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コンバージドデータベースへのアクセスは、そのすべてのデータ型と機能を通じて多くの興味深い可能性をもたらし、最小限の労力でそれをサポートする強力なデータおよびアプリケーションバックエンドを備えるため、アプリケーションに集中できます。
お読みいただきありがとうございます。他の資料やデモについて質問、フィードバック、リクエストがあるかどうかをお知らせください。ご連絡をお待ちしております。
コメント
コメントを投稿