Game Controller

Сеть в Unity3D

Game Controller

Сообщение Heliosis 31 мар 2019, 23:31

Бонжур, вопрос такой: как сделать некий Game Controller, который будет просчитывать всякую всячину нужную (урон, взаимодействие игроков, еще кое-что), и при этом он будет доступен обоим игрокам сразу (игроков всего 2)?

В мультиплеере не шарю практически совсем, вот пытаюсь разобраться.
Смысл в том, что этот самый Game Controller получает данные хода от первого игрока и от второго игрока (здесь можно привести Hearthstone как аналогию, но ходы одновременные, а не поочередные), должен рассчитать урон, который они друг другу нанесли, установиться каждому игроку полагающееся ему значение здоровья и, собственно, начать следующий ход.
В синглплеере все работает, в том плане, что все алгоритмы и расчеты верные и рабочие, но только когда я создаю второго игрока, его присутствие никак не сказывается на игре.

Я прицепил GameController на NetworkManager, так хотя бы второй игрок может его найти.
Синтаксис:
Используется csharp
public class PlayerController : NetworkBehaviour
{
    public GameController gameController;
    public PlayerController currentOpponent;

    public int currentHealth;

    public bool endedTurn;
    public string previousTurnIdentifier;
    public string turnIdentifier;

    // how much player will do damage next turn
    public int nextTurnDamageIncrement;
    // how much player will reduce damage next turn
    public int nextTurnDamageReduction;

    void Start()
    {
        previousTurnIdentifier = "---";
        turnIdentifier = "---";

        gameController = NetworkManager.singleton.GetComponent<GameController>();
        if (gameController.firstPlayer == null)
            gameController.firstPlayer = this;
        else if (gameController.secondPlayer == null)
        {
            gameController.secondPlayer = this;
            currentOpponent = gameController.firstPlayer;
            gameController.firstPlayer.currentOpponent = this;
            gameController.StartTurn();
        }
    }

    void Update()
    {
        if (isLocalPlayer == false)
            return;

        if (Input.GetKeyDown(KeyCode.Return))
        {
            endedTurn = true;
        }
    }

    public void GetDamage(int damage)
    {
        if (damage > 0)
            currentHealth -= damage;
    }

    public void OnTurnStart()
    {
        previousTurnIdentifier = turnIdentifier;
        turnIdentifier = "---";
    }
}

Синтаксис:
Используется csharp
public class GameController : MonoBehaviour
{
    public NetworkManager networkManager;
    public PlayerController firstPlayer, secondPlayer;

    private void Update()
    {
        if (firstPlayer != null && secondPlayer != null)
            if (firstPlayer.endedTurn == true && secondPlayer.endedTurn == true)
            {
                DealDamage();
                StartTurn();
            }
    }

    public void StartTurn()
    {
        firstPlayer.endedTurn = false;
        secondPlayer.endedTurn = false;
        firstPlayer.OnTurnStart();
        secondPlayer.OnTurnStart();
    }

    public void DealDamage()
    {
        int damageToFirstPlayer = CalculatePlayer(secondPlayer, secondPlayer.turnIdentifier, secondPlayer.previousTurnIdentifier, firstPlayer, firstPlayer.turnIdentifier, firstPlayer.previousTurnIdentifier);
        int damageToSecondPlayer = CalculatePlayer(firstPlayer, firstPlayer.turnIdentifier, firstPlayer.previousTurnIdentifier, secondPlayer, secondPlayer.turnIdentifier, secondPlayer.previousTurnIdentifier);

        print(damageToFirstPlayer);
        print(damageToSecondPlayer);

        firstPlayer.GetDamage(damageToFirstPlayer);
        secondPlayer.GetDamage(damageToSecondPlayer);
    }
...

Синтаксис:
Используется csharp
public class UIButtonEndTurn : NetworkBehaviour, IPointerDownHandler
{
    public PlayerController player;
    public int actionTypeIndex, firstDamageTypeIndex, secondDamageTypeIndex;

    public void OnPointerDown(PointerEventData eventData)
    {
        List<PlayerController> players = FindObjectsOfType<PlayerController>().Where(p => p.isLocalPlayer == true).ToList();
        if (players != null && players.Count > 0)
            for (int i = 0; i < players.Count; i++)
                if (players[i].isLocalPlayer == true)
                    player = players[i];

        if (player != null && player.endedTurn == false)
        {
            player.turnIdentifier = actionTypeIndex.ToString() + firstDamageTypeIndex.ToString() + secondDamageTypeIndex.ToString();
            Debug.LogError("Player " + player.GetInstanceID() + " ended turn, turn identifier: " + player.turnIdentifier);
            player.endedTurn = true;
        }
    }
}


Вот основные скрипты, они работают у каждого игрока раздельно, и ни второй игрок не оказывает влияния на первого, ни первый на второго, как это исправить, куда копать и что сделать?

P.S.: да, мне юнити уже 9999 раз сказал, что это устарело все, но нибейти пж я по-другому не умею
Heliosis
UNIт
 
Сообщения: 147
Зарегистрирован: 10 фев 2016, 20:50

Re: Game Controller

Сообщение Heliosis 31 мар 2019, 23:33

Просто я даже не слишком представлю, Game Controller должен быть NetworkBehaviour или не должен?
К чему-то, может, его подключить нужно, чтоб он связывал двух игроков, а не было просто по копии Game Controller'а у каждого игрока, которые никак не скрепляются?
Схема вообще игры такова: игрок делает свой ход, отсылая определенную строку на сервер; когда сервер получает обе строки от обоих игроков, он их расшифровывает, поступает согласно алгоритмам, вычисляет сколько каждый игрок должен получить урона и вызывает у каждого игрока метод с получением этого самого урона, указывая его количество, после чего начинает следующий ход и каждый игрок снов отсылает в конце своего хода эту самую строку серверу и т.д.
Heliosis
UNIт
 
Сообщения: 147
Зарегистрирован: 10 фев 2016, 20:50

Re: Game Controller

Сообщение Heliosis 02 апр 2019, 21:28

Ну вы скажите пж, если я вообще не туда смотрю и делаю не то, что нужно, потому что я все еще свято верю, что не так далек от истинного пути
Heliosis
UNIт
 
Сообщения: 147
Зарегистрирован: 10 фев 2016, 20:50

Re: Game Controller

Сообщение Friend123 03 апр 2019, 08:23

Перво-наперво вам надо изучить как в принципе работает сеть. Как только такое понимание придет, то сделать задуманное можно будет на раз-два.
P.S. За 4-то дня уже можно было перечитать и пересмотреть пол-интернета. Плюс официальный ман никто не отменял.
P.S.S. Я сам когда скурпулезно изучал юнитевскую сеть, потратил на это около 2-3 недель, с учетом практических экспериментов.
Аватара пользователя
Friend123
Старожил
 
Сообщения: 701
Зарегистрирован: 26 фев 2012, 22:12
Откуда: Тверь
  • ICQ


Вернуться в Сеть

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6