あなたの世界を作りなさい
プレイヤーとキャラクター:基本

ZEPETO Players

18min
Document image

  • ZepetoPlayers は、ZEPETOプレイヤーとZEPETOキャラクターの両方を制御するために設計されたマネージャー(シングルトン)クラスです。
    • ZepetoPlayersをシーンに追加することで、ZEPETOプレイヤーを作成、削除、操作できます。
  • ZepetoPlayer は、マルチプレイヤーの世界で直接制御するプレイヤーと他のプレイヤーを管理するために使用されるZEPETOキャラクターの個別のインスタンスを表します。
    • マルチプレイヤーの世界で作成されたすべてのZepetoPlayerには一意のセッションIDが割り当てられ、このセッションIDを使用して管理されます。
    • ZepetoPlayerはZepetoCharacterの属性を持っているため、ZepetoCharacterに関連する関数を使用して制御できます。
    • ZepetoPlayerには3種類があります:

ZepetoPlayer

説明

ローカルプレイヤー

ローカルユーザーによって直接制御されるZEPETOキャラクターインスタンスです。 - キャラクターコントローラー/Zepetoカメラコンポーネントが付属しています。

ネットワークプレイヤー(リモートプレイヤー)

マルチプレイコンテンツで読み込んで利用できるZEPETOキャラクターインスタンスです。 - キャラクターコントローラー/Zepetoカメラコンポーネントは付属していません。

ボットプレイヤー

マルチプレイコンテンツ用のZEPETOキャラクターインスタンスですが、実際のユーザーではなくボットによって制御されます。 プレイヤーが不足している状態でマルチプレイヤーワールドを開始する際や、プレイヤーがプレイ中に退出した場合の代替として使用されます。 - キャラクターコントローラー/Zepetoカメラコンポーネントは付属していません。

  • ZepetoCharacter は、World Sceneで読み込んで制御できるZEPETOキャラクターの基本インスタンスユニットです。
    • ZepetoCharacterは、ZEPETOアプリを通じて作成されたアバターの外見を持っています。

ZepetoPlayersの追加

Hierarchyウィンドウで、ZEPETO → ZepetoPlayersタブを選択します。

Document image


シーンに追加できるようになりました。

Document image


ZepetoPlayersを追加するだけでは、Zepeto Playerをシーンに持ち込むことはできません。ZepetoPlayersのキャラクター作成APIを使用してスクリプトを実装する必要があります。

シーンでローカルプレイヤーだけを迅速に作成して試したい場合は、ガイドを参照してください:



Zepetoプレイヤーの名前とプロフィール写真を表示する方法のサンプルについては、ガイドを参照してください:



ZEPETOプレイヤーAPI

ZepetoPlayers APIに興味がある場合は、ドキュメントを参照してください:



このガイドは、主にマルチプレイヤーシナリオでのZEPETOプレイヤーの使用例をカバーしています。



ZEPETOプレイヤーを使用したマルチプレイ位置同期の実装

シングルプレイヤーの世界では、ローカルプレイヤーを作成する必要があり、ローカルプレイヤーのみが画面に表示されるため、同期は不要です。

しかし、マルチプレイの世界では、直接操作するローカルプレイヤーだけでなく、ネットワークプレイヤーと呼ばれる他のプレイヤーも画面に表示する必要があります。

ネットワークプレイヤーのすべてのアクション - 移動、ジャンプ、特定のジェスチャーを行う - は、あなたの画面に同じように表示される必要があります。

このプロセスは同期と呼ばれます。

同期スクリプトを実装しないと、ネットワークプレイヤーの外見や動きを見ることができません。

同期なしのマルチプレイワールドでは、他のクライアントがルームに入ったかどうかを知る唯一の方法はホームボタンを通じてです。

キャラクター作成と同期スクリプトなしでマルチプレイ設定のみが適用されたときの外見
キャラクター作成と同期スクリプトなしでマルチプレイ設定のみが適用されたときの外見




ステップ 1 : マルチプレイ環境の設定

マルチプレイチュートリアルビデオを通じて、基本設定と概念を理解することから始めることをお勧めします。



ステップ 2 : 他のプレイヤーを画面に表示する

あなたのローカルプレイヤーは、他の誰かのデバイス上でネットワークプレイヤーとして扱われます。

これは、あなたのローカルプレイヤーも同期のためにサーバーに情報を送信しなければならないことを意味します。

マルチプレイワールドに接続されているすべてのプレイヤーは、自分の情報を共有する必要があります。

マルチプレイルームに接続されているすべてのクライアントは、マルチプレイルームの状態データを共有します。

このルーム状態データは、Schemas.jsonで定義されたスキーマに従います。

(スキーマをデータ構造として考慮してください)

このガイドでは、ルームステートデータを通じてプレイヤーの位置を同期します。したがって、各プレイヤーの位置データを表すことができるスキーマをSchemas.jsonに定義してください。

schema.json




👍 ヒント

  • サーバーとすべてのクライアントが共有すべき情報をすべて、マルチプレイルームステートに保存してください。
  • レベル、経験値、スコアなど、各プレイヤーの個別データを保存するには、データストレージを使用してください。



サーバースクリプトは、別のプレイヤーがルームに入ったときにそれを認識し、その情報をクライアントに送信して、そのプレイヤーをシーンにロードすることができます。



ステップ 2-1 : 基本サーバースクリプト

プレイヤーがマルチプレイワールドのルームに入ると、onJoin()が呼び出されます。

サーバースクリプトでは、接続されたプレイヤーの情報をルームステートのプレイヤーに追加します。



また、プレイヤーがルームを退出すると、onLeave()が呼び出されます。

サーバースクリプトは、ルームステートのプレイヤーから退出したプレイヤーの情報を削除します。

TypeScript




ステップ 2-2 : 基本クライアントスクリプト

マルチプレイワールドを作成する際には、サーバーと通信するためのクライアントスクリプトが必要です。

以下は、マルチプレイ用の基本的なクライアントスクリプトの例です。

クライアント側では、currentPlayersマップデータ構造を使用して、表示するプレイヤーデータを管理します。



以下に重要なコードの行を示します:

ZepetoPlayers.instance.CreatePlayerWithUserId(sessionId, player.zepetoUserId, spawnInfo, isLocal);

クライアントがサーバーのルームステートからプレイヤー情報を受信し、新しいプレイヤーがルームに参加すると、セッションIDが割り当てられます。作成されるプレイヤーのセッションIDが自分のセッションIDと一致する場合、そのプレイヤーはローカルと見なされます。この場合、プレイヤーは次のようにインスタンス化されます:isLocal = true, これはローカルプレイヤーであることを示しています。

その後、ローカルでないプレイヤーは isLocal = false. これにより、ローカルプレイヤーと非ローカルプレイヤーのすべての外観が画面に表示されることが保証されます。

TypeScript




今、プレイヤーが入ると、ZEPETOキャラクターが画面に作成されたことを確認できます。

しかし、プレイヤーの動きはまだ画面に反映されていません。

私の画面では、ローカルプレイヤーだけが動き、他のプレイヤーは実際に動いていても静止しているように見えます。
私の画面では、ローカルプレイヤーだけが動き、他のプレイヤーは実際に動いていても静止しているように見えます。




次に、位置の同期に進みましょう。



ステップ3:他のプレイヤーの情報を取得して同期する

同期のために、プレイヤーが動いたりアクションを取ったりするたびに、彼らはサーバーに状態の変化を送信しなければなりません。

状態の変化を含むメッセージをサーバーに送信するのは、ルームメッセージ通信を通じて行われます。

サーバーがプレイヤーの状態変化に関するメッセージを受信すると、ルームの状態が更新されます。

  • 以下のガイドを参照してください。 [[err] ]



例えば、あなたのローカルプレイヤーがBという名前だとしましょう。

ネットワークプレイヤーAがルームに参加すると、彼らは座標x:0, y:0, z:0でインスタンス化されます。

プレイヤーAが位置x: -10, y: 0, z: 0に移動すると、BはAが移動していることを知る方法が実際にはありません。

これは、両者が別々のデバイスでローカルに操作されているため、別々のクライアントであるからです。

したがって、Aを操作している人は、ルームメッセージを介してサーバーに自分の動きを伝える必要があります。

サーバーがこの情報を受け取ると、ルーム内の全員にAのリアルタイムの位置を通知します。これにより、BはついにAが移動していることを認識します。

サーバーが他のプレイヤーに通知するためには、2つの方法があります:

  • ルームメッセージのブロードキャストを使用する。
  • ルームの状態を更新し、その後クライアントがルームの状態を取得して適用する。

このガイドでは、ルームの状態を更新する2番目の方法を利用します。

Document image




シーンにロードされたZepetoプレイヤーがZepetoキャラクター属性を持っているため、特定の場所への移動やジャンプを指示するためにZepetoキャラクター機能を使用できます。

BのクライアントがAの移動をx:-10, y:0, z:0に視覚化するための最も直感的なアプローチは、MoveToPosition()を使用することです。この関数は、サーバーから受信したAの最新の位置にプレイヤーを移動させます。

位置の変更だけでなく、ジェスチャー、スキルの使用、アイテムの収集、すべての状態変更は、同期のためにサーバーとクライアントの通信を必要とします。

ネットワーク全体で全てのアクションを調和させるために、同期を実装する必要があります。

👍 同期の概念の概要

  • ローカルプレイヤーにステータス変更があると、Room Messageを使用してサーバーに送信します。
  • サーバーは、ローカルプレイヤーを除くすべての他のプレイヤーにステータス変更を通知します。
  • ステータス変更メッセージを受信すると、クライアントコードはメッセージを送信したプレイヤーのステータスを更新します。



ステップ 3-1 : 完全な位置同期を持つサーバースクリプト

基本的なサーバースクリプトでは、ローカルプレイヤーのクライアントからのステータス変更に関するメッセージを受信するたびに、ルームの状態を更新するための追加の実装が必要です。

TypeScript




ステップ 3-2 : 完全な位置同期を持つクライアントスクリプト

基本的なクライアントスクリプトにおける重要な実装は次のとおりです:

  • サーバーのルームステートが変更されたときにOnStateChangeを自動的に呼び出します。
  • を使用して、SendMessageLoop(0.04)関数を使用して、ローカルプレイヤーの位置とキャラクターのジャンプ状態情報をサーバーに0.04秒ごとに送信します。
TypeScript




位置同期化コードが適用されると、私のローカルプレイヤーだけでなく、他のプレイヤーの動きも表示されます。
位置同期化コードが適用されると、私のローカルプレイヤーだけでなく、他のプレイヤーの動きも表示されます。




👍 ヒント

  • このガイドは位置の同期のみを実装しています。ジェスチャーの同期、オブジェクトの同期などは実装されていません。
  • 原則はすべて同じですが、必要な瞬間にルームメッセージを送受信するプロセスが必要です。
  • 同期をより便利に実装したい場合は、マルチプレイ同期モジュールの使用を検討してください。



更新日 11 Oct 2024
Doc contributor
Doc contributor
Doc contributor
このページは役に立ちましたか?