Unity自5.1以后支持新版的網(wǎng)絡(luò)系統(tǒng)Unet,Unet是什么,優(yōu)缺點(diǎn)是什么,和以前的網(wǎng)絡(luò)系統(tǒng)有什么區(qū)別,請(qǐng)自行去百度。本篇要實(shí)現(xiàn)的功能是創(chuàng)建網(wǎng)絡(luò)游戲的Player主角,以及實(shí)現(xiàn)移動(dòng)同步。本教程來(lái)源于愛(ài)奇藝上的Unet教程,由于是英文視頻,so對(duì)于很多人來(lái)說(shuō)......,所以就準(zhǔn)備出一些對(duì)應(yīng)的中文教程,來(lái)幫助初學(xué)者(偶也是初學(xué)者,若是分享的技術(shù)有誤,還望指出)。廢話不多說(shuō)了,進(jìn)入正題。
一 首先創(chuàng)建一個(gè)空對(duì)象,名字為NetworkManager,為其添加組件Network Manager HUD和Network Manager。
此處插入對(duì)這二個(gè)組件的介紹
NetworkManager是一個(gè)組件,用來(lái)管理網(wǎng)絡(luò)多人游戲的狀態(tài)。它實(shí)際上是完全使用HLAPI實(shí)現(xiàn),所以它所做的一切程序員可以使用其他方式實(shí)現(xiàn)。然而,NetworkManager封裝好了很多有用的功能到一個(gè)地方,使創(chuàng)建、運(yùn)行和調(diào)試多人游戲盡可能簡(jiǎn)單。NetworkManager可以使用使其完全沒(méi)有腳本。在編輯器的檢視面板,允許配置它的所有特性。NetworkManagerHUD供應(yīng)一個(gè)簡(jiǎn)單的、默認(rèn)的用戶界面,允許網(wǎng)絡(luò)游戲在運(yùn)行時(shí)由用戶控制。更先進(jìn)的用法,開(kāi)發(fā)人員可以從派生一個(gè)類繼承自NetworkManager,并且自定義其行為通過(guò)重寫(xiě)任何它所提供的虛擬函數(shù)。
二 創(chuàng)建主角,我在這里創(chuàng)建一個(gè)Cube作為主角player,首先player是一個(gè)網(wǎng)絡(luò)物體,所以我們要先要為其添加Network Identity 組件,標(biāo)識(shí)網(wǎng)絡(luò)身份。并且勾選Local Player Authority,授權(quán)本地玩家。再為其添加腳本名為PlayerController,來(lái)控制人物的移動(dòng),代碼如下:
[csharp] view plain copy
using UnityEngine;
using System.Collections;
using UnityEngine.Networking;
public class PlayerController : NetworkBehaviour {
// Update is called once per frame
void Update () {
//判斷是不是本地玩家(自己只能控制自己的玩家,不能控制別人的玩家)
if (isLocalPlayer == false) {
return;
}
//獲取鍵盤橫軸的值
float h = Input.GetAxis ("Horizontal");
//獲取鍵盤縱軸的值
float v = Input.GetAxis ("Vertical");
//主角左右移動(dòng)
transform.Translate (Vector3.right*h*3*Time.deltaTime);
//主角前后移動(dòng)
transform.Translate (Vector3.forward*v*3*Time.deltaTime);
}
}
三. 將Hierarchy面板中的Cube,拖入Project面板中作為一個(gè)預(yù)設(shè)體,并且刪去Hierarchy面板中的Cube,將預(yù)設(shè)體Cube拖入Network Manager 中Player Prefab的位置,如圖所示:
四. 現(xiàn)在開(kāi)啟二個(gè)運(yùn)行程序,一個(gè)作為L(zhǎng)AN Host(主機(jī)),一個(gè)作為L(zhǎng)AN Client(客戶端)
/
五 . 到這一步為主,大家可以自己控制自己創(chuàng)建出來(lái)的游戲主角了,然而問(wèn)題是移動(dòng)之后并沒(méi)有進(jìn)行位置同步,你在本地進(jìn)行移動(dòng),并不能同步給其余客戶端。如何解決這個(gè)問(wèn)題呢?最簡(jiǎn)單的就是在Cube主角身上添加Network Transform組件,并且設(shè)置Transform Sync Mode 為 Sync Transform。如圖所示:
六 . 現(xiàn)在已經(jīng)實(shí)現(xiàn)了,創(chuàng)建主角并且實(shí)現(xiàn)同步的功能,不過(guò)我們玩點(diǎn)不一樣的,我們不使用Network Transfrom 組件來(lái)進(jìn)行位置同步,我們自己寫(xiě)腳本來(lái)實(shí)現(xiàn)位置同步,首先先去掉Network Transform組件,為Cube添加腳本名為SynMove。代碼如下:
[csharp] view plain copy
using UnityEngine;
using System.Collections;
using UnityEngine.Networking;
public class SynMove : NetworkBehaviour {
//當(dāng) SyncVar 發(fā)生改變時(shí),UNet 會(huì)從 Server 端向所有有效的 Client 端發(fā)送這些改變。注意這里的方向,是從 Server 到 Client ,而不是從 Client 到 Server 的方向。
[SyncVar]
private Vector3 synPos;
[SerializeField]Transform myTransform;
[SerializeField]float lerpRate = 15;
// Update is called once per frame
void FixedUpdate () {
TransmitPosition ();
LerpPosition ();
}
void LerpPosition(){
//不是本地玩家
if (!isLocalPlayer) {
//非本地玩家的位置進(jìn)行更新
myTransform.position = Vector3.Lerp (myTransform.position,synPos,Time.deltaTime*lerpRate);
}
}
[Command]
//命令, 在客戶端調(diào)用,但是在服務(wù)端運(yùn)行,這是方法必須以 Cmd 開(kāi)頭
void CmdProvidePositionToServer(Vector3 pos){
//在服務(wù)器上為synPos 同步變量賦值
synPos = pos;
}
[ClientCallback]
//只在客戶端調(diào)用
void TransmitPosition(){
//是本地玩家
if (isLocalPlayer) {
//就把本地玩家的位置傳給服務(wù)器
CmdProvidePositionToServer (myTransform.position);
}
}
}
七 . 在Inspector面板中,將Cube主角拖入到 My Transform中,如圖所示:
第一部教程結(jié)束啦,拜拜。