読者です 読者をやめる 読者になる 読者になる

tanaka's Programming Memo

プログラミングについてのメモ。

Unity5.1のネットワークマニュアル斜め読み(2)

前へ | 次へ

大雑把に意訳しているので、意味が違うところがあるかもしれません。何かありましたらお知らせ&ご容赦ください。

UNet Unity5.1からの新しいネットワークシステム
Unity5.1のネットワークマニュアル斜め読み(2)
UNet NetworkManagerの利用
Unity5.1 ネットワークシステムのオブジェクト生成
Unity5.1 ネットワークシステムの状態同期
Unity5.1 ネットワークシステムのRemote Actions
Unity5.1 ネットワークシステム PlayerObjects
Unity5.1 ネットワークシステム Object Visibility
Unity5.1 ネットワークシステム Network Messages
Unity5.1 ネットワークシステム Matchmaker
Unity5.1 ネットワークシステム Scene Objects
Unity5.1 ネットワークシステム:シングルプレイヤーゲームを多人数に対応させる
Unity5.1 ネットワークシステム Multiplayer Lobby
Unity5.1 ネットワークシステム Network Clients and Servers
Unity5.1 ネットワークリファレンス概要

HLAPI

公式サイトの以下のページより
http://docs.unity3d.com/ja/current/Manual/UNetUsingHLAPI.html

The High Level API(HLAPI)はUnityのゲームにマルチプレイヤー要素を追加するシステムです。マルチプレイヤーゲームでよく利用する各種機能が用意されていて、専用サーバーを立てる方式や、プレイヤーの一人がサーバーの役割を担当する方式などが選べます。また、インターネットでの接続を支援する機能も提供します。

HLAPIは新しく構築されたUnityのシステムで、UnityEngine.Networkingネームスペースに含まれます。使いやすく、反復的に開発できることに着目して、以下のような機能を提供します。

  • メッセージでの制御
  • 汎用性が高く、効率の良いデータのやりとり
  • オブジェクトの配信管理
  • 状態の同期
  • サーバー、クライアント、接続などのネットワーク用クラス

各構成は以下にて。
http://docs.unity3d.com/ja/current/Manual/UNetUsingHLAPI.html

ネットワークシステムのコンセプト

公式サイトの以下のページより
http://docs.unity3d.com/ja/current/Manual/UNetConcepts.html

サーバーとホスト

Unityのネットワークシステムは、1つのサーバーと複数のクライアントで構成されます。専用サーバーを立てない場合は、クライアントプレイヤーのうちの一人がサーバー役となります。このサーバー役を引き受けているクライアントをUnityのシステムではホスト(Host)と呼びます。

ホストはサーバーとクライアントを兼業します。ホストは特別なクライアントということでLocalClientと呼び、その他の一般的なクライアントをRemoteClientと呼びます。LocalClientは、サーバーの関数やメッセージキューを同じプロセス上で扱い、シーンも共有します。RemoteClientはネットワーク越しにサーバーにアクセスします。

LocalClientとRemoteClientのコードを、なるべく同じコードにすることを目指しています。

Instantiate and Spawn

UnityではゲームオブジェクトをGameObject.Instantiate()で生成しますが、ネットワークシステムでは、ネットワーク先で生成される(“spawned”)こともあります。Unityでは、サーバーが生成の指示を出して、ネットワークに接続されているクライアントが指示に従って自分のシーンにゲームオブジェクトを登場させます。このように生成されたゲームオブジェクトは、生成システム(Spawning System)が配信や消滅の管理、状態の同期を担当します。

Players, Local Players and Authority

ネットワークシステムではプレイヤーのオブジェクトは特別な存在です。ゲームの参加者は自分のオブジェクトに命令を与えられますが、他のプレイヤーのオブジェクトには命令が与えられません。プレイヤーオブジェクトには、自分のものかどうか、という区別があります。プレイヤーがゲームに参加するためにネットに接続すると、そのプレイヤーのクライアント上に自分用のローカルプレイヤーが生成され、isLocalPlayerプロパティがtrueになります。そして、そのクライアント上のオブジェクトのOnStartLocalPlayer()というコールバック関数が呼び出されます。

自分のプレイヤーはisLocalPlayerプロパティがtrueなので、これを判定して、カメラの接続や、操作方法を切り替えます。

isLocalPlayerがtrueということは、"local authority"、つまり生成したクライアントにプレイヤーオブジェクトを制御する権限があることを表します。主にプレイヤーオブジェクトの動きについてですが、それ以外のこともできます。NetworkTransformコンポーネントが設定されていると、設定に従ってクライアントの動きをネットワークに伝えることができます。NetworkIdentityコンポーネントに、LocalPlayerAuthorityを設定するためのチェックボックスがあります。

敵のようなプレイヤーではないオブジェクトは、クライアントでは制御せずに、サーバーが制御するのがよいでしょう。

NetworkBehaviourクラスのhasAuthority(isAuthority)プロパティで、制御を担当するものがあるかを表すことができます。プレイヤー以外のオブジェクトはサーバーが制御を担当し、(NetworkIdentityの)localPlayerAuthorityが設定されているプレイヤーオブジェクトは、そのプレイヤーを生成したクライアントが制御します。

まとめ

  • Unityではサーバー専用だとServer、サーバーとクライアント兼用だとHostという
  • ネットーワク上のゲームオブジェクトの生成や削除、状態同期は、Spawning Systemが担当してくれる
  • プレイヤーのオブジェクトは、ネットワーク上の一人が制御を担当するAuthorityになる
  • NetworkBehaviour.isLocalPlayerがtrueが、そのプレイヤーの制御担当者
  • NetworkTransformコンポーネントで、動きなどの同期ができる


前へ | 次へ