2017-04-26 164 views
1

我正在使用UNet。現場有兩名玩家。其中之一就是服務器其中之一就是客戶端。我可以用[Command]和[ClientRPC]獲得客戶端數據,但是我無法將數據從服務器發送到客戶端,我該如何解決這個問題? 注意:服務器也是一個播放器。如何使用Unity Unet將數據從服務器發送到客戶端

下面是從客戶端到服務器的代碼我發送數據:

[Command] 
    void CmdSendDizilimToServer(string dizilim){ 
     if (isLocalPlayer) 
      RpcSetPlayerDizilim(dizilim); 
     else 
      this.Sira = dizilim; 
    } 
[ClientRpc] 
    void RpcSetPlayerDizilim(string dizilim){ 
     this.Sira = dizilim; 
    } 

'Dizilim' 是指 '序列'。 'Sira'的意思是'訂購'。

其實在服務器和客戶端都有自己的'Order'字符串。當遊戲開始時,一個gameobject產生了。我想服務器獲取客戶'訂單'腳本(我可以做到這一點)客戶端獲得服務器'訂單'字符串(我不能這樣做)。我該如何解決這個問題?

這是我的球員產生了腳本對象:

using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 
using System.IO; 
using UnityEngine.Networking; 

public class MultiPlayerOyunKontrol : NetworkBehaviour { 
    CreateCharacter cc; 
    public string Sira; 
    GameObject EnemyObject; 
    [SyncVar (hook = "DizilimGetir")] 
    string OyuncuDizilimi; 
    // Use this for initialization 
    void Start() { 
     if (!isLocalPlayer) 
     { 
      this.gameObject.name = "Oyuncu2"; 
      OyuncuDizilimi = PlayerPrefs.GetString("Player Dizilim"); 
     } 
     else 
      gameObject.name = "Oyuncu1"; 


    } 

    // Update is called once per frame 
    void Update() { 

    } 


    public override void OnStartLocalPlayer(){ 
     //CmdSendNameToServer (PlayerPrefs.GetString("Player Name")); 
     CmdSendDizilimToServer (PlayerPrefs.GetString ("Player Dizilim")); 

    } 
    [Command] 
    void CmdDusmanAktif(){ 
     RpcAktiflestir(); 

    } 
    [Command] 
    void CmdSendNameToServer(string nameToSend) 
    { 
     RpcSetPlayerName(nameToSend); 
    } 
    [Command] 
    void CmdSendDizilimToServer(string dizilim){ 
     if (isLocalPlayer) 
      RpcSetPlayerDizilim(dizilim); 
     else 
      this.Sira = dizilim; 
    } 
    [ClientRpc] 
    void RpcAktiflestir(){ 
     EnemyObject = GameObject.FindGameObjectWithTag ("DusmanKarakterleri"); 
     EnemyObject.SetActive (true); 
    } 
    [ClientRpc] 
    void RpcSetPlayerName(string name) 
    { 
     this.gameObject.name = name; 
    } 
    [ClientRpc] 
    void RpcSetPlayerDizilim(string dizilim){ 
     this.Sira = dizilim; 
    } 
    void DizilimGetir(string dizilim) { 
     if(!isLocalPlayer) 
     this.Sira = dizilim; 
    } 


} 

回答

0

我解決我的問題。當客戶端派生OnStartLocalPlayer()時觸發,但僅用於服務器。服務器可以讀取客戶端數據,但客戶端無法觸發該功能。我寫這個代碼。

private void OnGUI() 
    { 
     if (isLocalPlayer) 
     { 
      if (GUI.Button(new Rect(0, 500, 100, 100), "Gonder")) 
      { 
       CmdSendDizilimToServer(PlayerPrefs.GetString("Player Dizilim")); 
      } 
     } 
    } 

之後,當我點擊按鈕客戶端可以讀取服務器數據。

+0

我有類似的問題發佈在[這個問題](https://stackoverflow.com/questions/48487614/unity-networking-how-can-i-sync-vars-on-all-clients)。我看到了你的答案,但我不明白你如何從服務器讀取變量狀態。你能更好地解釋如何從客戶端檢索由服務器控制的對象的值嗎?在我的情況下,我不使用'OnGUI()'。 – SebasSBM

相關問題