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

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

【Unity9】UNETでプレイヤーの動きを補間し、なめらかな動きを実現する【UNET1-2】

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


スポンサーリンク

Unity5.1.1f1 Personal(2015年7月)


前回の続きです〜


前回までで自プレイヤーの動きと相手プレイヤーの動きとを別々に切り離すことができるようになりました〜
しかしまだ動きがカクカクした感じなので、動きをよりなめらかに表示する処理を加えていきます〜


UNET Part 1 - Setup and Movement Syncing - YouTube

【目標】プレイヤーの動きを補間し、オンラインでも動きをなめらかに表示する

①フレームとフレームの間の動きを補完する
カクカクした動きの原因として、フレームの間の動きが補間されていないことがあげられます〜


まずはPlayerプレファブについているNetwork TransformコンポーネントをRemove Componentで取り外し、動きを補完する「Player_SyncPosition」スクリプトを新たに作成して取り付けていきます〜以下ソースです〜

using UnityEngine;
using System.Collections;
using UnityEngine.Networking; //UNETを使う時に必要なライブラリ

//UNETを使う時に必要な継承
public class Player_SyncPosition : NetworkBehaviour {
	
	[SyncVar]	//ホストから全クライアントへ送られる
	private Vector3 syncPos;
	//Playerの現在位置
	[SerializeField] Transform myTransform;
	//Lerp: 2ベクトル間を補間する
	[SerializeField] float lerpRate = 15;

	void FixedUpdate ()
	{
		TransmitPosition(); 
		LerpPosition();	//2点間を補間する
	}
	
	//ポジション補間用メソッド
	void LerpPosition ()
	{
		//補間対象は相手プレイヤーのみ
		if (!isLocalPlayer) {
			//Lerp(from, to, 割合) from〜toのベクトル間を補間する
			myTransform.position = Vector3.Lerp(myTransform.position, syncPos, Time.deltaTime * lerpRate);
		}
	}
	//クライアントからホストへ、Position情報を送る
	[Command]
	void CmdProvidePositionToServer (Vector3 pos)
	{
		//サーバー側が受け取る値
		syncPos = pos;
	}
	
	//クライアントのみ実行される
	[ClientCallback]
	//位置情報を送るメソッド
	void TransmitPosition ()
	{
		if (isLocalPlayer) {
			CmdProvidePositionToServer(myTransform.position);
		}
	}
}

Player_SyncPosition.cs



自分がクライアントである場合、FixedUpdateメソッドにてTransmitPositionが呼び、現在位置をCmdProvidePositionToServerメソッドへ送る
CmdProvidePositionToServerメソッドでSyncPos変数に現在位置を保存する
保存されたSyncPos変数がホストから全クライアントへ送り返される
LerpPositionメソッドにて自分以外の全プレイヤーの現在位置とTransmitPosition送信時の位置の中間地点を、現在の位置情報に書き換える


正直自信はないですが、こんな感じのことをやっているのではないでしょうか〜
このスクリプト内容をよくご存知の方がいらっしゃいましたら、もしよければコメントして頂けると助かります〜


それではSerializeFieldのmyTransformに、Playerプレハブを指定してあげましょう〜


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


プレイヤーが移動する時のフレーム間を位置情報が補間されるようになったので、よりスムーズな動きとなっているはずです〜


f:id:hiyotama:20150706152155p:plain
スムーズに動いてくれてます


もちろん画像では分からないですので、皆さんぜひ試してみて下さい〜


ちなみに前回うまくいかなかったNetwork Managerにシーンを指定する部分ですが、Build Settingsにてシーンを追加するとちゃんと指定できるようになりました〜


f:id:hiyotama:20150706162848p:plain
シーンをAdd Currentすると


順番は、上にMenuシーン、下にMainシーンが来るようにして下さい〜
以上でNetworkManagerにシーンを指定できるようになりました〜


指定できます


それでは、今回はここまでです〜

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


【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】