UNet實(shí)戰(zhàn)系列(一)

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é)束啦,拜拜。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容