Unity3DでPhoton Cloudを使用する

Unity3Dで最初のゲームを作成する過程で、プレイヤーが対戦相手のコンピューターアバターを切断できるネットワークモードを編成する必要があることに気付きました。 以前にクライアントサーバーアプリケーションの作成に取り組んでおらず、ゲームサーバーを上げず、それらのインストールとサポートに労力とお金を費やしたくないが、マルチプレイヤーの整理の原則を理解し、15-20分でプロジェクトをアップグレードしてきれいにしたい場合彼のタイトルにオンラインという言葉を追加する良心、そしてこの記事はあなたのためです。



Photon自体について少し。 この会社はサーバーエンジンを専門としています。 わずか数分でAppIDを登録および受信できる便利なサイト。 豊富なドキュメント(元の言語で書かれていますが、多数のマニュアルとデモプロジェクト)。 ネットワークにはロシア語のビデオチュートリアルもありますが、これはすべてPhoton Serverに適用されます。 サーバーのインストールと構成に煩わされたくない場合は、Photon Cloudクラウドサービスを使用できます。このため、登録時にAppIDを取得するだけでよく、同時に接続された20人のユーザーのライセンスが保証されます。



このサイトは、ほんの数分でクラウドに接続できると主張しています。 そして、これは真実です...もちろん、それまでに数時間または数日かけてドキュメントを勉強しなければなりません。



それでは、幸福のために何が必要ですか?



1.クラウドに接続します。

2.テストルームを作成するか、既に存在する場合は参加します。

3.すべてのプレイヤーが同じシーンで互いに対話していることを確認します。



接続は、組み込みの静的PhotonNetworkクラスを使用して編成されます。



PhotonNetwork.Connect("app.exitgamescloud.com",5055,"    AppID","v 0.1");
      
      







パラメータ値は明確だと思います。 最後のパラメーターは、アプリケーションのバージョンを相互に区別するために必要です。

Assets \ Photon Unity Networking \ ResourcesディレクトリにPhotonServerSettingsスクリプトがある場合、 画像

その後、手順を使用できます



 PhotonNetwork.ConnectUsingSettings(“ ”);
      
      







テストルームを作成または参加します。

 if (PhotonNetwork.countOfRooms==0) {PhotonNetwork.CreateRoom("test",true,true,4); } else {PhotonNetwork.JoinRoom("test");}
      
      







ルームを作成するとき、その名前に加えて、他の人にも見えるかどうか、開いているかどうか、およびプレーヤーの最大数を指定できます。 参加するときは、名前だけを示すのに十分です。

すでに部屋にいる場合は、PhotonNetwork.roomでそのプロパティを確認できます。



:新しいシーンをロードするとき、サーバーとルームへの接続は切断されません。



これで、シーンとそのシーンのプレイヤーの動きを同期することができます。 それはすべてプロジェクト自体に依存します。 基本的なオプションがいくつかあります。

1.すべてのプレイヤーに対して同期して移動するには、オブジェクトが必要です。 これを行うには、同期されたオブジェクトにPhotonViewコンポーネントを追加します-「Components / Miscellaneous / PhotonView」 画像

Observeには同期オブジェクトを指定し、Serializationでは同期パラメーターを指定します。

各PhotonViewコンポーネントにはビューIDがあります。

2.ゲーム中にユーザーのリクエストに応じて同じオブジェクトを作成する必要があります。 たとえば、プレイヤーは手ren弾を投げる必要があります。 これを行うには、Instaniateの代わりに手順が使用されるゲームオブジェクトを作成する必要があります



 GameObject grenade = PhotonNetwork.Instantiate ("grenad", Vector3.zero, Quaternion.identity, 0);
      
      







Instaniateとは異なり、最初にプレハブの名前を指定し、最後にそのグループ(任意の整数)を指定する必要があります。 プレイヤーの1人が作成したこのようなオブジェクトは、他のすべてのユーザーに表示されます。

この手順を使用して、メインキャラクターを作成する必要があります。 ただし、すべてのキャラクターがあなたのコントロールに反応するという事実に直面します。 これを回避するには、ローカルプレーヤーを定義する条件をキャラクター制御スクリプトに追加する必要があります。 次のようなもの:



  if (photonView.isMine) {/* */}
      
      





:photonView.isMineプロパティを使用するには、Photon.MonoBehaviourをスクリプトの親クラスとして指定する必要があります。

Assets \ Photon Unity Networking \ Resourcesにあるプレハブのみを作成できます



3.オブジェクトを管理するには、RCP(リモートコールプロシージャ)が役立ちます。これにより、リモートアプリケーションに必要な引数を渡すことにより、リモートアプリケーションでプロシージャを実行できます。 これを行うには、プロシージャを宣言する前にスクリプトに[RPC]タグを追加し、PhotonViewコンポーネントをスクリプトが添付されているオブジェクトに追加して、後でアクセスできるようにする必要があります。

例:



  [RPC] void Chat(string NewMessage) { Debug.Log(NewMessage); }
      
      







したがって、クライアントでプロシージャをリモートで開始するには、PhotonViewを定義する必要があります。



 PhotonView photonView = PhotonView.Find(view ID);
      
      







または



 PhotonView photonView = PhotonView.Get(gameobject);
      
      







そして、プロシージャを実行します



 photonView.RPC("Chat ", PhotonTargets.All, “ ”);
      
      







ここで、引数として、呼び出されたプロシージャの名前、受信者、および元の関数の引数を指定します。

:パラメーターとして、RPCは主要なタイプのみを認識します。 int、float、bool、stringなど。



4.同期オブジェクトとして、PhotonViewコンポーネントはデフォルトで、空間内のオブジェクトの位置を担当するTransformコンポーネントを選択します。 情報を送信する必要がある場合は、スクリプトを同期オブジェクトとして指定する必要があります



画像



そして、スクリプト自体にプロシージャを挿入します
 void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info) { if (stream.isWriting) { //We own this player: send the others our data stream.SendNext((int)controllerScript._characterState); stream.SendNext(transform.position); stream.SendNext(transform.rotation); } else { //Network player, receive data controllerScript._characterState = (CharacterState)(int)stream.ReceiveNext(); correctPlayerPos = (Vector3)stream.ReceiveNext(); correctPlayerRot = (Quaternion)stream.ReceiveNext(); } }
      
      







理論的には、この手順はパラメータの1つが変更されるたびに呼び出される必要がありますが、この場合、キャラクターの位置、位置、または状態が変更されると、私のようにマスタークライアントのみによって呼び出された状況に遭遇する可能性があります 通常のクライアントでこの手順を強制的に実行するには、次のスクリプトを使用できます。



  if (!PhotonNetwork.isMasterClient) { PhotonStream PS=new PhotonStream(true, null); PhotonMessageInfo PI= new PhotonMessageInfo(); OnPhotonSerializeView(PS,PI); }
      
      







ご清聴ありがとうございました。 次回は、Photon Cloudの機能を詳しく検討する予定です。



All Articles