天天看點

Unity Unet元件、方法探索兩個基本元件Prefab上的元件方法标志方法

兩個基本元件

NetworkManager

基本元件,主要功能是實作聯網的基本功能 。

基本屬性

SpawnInfo屬性集

  • PlayerPrefab=>用戶端加入時自動生成的Prefab
  • AutoCreatePlayer=>自動生成Prefab。
  • PlayerSpawnMethod=>Prefab的生成方法,兩個選項。使用這個方法首先要有指定的位置。(NetworkStartPosition)
    • Random=>随機生成
    • RoundRobin=>輪詢,在指定的地點輪流生成
  • RegisteredSpawnablePrefabs=>在這個數組中放置的Prefab是需要在網絡中生成的,加入到這個數組中,才可以在網絡中同步生成。

NetworkManagerHUD

一個測試用的連結UI界面,可以在測試時使用,但是在真正的遊戲中不會保留。

Prefab上的元件

NetworkIdentity

NetworkIdentity元件表明這個預設體是一個網絡對象,可以設定這個預設體是在用戶端生成還是隻在伺服器端生成

  • ServerOnly=>隻在伺服器端生成,不會在用戶端批量生成
  • LocalPlayerAuthority=>如果這個對象是由擁有它的用戶端控制的,本地玩家對象在這個用戶端擁有它的權限,這個屬性常被其他元件使用例如Networktransfrom。

NetworkTransform

同步對象在所有用戶端上的Transform屬性,可以選擇同步Rigidbody屬性

  • NetworkSendRate(seconds)=>同步的評論,0代表在生成是同步一次
  • TransformSyncMode=>同步的元件
    • SyncNone=>不同步其他元件
    • SyncTransform=>同步Transform元件,就算不選,也會同步
    • SyncRigidbody2D=>同步Rigidbody2D元件,
    • SyncRigidbody3D=>同步Rigidbody3D元件

NetworkStartPosition

這個元件是将這個對象的位置作為Player生成的位置

方法

引用新的父類

引用UnityEngine.Networking,并使對象繼承自NetworkBehaviour

using UnityEngine.Networking;
public class PlayerControler : NetworkBehaviour {
           
  1. bool 類型 isLocalPlayer,如果這個對象是辨別本地機器上的播放的那個對象,則傳回值為真
  2. bool 類型 isServer,如果這個對象是伺服器,則為真
  3. bool 類型 isClient,如果這個對象運作在用戶端的話,則為真

    與player有關的都用localPlayer處理,與player無關的,用伺服器處理

  4. 方法OnStartLocalPlayer(){}在伺服器聯入時并且遊戲開始時調用,相當于普通的Start方法。

    public override void OnStartLocalPlayer() {}

  5. NetworkServe.Spawn(Prefab);将Prefab同步到所有的用戶端上。在所有已準備好的用戶端上同步給定的遊戲對象的生成,注意,這個方法并不會同步物體的移動。

标志方法

[Command]

[Command]的功能是标志以下的方法隻能在伺服器端調用,用戶端調用該方法時,會自動調用伺服器端的方法。

要求,這個方法必須以Cmd開頭,且不能是靜态方法。

[ClientRpc]

[ClientRpc]的功能是标志的以下方法隻能在用戶端調用,伺服器調用該方法時,也會在用戶端調用。

要求,這個方法Rpc開頭

[SyncVar(hook=”OnChangeHealth”)]

[SyncVar]标記是作用在屬性前的,作用是同步該屬性到所有的用戶端和伺服器端。

這個标記中可以增加方法=>[SyncVar(hook=”FunctionName”)],引号中是方法名。當标記的資料值發生變化時,會自動調用引号中的方法,同時将變化後的屬性那個值調用到這個方法中。

[SyncVar(hook="OnChangeHealth")]//同步該資料,并在資料發生變化時,調用該方法,同時,這個資料也會被調用到該方法中。
private int currentHealth = MaxHealth; 
void OnChangeHealth(int health) {
    healthSlider.value = health / (float)MaxHealth;
}