【Unity9】UNETのlatency(遅延時間)を表示して、ちょっとだけ改善する【UNET4-2】
Unity5.1.1p3 Personal(2015年7月)
前回の続きです〜
今回もまたlatencyに関してで、遅延時間を画面に表示していきます〜
UNET Part 4 - Latency Simulation! - YouTube
【目標】latency(遅延時間)を表示して、ちょっとだけ改善する
①latency(遅延時間)を画面に表示する
まずはlatencyを表示するためのTextを作成します〜Textについては以下エッセンスをご参照下さい〜
まずはMainシーンを開き、HierarchyビューのCreate > UI > Textを選択し、名前をLatency Textに変更します〜
Latency Text作成
Anchor Presetsは左下にし、Best Fitをtrueにして下さい〜
続いて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です〜
それではビルド側をホストに、開発画面側をクライアントにして、ゲームを実行して下さい〜
409=0.409秒の遅延
クライアントからホストへデータを送り、ホストからデータが返ってくるまでに、0.4秒かかってしまっているようです〜これはかなり遅いようです〜choppy(とぎれとぎれ)な感じになっています〜
②sendIntervalを変更して同期をスムーズにする
遅延時間が画面に表示されるようになったので、次は遅延をなるべくなくしていきましょう〜
cannnelを使うため、先ほど少しだけ触れたAdvanced Configurationを有効にします〜
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ビューからも確認できます〜
NetworkSettings情報
それではゲームを動かしてみて確認してみましょう〜
なんとなく軽減したような・・・
若干よくなった感じはありますが、正直あまり変化はありませんでした〜
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を有効にします〜
チェックして有効にする
次に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を有効にしている処理をコメントアウトしました〜
以上でプレイヤー間の衝突が有効になりました〜
有効だから上に乗れる
今回はここまでです〜
ありがとうございました〜
【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】