Общие игровые настройки с U-Net - PullRequest
1 голос
/ 16 февраля 2020

У меня есть сцена, в которой у игрока есть возможность выбрать настройки для создаваемого им матча (количество раундов, время на раунд и т. Д. c ..), у меня также есть служебный класс MatchSettings, который содержит все эти Настройки, когда я запускаю игру на хосте, все работает нормально, однако, когда клиент присоединяется к игре, настройки совпадения клиентов равны 0 для всех. Настройки используются как часть класса GameManager, который реализует шаблон синглтона с членом MatchSettings , Итак, мой вопрос: как я могу сделать так, чтобы все участники игры имели одинаковые настройки? (Я знаю, что u- net устарела)

Соответствующий код для GameManager:

public class GameManager : MonoBehaviour
{
    public static GameManager instance;
    public MatchSettings settings;
    void Awake()
    {
        if(instance != null)
        {
            Debug.LogError("Too many game managers");
        }
        else
        {
            instance = this;
            respawnCamera.SetActive(false);
            settings = new MatchSettings();
            timePassed = settings.roundTime * 60;
            roundsPlayed = 0;
            highestKills = 0;
        }
    }
     void Update()
     {
        timePassed -= Time.deltaTime;
        if (timePassed < 0 || highestKills >= settings.maxKills)
        {
            Debug.Log(settings.roundTime); //prints 0 at client runtime
            RoundOver();
        }
        if(roundsPlayed >= settings.roundCount)
        {
            GameOver();
        }
    }
}

Соответствующий код для MatchSettings:

[System.Serializable]
public class MatchSettings
{

    public  float roundovertime = 10f;
    public static float roundtime; // the variables from the UI scene are stored in the static members and transferred
    public static int maxkills; // into the regular ones when MatchSettings() is called [in awake in game  manager]
    public static int roundcount;
    public float respawntime = 5f;
    public float roundTime;
    public int maxKills;
    public int roundCount;
    public MatchSettings()
    {
        roundTime = roundtime;
        maxKills = maxkills;
        roundCount = roundcount;
    }
}

Заранее спасибо!

1 Ответ

0 голосов
/ 16 февраля 2020

Если вы не синхронизируете MatchSettings со всеми клиентами, у вас всегда будут значения по умолчанию (в данном случае нули).

Один из способов использования UNET - использовать SyncVar - Вам понадобятся настройки игрового объекта на сцене, принадлежащего серверу, который будет вашим «источником правды».

Вы вносите изменения только на стороне сервера, и это будет автоматически обновляться для всех клиентов.

Пример псевдокода:

class GameSettings : NetworkBehaviour {
 [SyncVar(hook=nameof(FragsRequiredAmountSyncVarChanged))] private int _fragsRequiredToWinSyncVar = 20;

 public void ChangeFragsRequiredToWin(int newAmount) {
  if (!isServer) {
   Debug.LogError("Sync vars can only change on the server!");
   return;
  }
  _fragsRequiredToWinSyncVar = newAmount;
 }

 private void FragsRequiredAmountSyncVarChanged(int newAmount)
 {
  Debug.Log($"Frag requirement changed to {newAmount}");
 }
}

Я также включил пример того, как прикреплять перехватчики при изменении SyncVar; Я почти уверен, что он вызывается как на сервере, так и на клиенте, но моя память может подвести меня, так как прошло довольно много времени с тех пор, как я последний раз использовал UNET.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...