SyncVar не меняет Bool при нажатии кнопки Unity 3d - PullRequest
0 голосов
/ 07 октября 2018

Это мой первый сетевой проект.Я пытался следовать некоторым урокам, и вот с чем я сталкиваюсь: я пытаюсь просто изменить логическое значение при нажатии кнопки.Кнопка находится в одной сцене, а текстовый объект здесь находится в другой сцене.Так что я использую один и тот же сетевой менеджер в двух разных сценах.Я понимаю, что это не принято, но так должно быть для моего проекта.Все, что я сейчас ищу, это чтобы он изменил текст, как только я пойму, как это произошло, я уверен, что смогу выяснить все остальное.

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

public class textChanger : NetworkBehaviour 
{
    Text text;

    [SyncVar]
    bool change = false;

    // Use this for initialization
    void Start () 
    {
        text = gameObject.GetComponent<Text>();
    }

    // Update is called once per frame
    void Update () 
    {
        if(change)
        {
            text.text = "it worked";
        }
    }


    [Command]
    public void CmdChangeText()
    {
        change = true;
    }

}

Если я установлю "изменить" наПри нажатии клавиши код работает точно так, как должен, текст меняется.Но это не работает, когда я нажимаю кнопку из другой сцены.Я использую Networking Hud, и две сцены на самом деле связаны.Но переменная не обновляется.

enter image description here

enter image description here

На первом рисунке игровой объект "Текст" запускает ""Чейнджер текста".И на втором рисунке кнопка также имеет общий объект «Игровой объект», на котором она запущена.На него можно ссылаться в области кнопок onClick, вызывающей метод «CmdChangeText» в скрипте «Text Changer».

Так что в моей голове все выглядит так, как будто должно работать, но это не так.Может кто-нибудь помочь?

1 Ответ

0 голосов
/ 08 октября 2018

Из документации Unity :

Значения этих переменных будут синхронизированы от сервера к клиентам

Поэтому, если вы попытаетесь установить клиент, он не будет работать.Это можно сделать только с помощью [Command], как вы уже сделали.


Вы также должны проверить вывод консоли.Насколько я знаю, чтобы иметь возможность вызывать метод Command, для удержания NetworkIdentity должно быть установлено значение LocalPlayerAuthority.Мне всегда приходилось ставить специальный класс для всех команд на самом объекте Player, чтобы он работал.


Я знаю, что это, возможно, не ответ, но, по крайней мере, обходной путь:
Вместо ожидания [SyncVar] вы можете просто установить значение с помощью [ClientRpc]:

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

public class textChanger : NetworkBehaviour {

    Text text;

    private bool change = false;

    // Use this for initialization
    void Start () {
        text = gameObject.GetComponent<Text>();
    }

    // Update is called once per frame
    void Update () {
        if(change)
        {
            text.text = "it worked";
        }
    }

    [Command]
    public void CmdChangeText()
    {
        // sets the value on the server
        change = true;

        RpcChangeText();
    }

    // This is executed on ALL clients
    // SyncVar is no longer needed
    [ClientRpc]
    private void RpcChangeText()
    {
        change = true;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...