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

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

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

【Unity9】UNETで各プレイヤーにPlayerIDを設定する【UNET7】

Unity UNET チュートリアル

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


スポンサーリンク

Unity5.1.1p3 Personal(2015年7月)


前回の続きです〜


今回は各プレイヤーにPlayerIDを設定していきます〜
攻撃のヒット検出などに使うそうです〜



UNET Part 7 - Unique Identity - YouTube

【目標】各プレイヤーにPlayerIDを設定する

①PlayerIDを設定するスクリプト作成

まずは新しくPlayer_IDスクリプトを作成し、Playerプレハブに取り付けます〜以下ソースです〜

using UnityEngine;
using UnityEngine.Networking;
using System.Collections;


public class Player_ID : NetworkBehaviour {
	
	//SyncVar: [Command]で変更後、全クライアントへ変更結果を送信
	[SyncVar] private string playerUniqueIdentity;
	//???
	private NetworkInstanceId playerNetID;
	private Transform myTransform;

	//NetworkManagerによってPlayerが生成された時に実行される
	public override void OnStartLocalPlayer()
	{
		GetNetIdentity();
		SetIdentity();
	}
	
	void Awake () {
		//自分の名前を取得する時に使う
		myTransform = transform;
	}
	
	// Update is called once per frame
	void Update ()
	{
		//例外が発生した時にSetIdentityメソッド実行
		if (myTransform.name == "" || myTransform.name == "Player(Clone)") {
			SetIdentity();
		}
	}
	
	[Client]
	void GetNetIdentity()
	{
		//NetworkIdentityのNetID取得
		playerNetID = GetComponent<NetworkIdentity>().netId;
		//名前を付けるメソッド実行
		CmdTellServerMyIdentity(MakeUniqueIdentity());
	}
	
	void SetIdentity ()
	{
		//自分以外のPlayerオブジェクトの場合
		if (!isLocalPlayer) {
			//今付いている名前のまま
			myTransform.name = playerUniqueIdentity;
		} else {
			//自分自信の場合、MakeUniqueIdentityメソッドで名前を取得
			myTransform.name = MakeUniqueIdentity();
		}
	}
	
	string MakeUniqueIdentity ()
	{
		//Player + NetIDで名前を付ける
		string uniqueName = "Player " + playerNetID.ToString();
		return uniqueName;
	}
	
	//Command: SyncVar変数を変更し、変更結果を全クライアントへ送る
	[Command]
	void CmdTellServerMyIdentity (string name)
	{
		playerUniqueIdentity = name;
	}
}

Player_ID.cs


先頭のOnStartLocalPlayerメソッドはLocalPlayerとしてゲーム上に生成された時に呼ばれるメソッドで、GetNetIdentityメソッドとSetIdentityメソッドを呼んでいます〜

GetNetIdentityメソッドでは、NetworkIdentityコンポーネントのNetIDを取得しています〜ちなみにNetIDは、InspectorビューをDebugモードにすると確認することができます〜


f:id:hiyotama:20150711235414p:plain
Debugを選択


f:id:hiyotama:20150711235508p:plain
NetworkIdentityにNetID出現


続いてMakeUniqueIdentityメソッドにてPlayer + NetIDのstring型の変数を取得し、CmdTellServerMyIdentityにてplayerUniqueIdentityを更新しています〜
CmdTellServerMyIdentityは[Command]であり、SyncVar変数を更新しているため、更新結果は全クライアントへ送信されて同期されます〜


続いてOnStartLocalPlayerメソッドで2つ目のメソッドを呼び出します〜SetIdentityメソッドです〜


このPlayerオブジェクトが自分自身である場合は、MakeUniqueIdentityメソッドを再度呼び、そこで取得した名前を自分の名前とします〜


OnStartLocalPlayerメソッドから呼ばれた場合は必ず自分自身ですが、Updateメソッドにて何かの間違いで名前がスペースであったりPlayer(Clone)という不具合をキャッチした場合、再びSetIdentityメソッドが呼ばれます〜

この場合はisLocalPlayerがfalseである可能性もあるので、playerUniqueIdentityをそのPlayerオブジェクトの名前として再度指定します〜

②結果

それでは実際にゲームを実行してみましょう〜


f:id:hiyotama:20150712000559p:plain
ホストとクライアントそれぞれに名前が付いた


無事名前を付けることができました〜


今回はここまでです〜

ありがとうございました〜


【Unity9】UNETでマルチプレイヤーなオンラインゲーム開発【UNET1】
【Unity9】UNETでプレイヤーの動きを補間し、なめらかな動きを実現する【UNET1-2】
【Unity9】UNETでネットワーク越しに傾き(Rotation)を同期させる【UNET2】
【Unity9】UNETでオンライン開始時のプレイヤー生成位置を変更する【UNET2-2】
【Unity9】UNETのネットワークトラフィックを軽減し、効率化する【UNET3】
【Unity9】UNETのlatency(遅延時間)を改善する【UNET4】
【Unity9】UNETのlatency(遅延時間)を表示して、ちょっとだけ改善する【UNET4-2】
【Unity9】UNETのSyncVarのhookの使用例と、前時代の同期方法【UNET5】
【Unity9】UNETを使ってRotationを同期させる【UNET6】
【Unity9】UNETで各プレイヤーにPlayerIDを設定する【UNET7】
【Unity9】UNETで敵プレイヤーにダメージを与える!【UNET8】
【Unity9】UNETでHPを画面に表示し、Playerへダメージを与える【UNET9】
【Unity9】UNETでHPが0以下になった時、Playerを破壊する!【UNET10】
【Unity9】UNETで死んだPlayerを生き返らせる!【UNET11】
【Unity9】UNETでゾンビAIを出現させる!【UNET12】
【Unity9】UNETでゾンビ生成時にユニークなIDを付ける!【UNET13】
【Unity9】UNETでゾンビを撃つ!【UNET14】
【Unity9】UNETでゾンビに攻撃させる!【UNET15】
【Unity9】UNETでゾンビの動きをスムーズにシンクロさせる!【UNET16】
【Unity9】UNETでゾンビ発生地点を増やす【UNET17】
【Unity9】UNETで発生したバグを取り除く【UNET18】
【Unity9】Unity MultiPlayerを使ってネットワーク越しにマッチメイキング!【UNET19】
【Unity9】GUIを改善して、Network Managerを見やすくする!【UNET20】
【Unity9】表示したGUI(Network Manager)を機能させる!【UNET20-2】
【Unity9】UNETでAnimationを同期させる!【UNET21】