Реализация мультиплеера

Общие вопросы о Unity3D

Реализация мультиплеера

Сообщение SamHijo 03 июн 2019, 13:48

Добрый день.

Создаю игру по типу Тетриса, хочу реализовать мультиплеер, но с ним еще не работал от слова "вообще". Пока что имеется каркас только для сингл-режима. Реализацию я вижу так: есть комната-сервер для двух игроков. Нужно создать триггер, который будет передавать возможность хода оппоненту после твоего хода, и передавать значение этого самого переключателя от клиента к серверу и наоборот. И когда игра заканчивается, поражение присваивается игроку, который ходил последним (который и проиграл). Но как это все провернуть, и нужно-ли именно в таком виде это все делать, я не знаю.

Собственно, потому и прошу помочь в этом вопросе. Подскажите, как полному чайнику начинающему Юнцу, что и куда делать. Или хотя бы направьте в нужное русло.
Заранее благодарю!
SamHijo
UNец
 
Сообщения: 8
Зарегистрирован: 20 май 2019, 17:21

Re: Реализация мультиплеера

Сообщение AngryCat 04 июн 2019, 21:23

Читай про Photon Network. Для твоей задачи это то, что нужно!! Там все есть :3
Здесь могла бы быть ваша реклама.
Аватара пользователя
AngryCat
Старожил
 
Сообщения: 716
Зарегистрирован: 20 июл 2018, 22:29
Skype: Дискорд - Флеш#4099

Re: Реализация мультиплеера

Сообщение SamHijo 10 июн 2019, 23:19

Решил с UNet попробовать разобраться. Один игрок выступает в роли хоста, второй - обычный клиент.
У меня есть скрипт Creator.cs. В двух словах, это префаб плеера, который по клику на игровом уровне создает определенную фигуру (квадрат), который падает вниз. Очень прошу подсказать что и куда прописать, что-бы работало следующим образом: игрок хостит игру; к нему подключается второй игрок; по какому-то триггеру сделать поочередные ходы для хоста и клиента; пока триггер указывает на хоста, скрипт Creator.cs на нем не работает, им сейчас управляет хост, и наоборот - во время хода клиента, Creator.cs недоступен для хоста.

Creator.cs.
Синтаксис:
Используется csharp
using UnityEngine;

class Creator : MonoBehaviour
{

        [SerializeField] GameObject[] _square; // префаб квадрата
        [SerializeField] GameObject platform; // префаб платформы, на которую падают квадраты
        Rigidbody2D rb2D;
        GameObject current; // фантом квадрата, который показывает позицию падения квадрата

        float pos = 300.0f; // фиксированная высота (значение у), по которой двигается фантом по оси 0х

        void Start()
        {
                Instantiate (platform, new Vector3 (0f, -350f, 0f), Quaternion.identity); // создание платформы, на которую падают квадраты
        }

        void Update()
        {
                if (Figure.sleep == true) { // значение из другого скрипта, которое определяет находится ли предыдущий квадрат в режиме сна. Только после его фиксации возможно создание следующего квадрата
                        if (current == null) {
                                current = Instantiate (_square [0]); // создание квадрата на месте фантома
                        }
                        Vector3 fixedPosition = Camera.main.ScreenToWorldPoint (Input.mousePosition); // движением мыши меняем позицию фантома влево-вправо
                        fixedPosition.z = 0.0f;
                        fixedPosition.y = pos; // фиксированная высота
                        current.transform.position = fixedPosition; // позиция фантома квадрата

                        if (Input.GetMouseButtonUp (0)) {
                                Figure.sleep = false; // передаем в другой скрипт информацию, что текущий квадрат находится в движении
                                current = null; // уничтожение фантома
                        }
                }
        }

        public void ChangePos()
        {
                pos += Figure.result.y - 200.0f; // метод, который в зависимости от высоты башни увеличивает фиксированную высоту фантома
        }
}
 


Очень прошу помочь, потому как не могу продолжать работу, не реализовав мультиплеер. Застрял и не могу выпутаться уже который день. Если вдруг нужен фулл проект для подсказки, в лс могу скинуть.
П.С. Если реализовать такой функционал в реалиях хост-клиент невозможно очень сложно, тогда прошу помочь с реализацией архитектуры, когда к серверу подключаются два клиента для игры.
П.П.С. Максимум, которого я достигал в решении проблемы, это отображение на клиенте действий хоста. На этом тупик.

Ниже для наглядности предоставлю картинку:
Скрытый текст:
Изображение
SamHijo
UNец
 
Сообщения: 8
Зарегистрирован: 20 май 2019, 17:21

Re: Реализация мультиплеера

Сообщение AngryCat 10 июн 2019, 23:30

AngryCat писал(а):Читай про Photon Network

SamHijo писал(а):Решил с UNet попробовать разобраться.

И что не так с этим миром?? Решить твою проблему рельно, но UNet скоро удалят из движка. Обещают что-то новое и невообразимо крутое. В твоем случае, смотри этот ролик и то, что идет дальше https://www.youtube.com/watch?v=GkeoANH3Xos&t=601s. Пусть от самого автора и не пахнет супер скиллом, но ответ на свой вопрос ты найдешь.
Здесь могла бы быть ваша реклама.
Аватара пользователя
AngryCat
Старожил
 
Сообщения: 716
Зарегистрирован: 20 июл 2018, 22:29
Skype: Дискорд - Флеш#4099

Re: Реализация мультиплеера

Сообщение SamHijo 11 июн 2019, 11:14

AngryCat писал(а):И что не так с этим миром??

Не сочти за пофигизм, просто при поиске документации на фотон, попал на линейку видеоуроков по UNet, решил, что проще с ним работать. :)

За видеоролик отдельное спасибо, сумел адекватно реализовать архитектуру мультиплеера, осталось только разобраться как создавать объекты, что бы те корректно отображались и на клиенте, и на сервере (хосте). :)
SamHijo
UNец
 
Сообщения: 8
Зарегистрирован: 20 май 2019, 17:21

Re: Реализация мультиплеера

Сообщение Jarico 11 июн 2019, 11:31

AngryCat писал(а):но UNet скоро удалят из движка. Обещают что-то новое и невообразимо крутое.


Они планируют перевести движок на систему сущностей полностью... Т.е. не будет никакого MonoBehaviour, и сеть будет так же адаптирована только для ECS а не для MonoBehaviour
Github: _https://github.com/redheadgektor
Discord: Конь! Чаю!#9382 (сижу редко)
YouTube: _https://www.youtube.com/channel/UCPQ04Xpbbw2uGc1gsZtO3HQ
Telegram: _https://t.me/redheadgektor
Аватара пользователя
Jarico
Адепт
 
Сообщения: 1084
Зарегистрирован: 06 янв 2019, 17:37
Откуда: 0xDEAD
Skype: none
  • Сайт

Re: Реализация мультиплеера

Сообщение AngryCat 11 июн 2019, 19:24

Черканул в лс.
Здесь могла бы быть ваша реклама.
Аватара пользователя
AngryCat
Старожил
 
Сообщения: 716
Зарегистрирован: 20 июл 2018, 22:29
Skype: Дискорд - Флеш#4099

Re: Реализация мультиплеера

Сообщение SamHijo 18 июн 2019, 00:58

Подскажите еще в последнем моменте, будьте добры: как реализовать создание на сервере (клиент-хост) объекта с клиентского приложения? Потому как с сервера на клиенте создается, а наоборот у меня не получается.
SamHijo
UNец
 
Сообщения: 8
Зарегистрирован: 20 май 2019, 17:21

Re: Реализация мультиплеера

Сообщение AngryCat 18 июн 2019, 09:44

Необходимо, что у плеера была выставлена галка LocalPlayerAuthority на NetwokIdentity, начиная с версии 5.2 также есть возможность создать (SpawnWithPlayerAuthority) объект с правами отправлять команды от имени игрока. т.е как-то так
Синтаксис:
Используется csharp
NetworkServer.SpawnWithClientAuthority(Instantiate(playerPrefab), connectionToClient);
Здесь могла бы быть ваша реклама.
Аватара пользователя
AngryCat
Старожил
 
Сообщения: 716
Зарегистрирован: 20 июл 2018, 22:29
Skype: Дискорд - Флеш#4099


Вернуться в Общие вопросы

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

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