2017-06-30 14 views
0

私はSyncVarを使用しようとしていますが、間違っていると私が間違っていることを完全に理解していません。サーバー側のUNET SyncVarは更新されていません

1)私は、2つのパブリックSyncVarの持っている:Cmd_UpdateXxxを使用することによって、私はスタートでSyncVarを開始

2)と比較するredFundsとblueFundsと2つのローカル「古い」-versionは、

の作品ここで状況があります

3)各SyncVarに1つのボタンが2つあります

4)アップデートでは、SyncVarとoldXxxFundsを比較します。ヒットiが場面に表示された場合

コードを実行すると、両方のプレーヤー(赤&青)のシーンに正しい数字が表示されますが、これはエディターで完全に反映されません。「公開」SyncVar 。赤いボタンを押すと、エディターで青色ではなく赤いプレーヤーだけが反映されます。

ここで間違っていることを誰かに説明することはできますか? ...もし私が何か間違っているとすれば。私はエディタでも変更を見るべきではありませんか?

[SyncVar] public int redFunds; 
[SyncVar] public int blueFunds; 
public int oldRedFunds; 
public int oldBlueFunds; 



void Start() { 

if (!isLocalPlayer) 
     return; 
Cmd_UpdateRed (10); 
Cmd_UpdateBlue (20); 

} 


// Button 
void btn_Red() { 
if (!hasAuthority) 
     return; 
Cmd_UpdateRed (10000); 
} 

void btn_Blue() { 
if (!hasAuthority) 
     return; 
Cmd_UpdateBlue (20000); 
} 

[Command] 
void Cmd_UpdateRed (int _value) { 
redFunds = _value; 
} 

[Command] 
void Cmd_UpdateBlue (int _value) { 
blueFunds = _value; 
} 

void Update() { 

if (redFunds != oldRedFunds) { 

    txt_RedTotalFunds = GameObject.Find ("txt_RedTotalFunds").GetComponent<Text>(); 
    txt_RedTotalFunds.text = "$" + redFunds; 
    oldRedFunds = redFunds; 
} 

if (blueFunds != oldBlueFunds) { 

    txt_BlueTotalFunds = GameObject.Find ("txt_BlueTotalFunds").GetComponent<Text>(); 
    txt_BlueTotalFunds.text = "$" + blueFunds; 
    oldBlueFunds = blueFunds; 
} 

} 
+0

そのスクリプトを持つオブジェクトはいくつあり、所有者は誰ですか? – Fenixrw

+0

@Fenixrwこれは4つのオブジェクトで、このコードが存在するプレイヤーです。 – PeterK

+0

ここでいくつかのテストを行い、問題が見つかるかどうか確認します。 – Fenixrw

答えて

1

私が考えることができる最も良い方法は、GameRoomInfoをサーバーが所有するネットワークオブジェクトとして使用することです。

次のようにそれは2つのシンプルなスクリプトで行うことができます。

GameRoomInfoスクリプト

using UnityEngine; 
using UnityEngine.Networking; 
using UnityEngine.UI; 
using System.Collections; 

public class GameRoomInfo : NetworkBehaviour 
{ 

    public Text txt_RedTotalFunds; 
    public Text txt_BlueTotalFunds; 


    public int oldRedFunds = 0; 
    public int oldBlueFunds = 0; 

    [SyncVar] 
    public int redFunds; 
    [SyncVar] 
    public int blueFunds; 

    // Use this for initialization 
    void Start() { 

    } 

    void Update() 
    { 

     if (redFunds != oldRedFunds) 
     { 

      //txt_RedTotalFunds = GameObject.Find("txt_RedTotalFunds").GetComponent<Text>(); 
      txt_RedTotalFunds.text = "$" + redFunds; 
      Debug.Log("Red - $" + redFunds); 
      oldRedFunds = redFunds; 
     } 

     if (blueFunds != oldBlueFunds) 
     { 

      //txt_BlueTotalFunds = GameObject.Find("txt_BlueTotalFunds").GetComponent<Text>(); 
      txt_BlueTotalFunds.text = "$" + blueFunds; 
      Debug.Log("Blue - $" + blueFunds); 
      oldBlueFunds = blueFunds; 
     } 

    } 
} 

プレーヤースクリプト

using UnityEngine; 
using UnityEngine.Networking; 
using UnityEngine.UI; 
using System.Collections; 

public class Player : NetworkBehaviour { 

    [System.Serializable] 
    public enum PlayerColor { Red, Blue}; 

    [SyncVar] 
    PlayerColor playerColor;//used to update the right variables (Blue player updates blueFunds and Red player updates redFunds) 

    static int colorSelect = 0; 

    void Start() 
    { 
     if(isServer) // the server selects the player color when created 
     { 
      switch(colorSelect % 2) 
      { 
       case 0: 
        playerColor = PlayerColor.Red; 
        break; 
       case 1: 
        playerColor = PlayerColor.Blue; 
        break; 
      } 

      colorSelect++; 
     } 
    } 

    void Update() 
    { 
     if (!isLocalPlayer) 
      return; 

     if (hasAuthority && Input.GetKeyDown(KeyCode.KeypadPlus)) 
     { 
      Cmd_UpdateAdd(10); 
     } 

    } 

    // Button 
    void btn_Update() 
    { 
     if (!hasAuthority) 
      return; 
     Cmd_Update(0); 
    } 

    void btn_Add() 
    { 
     if (!hasAuthority) 
      return; 
     Cmd_Update(10); 
    } 


    [Command] 
    public void Cmd_Update(int _value)//The command updates the GameRoomInfo variables according to the player color 
    { 
     switch (playerColor) 
     { 
      case PlayerColor.Red: 
       FindObjectOfType<GameRoomInfo>().redFunds = _value; 
       break; 
      case PlayerColor.Blue: 
       FindObjectOfType<GameRoomInfo>().blueFunds = _value; 
       break; 
      default: 
       break; 
     } 
    } 

    [Command] 
    public void Cmd_UpdateAdd(int _value) 
    { 
     switch (playerColor) 
     { 
      case PlayerColor.Red: 
       FindObjectOfType<GameRoomInfo>().redFunds += _value; 
       break; 
      case PlayerColor.Blue: 
       FindObjectOfType<GameRoomInfo>().blueFunds += _value; 
       break; 
      default: 
       break; 
     } 
    } 

} 

私がテストを支援するためにいくつかの小さな変更を行いました。あなたのニーズに自由に適応してください。

+0

@Fenixrwのおかげで、私は最終的に数ヶ月間働いていた問題を解決しました。解決策は、Fenixrwによると: "赤と青の資金変数は各プレイヤーで一意であるため、赤のプレーヤーで赤の資金を更新すると青のプレーヤーでは更新されません。"あなたは私の英雄です、大きな感謝:-) – PeterK

関連する問題