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

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

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

【Unity9】UNETでゾンビの動きをスムーズにシンクロさせる!【UNET16】

Unity UNET チュートリアル

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


スポンサーリンク

Unity5.1.1p3 Personal(2015年7月)


前回の続きです〜


今回はゾンビの動きをよりスムーズにし、ネットワーク越しのシンクロ率を高めていきます〜



UNET Part 16 - Zombie Motion Sync - YouTube

【目標】ゾンビの動きをスムーズにシンクロさせる!

①Zombie_MotionSyncスクリプトを新規作成

ゾンビの動きを同期させるZombie_MotionSyncスクリプトを作成します〜

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

public class Zombie_MotionSync : NetworkBehaviour {
	
	//全クライアントへ送信するTransform情報
	[SyncVar] private Vector3 syncPos;
	[SyncVar] private float syncYRot;
	
	//1つ前のTransform情報
	private Vector3 lastPos;
	private Quaternion lastRot;
	
	//現在位置
	private Transform myTransform;
	//補間率
	private float lerpRate = 10;

	//補間する際のしきい値
	private float posThreshold = 0.5f;
	private float rotThreshold = 5;
	
	
	void Start () {
		myTransform = transform;
	}
	
	void Update () {
		TransmitMotion();
		LerpMotion();
	}
	
	void TransmitMotion ()
	{
		if (!isServer) {
			return;
		}
		
		//Transform情報が1つ前と比べてThreshold(しきい値)より大きい時
		if(Vector3.Distance(myTransform.position, lastPos) > posThreshold ||
			Quaternion.Angle(myTransform.rotation, lastRot) > rotThreshold){
			lastPos = myTransform.position;
			lastRot = myTransform.rotation;
			
			
			//SyncVar変数を変更し、全クライアントと同期を図る
			syncPos = myTransform.position;
			//localEulerAngles: Quaternion→オイラー角(360度表記)
			syncYRot = myTransform.localEulerAngles.y;
			
		}
	}
	
	//現在のTransform情報とSyncVar情報とを補間する
	void LerpMotion ()
	{
		if (isServer) {
			return;
		}
		
		//位置情報の補間
		myTransform.position = Vector3.Lerp(myTransform.position, syncPos, Time.deltaTime * lerpRate);
		
		//Y軸のみ変える
		Vector3 newRot = new Vector3(0, syncYRot, 0);
		
		//角度の補間
		//Euler: オイラー角→Quaternion
		myTransform.rotation = Quaternion.Lerp(myTransform.rotation, Quaternion.Euler(newRot), Time.deltaTime * lerpRate);
	}
}

Zombie_MotionSync.cs


やっていることはPlayer_SyncPositionスクリプトやPlayer_SyncRotationスクリプトと全く同じで、LerpMotionメソッドでTransform情報を補間しながら、TransmitMotionメソッドでTransform情報を全クライアントに送信し、同期をとっている感じです〜

【Unity9】UNETでプレイヤーの動きを補間し、なめらかな動きを実現する【UNET1-2】 - Unity5(C#)初心者・入門者向けチュートリアル ひよこのたまご
【Unity9】UNETでオンライン開始時のプレイヤー生成位置を変更する【UNET2-2】 - Unity5(C#)初心者・入門者向けチュートリアル ひよこのたまご


スクリプトが完成したら、Zombieプレハブに取り付けて下さい〜また、現在付いているNetwork TransformコンポーネントはRemove Componentで取り除いて下さい〜


f:id:hiyotama:20150717162916p:plain
Zombie_MotionSyncを取り付け、Network Transformを取り除く

②結果

それではホストとクライアントでゲームを実行してみましょう〜


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