UNET用語(スクリプト)まとめ
前提
①using UnityEngine.Networking;とスクリプト先頭で宣言されている。
②NetworkBehaviourクラスを継承している。
③オブジェクトにNetwork Identityコンポーネントが付いている。
SyncVarAttribute
メンバ変数の上に[SyncVar]と書いて使う。
[SyncVar]がついたメンバ変数は、ゲームが準備状態(Ready State)(謎)の時、サーバーからクライアントへ同期する。
主にCommandAttributeとセットで使う。
SyncVarAttribute.hook
hookは、クライアント側でSyncVar変数の値が変えられた時に呼び出すメソッドを設定できる。
hookを使った場合は、SyncVarの変数の同期を自分でやらないといけないっぽい?hookが無い場合は勝手に同期してくれる。
CommandAttribtue
メソッドの上に[Command]と書いて使う。
クライアントが[Command]メソッド内で[SyncVar]変数の内容を変更した時に機能する。
変更データはホストサーバーへ送られ、受け取ったホストサーバーは全クライアントへ変更データを送信し、データの同期を図る。
メソッドの先頭には「Cmd」と付けるのが慣例である。
ClientAttribute
メソッドの上に[Client]という書いて使う。
自分がクライアントの時のみ実行可能なメソッドとなる。
(ホストサーバーもクライアントを兼任してるから、どういう意味があるのかはまだ分からない。)
ClientCallbackAttribute
基本的にClientAttributeと同じで、メソッドの上に[ClientCallback]と書いて使う。
サーバー側で呼び出した時に、コンソールにWarningが出ない点だけ違う。
ClientRpcAttribute
メソッドの上に[ClientRpc]と書いて使う。(RPC: Remote Procedure Calls)
クライアントが呼び出したこのメソッドの引数はネットワークを超えて順番に並べられるので、サーバーと同じ値で同期がとれる。(謎)
メソッドの先頭には「Rpc」と付けるのが慣例である。
NetworkSettingsAttribute
ネットワークの設定に使う。
設定できるのはchannel(SyncVar変数をUpdateする時の設定Qos参照)とsendInterval(どれくらいの頻度でUpdateするか)。
UNET用語(スクリプト)の例
using UnityEngine; using UnityEngine.Networking; using System.Collections; //Networkの設定 [NetworkSettings(channel=0, sendInterval=0.01f)] public class ScriptTest : NetworkBehaviour { //SyncVar: 変数の値が変わった時、サーバーから全クライアントへ値を送り同期する //hook: クライアント側でSyncVarの値が変更された時、ChangeValuesメソッドを実行する [SyncVar(hook = "ChangeValues")] int num; void Update () { //画面をクリックするとTestCommandメソッドを呼ぶ //クライアントしか受け取れない(ホストサーバーもクライアントを兼ねてるから意味ない?) if (Input.GetMouseButtonDown (0)) { Debug.Log(gameObject.GetInstanceID() + " : " + num); TestCommand (); } } //クライアントのみ実行可能 [Client] //hookで呼ばれるメソッド 引数はSyncVarの変数 void ChangeValues (int latestNum) { //hookを使った場合は自分で同期しないと反映されない //hookが使っていない場合は自動的に同期される num = latestNum; } //クライアントのみ実行可能(サーバーが呼んでもWarning出ない) [ClientCallback] void TestCommand () { //LocalPlayerのみにしておかないと、他のプレイヤーのnumまで増えてしまう if (isLocalPlayer) { //現在のクライアントのnumを送る CmdProvideGetNumToServer (num + 1); } } //SyncVarの値が変わり、クライアントからサーバーへnumが送られる [Command] void CmdProvideGetNumToServer (int getNum) { //numを変更し、サーバーから全クライアントへ送ってもらう num = getNum; } }
ScriptTest.cs