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

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

【Unity9】UNETのlatency(遅延時間)を表示して、ちょっとだけ改善する【UNET4-2】

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


スポンサーリンク

Unity5.1.1p3 Personal(2015年7月)


前回の続きです〜


今回もまたlatencyに関してで、遅延時間を画面に表示していきます〜



UNET Part 4 - Latency Simulation! - YouTube

【目標】latency(遅延時間)を表示して、ちょっとだけ改善する

①latency(遅延時間)を画面に表示する

まずはlatencyを表示するためのTextを作成します〜Textについては以下エッセンスをご参照下さい〜


hiyotama.hatenablog.com


まずはMainシーンを開き、HierarchyビューのCreate > UI > Textを選択し、名前をLatency Textに変更します〜


f:id:hiyotama:20150707165339p:plain
Latency Text作成


Anchor Presetsは左下にし、Best Fitをtrueにして下さい〜


f:id:hiyotama:20150707165605p:plain


続いてlatencyを取得するためのスクリプト修正です〜
latencyはNetworkClientのGetRTTメソッドで取得そうです〜詳細は公式サイトのマニュアルに書いてあります〜
というわけで、以下ソースです〜

using UnityEngine;
using System.Collections;
using UnityEngine.Networking;
//********** 開始 **********//
//GUI表示用ライブラリ
using UnityEngine.UI;
//********** 終了 **********//

public class Player_SyncPosition : NetworkBehaviour {
	
	[SyncVar]
	private Vector3 syncPos;
	[SerializeField] Transform myTransform;
	[SerializeField] float lerpRate = 15;

	private Vector3 lastPos;
	private float threshold = 0.5f;
//********** 開始 **********//
	private NetworkClient nClient;
	private int latency; //遅延時間
	private Text latencyText; //遅延時間表示用テキスト
	
	void Start ()
	{
		//NetworkClientとTextをキャッシュする
		nClient = GameObject.Find("NetworkManager").GetComponent<NetworkManager>().client;
		latencyText = GameObject.Find("Latency Text").GetComponent<Text>();
	}
//********** 終了 **********//

	void Update ()
	{
		LerpPosition();
//********** 開始 **********//
		ShowLatency();
//********** 終了 **********//
	}

	void FixedUpdate ()
	{
		TransmitPosition(); 
	}
	
	void LerpPosition ()
	{
		if (!isLocalPlayer) {
			myTransform.position = Vector3.Lerp(myTransform.position, syncPos, Time.deltaTime * lerpRate);
//			Debug.Log(Time.deltaTime.ToString());
		}
	}

	[Command]
	void CmdProvidePositionToServer (Vector3 pos)
	{
		syncPos = pos;
//		Debug.Log("Command");
	}
	
	[ClientCallback]
	void TransmitPosition ()
	{
		if (isLocalPlayer && Vector3.Distance(myTransform.position, lastPos) > threshold) {
			CmdProvidePositionToServer(myTransform.position);
			lastPos = myTransform.position;
		}
	}
	
//********** 開始 **********//
	void ShowLatency ()
	{
		if (isLocalPlayer) {
			//latencyを取得
			latency = nClient.GetRTT();
			//latencyを表示
			latencyText.text = latency.ToString();
		}
	}
//********** 終了 **********//
}

Player_SyncPosition.cs


NetworkClientのGetRTTを使って遅延時間(1/1000秒で取得)を取得し、表示しています〜
遅延時間を画面に表示するだけなので、ShowLatencyメソッドはUpdateでもFixedUpdateでもどちらから呼び出してもOKです〜


それではビルド側をホストに、開発画面側をクライアントにして、ゲームを実行して下さい〜


f:id:hiyotama:20150707171146p:plain
409=0.409秒の遅延


クライアントからホストへデータを送り、ホストからデータが返ってくるまでに、0.4秒かかってしまっているようです〜これはかなり遅いようです〜choppy(とぎれとぎれ)な感じになっています〜

②sendIntervalを変更して同期をスムーズにする

遅延時間が画面に表示されるようになったので、次は遅延をなるべくなくしていきましょう〜


cannnelを使うため、先ほど少しだけ触れたAdvanced Configurationを有効にします〜


f:id:hiyotama:20150707172409p:plain


Timeoutsの部分についても動画では少し触れています〜恐らくここでは、回線速度が落ちた時に接続を切る基準を設定できます〜


続いてPlayer_SyncPositionスクリプトにNetworkSettingsを加えて、channelとsendIntervalを設定していきます〜

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

//********** 開始 **********//
[NetworkSettings(channel=0, sendInterval=0.033f)]
//********** 終了 **********//
public class Player_SyncPosition : NetworkBehaviour {

		〜省略〜

}

Player_SyncPosition.cs


NetworkSettingsをクラス名の上に一行追加しただけです〜
sendIntervalは、インターバルというだけあってデータの送信と送信の間の時間だと思うのですが、よく分かりません〜


NetworkSettings情報は、Inspectorビューからも確認できます〜


f:id:hiyotama:20150707173713p:plain
NetworkSettings情報


それではゲームを動かしてみて確認してみましょう〜


f:id:hiyotama:20150707173828p:plain
なんとなく軽減したような・・・


若干よくなった感じはありますが、正直あまり変化はありませんでした〜
UNET動画進めていく中で少しずつ改善されていくのでしょうか〜

③傾きのスクリプトにも適用する

次にPlayer_SyncRotationスクリプトにも同じ処理を追加していきます〜以下ソースです〜

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

public class Player_SyncRotation : NetworkBehaviour {

	[SyncVar] private Quaternion syncPlayerRotation;
	[SyncVar] private Quaternion syncCamRotation;
	
	[SerializeField] private Transform playerTransform;
	[SerializeField] private Transform camTransform;
	[SerializeField] private float lerpRate = 15;
	
	private Quaternion lastPlayerRot;
	private Quaternion lastCamRot;
	private float threshold = 5;
	
	void Start () {
	
	}

//********** 開始 **********//
	void Update ()
	{
		LerpRotations();
	}
//********** 終了 **********//
	
	void FixedUpdate () {
		TransmitRotations();
	}

		〜省略〜

}

Player_SyncRotation.cs


Time.deltaTimeが使われてるLerpRotationsメソッドを、Updateメソッドから呼び出すようにしました〜

④プレイヤー同士の衝突判定を有効にする

プレイヤー同士の衝突が無効になっているので、これを有効にしましょう〜


まずはPlayerプレハブのCharacter Controllerを有効にします〜


f:id:hiyotama:20150707175339p:plain
チェックして有効にする


次にPlayer_NetworkSetupの修正をします〜以下ソースです〜

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

public class Player_NetworkSetup : NetworkBehaviour {
	[SerializeField]Camera FPSCharacterCam;
	[SerializeField]AudioListener audioListener;

	void Start ()
	{
		if (isLocalPlayer) {
			GameObject.Find("Scene Camera").SetActive(false);
//********** コメントアウト **********//
//			GetComponent<CharacterController>().enabled = true;
//********** コメントアウト **********//
			GetComponent<UnityStandardAssets.Characters.FirstPerson.FirstPersonController>().enabled = true;
			FPSCharacterCam.enabled = true;
			audioListener.enabled = true;
		}
	}
}

CharacterControllerを有効にしている処理をコメントアウトしました〜


以上でプレイヤー間の衝突が有効になりました〜


f:id:hiyotama:20150707175737p: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】