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

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

【Unity9】UNETでネットワーク越しに傾き(Rotation)を同期させる【UNET2】

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


スポンサーリンク

Unity5.1.1f1 Personal(2015年7月)


前回の続きです〜


今回はオブジェクトの傾き(Rotation)を、プレイヤー間で同期していきます〜



UNET Part 2 - Rotation Syncing - YouTube

【目標】オンラインで傾き(Rotation)を同期させる

①Menuシーン設定

まずはMainシーンに作成したNetworkManagerをMenuシーンへ移します〜


f:id:hiyotama:20150706163553p:plain
MainシーンのNetworkManagerをコピー


f:id:hiyotama:20150706163708p:plain
Menuシーンへ移動しNetworkManagerをペースト


f:id:hiyotama:20150706164145p:plain
OfflineにMenuシーン、OnlineにMainシーンを指定


コピーが完了したらMainシーンへ戻り、NetworkManagerを削除します〜


以上でMenuシーンからMainシーンへ遷移した時にNetworkManagerを引き継ぐ設定が完了しました〜

②ライトの設定

続いて、今の状態だとライト関係でバグがあるらしいので、ライトの設定をしていきます〜(どのようなバグなのかは分かりませんでした〜)


MainシーンにてWindow > Lightingを選択して下さい〜


f:id:hiyotama:20150706164844p:plain
Windows > Lighting


続いてLightingビューのLightmapsを選択し、Autoのチェックを外し、Buildボタンを押します〜


f:id:hiyotama:20150706165224p:plain
Buildボタンをクリック!


これでMainシーンのProjectビューにLightMapデータ作成されます〜
と同時に、バグも治ったようです〜


f:id:hiyotama:20150706170625p:plain
LightMapデータ作成

③傾き(Rotation)を同期させる

いよいよ本題です〜


まずはPlayerプレハブをHierarchyビューに一旦戻し


f:id:hiyotama:20150706171003p:plain
ドラッグ&ドロップ!


FIrstPersonCharacterはプレイヤーが歩いている感じを出すために、移動中Position.xとyを微妙に変化させ、画面を揺らしています〜
CubeをFIrstPersonCharacterの子オブジェクトにして、Cubeにの位置に微妙な変化を付け加えましょう〜


f:id:hiyotama:20150706172200p:plain
Cubeを子オブジェクトにする


続いてFirstPersonCharacterのPositionを微調整します〜


f:id:hiyotama:20150706172708p:plain


ここまで完了したら、Rotationを同期させるスクリプトPlayer_SyncRotationを作成してPlayerに取り付けて下さい〜

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

public class Player_SyncRotation : NetworkBehaviour {

	//SyncVar: ホストサーバーからクライアントへ送られる
	//プレイヤーの角度
	[SyncVar] private Quaternion syncPlayerRotation;
	//FirstPersonCharacterのカメラの角度
	[SyncVar] private Quaternion syncCamRotation;
	
	[SerializeField] private Transform playerTransform;
	[SerializeField] private Transform camTransform;
	[SerializeField] private float lerpRate = 15;
	
	// Use this for initialization
	void Start () {
	
	}
	
	// Update is called once per frame
	void FixedUpdate () {
		//クライアント側のPlayerの角度を取得
		TransmitRotations();
		//現在角度と取得した角度を補間する
		LerpRotations();
	}
	
	//角度を補間するメソッド
	void LerpRotations ()
	{
		//自プレイヤー以外のPlayerの時
		if (!isLocalPlayer){
			//プレイヤーの角度とカメラの角度を補間
			playerTransform.rotation = Quaternion.Lerp (playerTransform.rotation,
				syncPlayerRotation, Time.deltaTime * lerpRate);
			camTransform.rotation = Quaternion.Lerp (camTransform.rotation,
				syncCamRotation, Time.deltaTime * lerpRate);
		}
	}
	
	//クライアントからホストへ送られる
	[Command]
	void CmdProvideRotationsToServer (Quaternion playerRot, Quaternion camRot)
	{
		syncPlayerRotation = playerRot;
		syncCamRotation = camRot;
	}
	
	//クライアント側だけが実行できるメソッド
	[Client]
	void TransmitRotations ()
	{
		if (isLocalPlayer) {
			CmdProvideRotationsToServer(playerTransform.rotation, camTransform.rotation);
		}
	}	
}

Player_SyncRotation.cs


まずはSerializeFieldの変数2つを、Inspectorビューから指定します〜


f:id:hiyotama:20150706182131p:plain
ドラッグ&ドロップ!


スクリプトではPlayerの傾きと、FIrstPersonCharacterのカメラの傾きの同期をとっています〜


前回のPlayer_SyncPositionとやっていることは同じです〜

FixedUpdateからTransmitRotationメソッドを呼ぶ
クライアントサーバーを使っている時、オブジェクトが自プレイヤーである場合、CmdProvideRotationsToServerメソッドを呼び出す
CmdProvideRotationsToServerメソッドにて、自プレイヤーとカメラの角度をSyncVarの変数に保存する
全プレイヤー分のSyncVar変数を、ホストからクライアントへ送信する
LerpRotationメソッドにて、他プレイヤーの現在の傾きとSyncVar変数の傾きとの中間値を補間する


違いといえば[Client]と[ClientCallback]の違いだけですが、今はまだよく分かりません〜
そのうち分かってきたら補足していきたいと思います〜


とりあえず、プレイヤーの角度とカメラの角度を補間し、なめらかに動かすことができるようになりました〜


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