ターンベースゲームデモ
Photon Unity Networking(PUN)は、ストラテジーゲームやボードゲームといったターンベースゲームに用いることができます。このドキュメントでは、PUNパッケージに含まれているRock Paper Scissorsデモの説明をもとに、ターンベースゲームを実装する方法の概要について説明します。
このデモには、PunTurnManager、RpsCore、RpsDemoConnectなどのコンポーネントスクリプトが含まれます。
PunTurnManager
PunTurnManager
は包括的なコンポーネントクラスで、類似したゲームやロジックで再利用されます。必須ではありませんが、ターンベースゲームを高速で動かすためのシンプルかつ便利なラッパーがあると便利です。より複雑かつオリジナリティのあるゲームプレイを築く上で、良い出発点となるでしょう。
データ保存については、PunTurnManager
はゲームデータをゲームのライフサイクル内で保存するのに非常に効率的な方法である Room Custom Propertiesに完全に依存しています。
追加の機能やデータが必要である場合、ゲームに関連するデータの定義、読み込み、書き込みのために、 Room Custom Propertiesを拡張することを強く推奨します。
また、 Room Custom Propertiesのデータを得るためサードパーティのシステムの為に[Webhook]を用いることもできます。[Webhook]を用いるだけで、データを外部ストレージに保存する必要なしに、ハイスコアやお知らせの送信、統計値の維持を行うことができます。
IPunTurnManagerCallbacks
IPunTurnManagerCallbacks
インターフェースによって、主要なターンベースメッセージのコールバックをリッスンすることができます。PunTurnManager
を結合する方法については、 RpsCore
スクリプトを参照してください。
これらのコールバックを正しくリッスンし、現在のすべてのクライアントについてトラッキングを保持することは、ターンベース管理をするうえで非常に重要です。ゲームの成果を把握するには、コールバックのリッスンを重視する必要があります。
TurnManagerの拡張
PUNのさまざまなクラスで、新たなプロパティやメソッドがターンベースシステム用に特別に設計された拡張として追加されています。これらの拡張はTurnExtensions
クラスのPunTurnManager.csで宣言されています。
これによって、簡潔なAPIが提供され、コードの読解がさらに容易になっています。
特定のニーズを満たすには、独自の拡張を作成してください。特に、ルームゲームロジックでプレイヤーやルームのカスタムプロパティの使用を非表示にするのに役立ちます。これによって、プロジェクトが複雑化しても柔軟性を高め、リファクタリングを容易におこなうことが可能になります。
RpsCore
RpsCore
コンポーネントスクリプトはこのデモ専用で、典型的なじゃんけんゲームに必要なルールとデータを実装しています。このスクリプトは、ビジュアルインターフェース、ゲームロジック、PunTurnManager
間を仲介しています。
このスクリプトはPunTurnManager
を処理し、すべてのコールバックを実装します。また、多様なUIエレメントを管理して、ゲームの現状を反映します。さらに、ユーザー入力も処理します。
包括的な部分、ゲームによって必要性が異なる部分について認識しておくことは常に重要です。新しい機能を開発する際には、この点に常に留意してください。
RpsDemoConnect
RpsDemoConnect
コンポーネントは接続や、ルームおよびロビーへの参加をおこなううえで、通常のPUNに非常に似ています。
ただし、このコンポーネントには非常に重要な機能が含まれています。ターンベースゲームに必須であるルームへの参加機能です。概念としては、ユーザーがプレイしているルームをトラッキングして、以前接続していたルームの検知や再接続、再参加を実現します。
これはPhotonNetwork.ReJoinRoom(string roomName) を使用して実施され、コールに正常に再参加できるかはRoomOptions.PlayerTtl (プレイヤーの持続時間) に依存しています。たとえば、数日間の切断をゲームで許容する場合にはRoomOptions.PlayerTtl を"(日数)* 24 * 60 * 60 * 1000"に設定する必要があります。
RpsDemoConnect
コンポーネントは、接続とプレイの基本的な要件を満たします。実際のプロジェクトでは、さまざまな接続ステータスやロビー、フレンドリストなどのすべてのソーシャル機能についてより多くのフィードバックを提供するため、このコンポーネントを拡張する必要性が生じます。ゲーム開発ではこの要件は、ほとんどのネットワークゲームやターンベース、非ターンベースゲームに共通します。
必須事項と禁止事項
PUNを使用してターンベースゲームを作成する際には、PUN機能を正しく使用する点と、ターンベースではサポートされない機能を回避する点が重要です。
Do's 必須事項
- ルーム作成時には RoomOptions.PlayerTtl を正しく設定してください。
- ルーム作成時にはRoomOptions.EmptyRoomTtlを正しく設定してください。通常はRoomOptions.PlayerTtlのみが必要ですが、これによってセットアップの柔軟性が高まります。
- ルームプロパティを使用して、実行中のゲームに固有なデータをトラッキングしてください。
- プレイヤーセッション間で持続が必要なプレイヤーデータのトラッキングを保持するため、カスタムプレイヤープロパティを使用してください。
- プレイヤーのトラッキングを維持するため、PhotonPlayer.ID を使用してください。
- プレイヤー間でターンのやり取りを繰り返すため、PhotonPlayer.GetNext() を使用してください。
PunPlayerScores
拡張を使用し、必要に応じてさらに複雑なスコアまたはデータ管理を作成してください。- プレイヤーをルーム内でインアクティブにすることが可能です。現在どのプレイヤーがオンラインでないかを把握するには、 PhotonPlayer.IsInactiveを確認してください。
禁止事項
-PhotonViewコンポーネントや派生物は使用しないでください。オーナーがインアクティブな場合(ルームにいない場合)、PUNはこれらの管理を引き渡します。
- PhotonViewが必要なためPunRPCは使用しないでください。代わりにPhotonNetwork.RaiseEventを使用してください。