Unity(C#)初心者・入門者向けチュートリアル ひよこのたまご

AndroidやiOS向けアプリを簡単に作れるゲーム開発環境Unity(ユニティ)の使い方を、チュートリアル方式で一緒に学びましょう!

【Unity】UNETの基本的な用語(スクリプト編)【ひよこエッセンス】

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