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

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

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

いつもひよこのたまごをご利用下さいましてありがとうございます!
おかげ様でチュートリアル数も10ゲーム目となりました!
チュートリアル一覧は
こちら からどうぞ!


スポンサーリンク

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