Photon Fusion 2 — выбор сессии и загрузка сцен в мультиплеере.Разобрал, как создавать комнаты, подключаться к существующим и корректно загружать сцены в сетевой игре.Пост получился большим, поэтому вынес в Telegraph для удобства - кликUnity Core. Подписаться.
Похожие каналы
Все →Последние посты
Давайте теперь познакомимся c тем как передавать свои данные между игроками. Для этого в Photon Fusion придумали атрибут Networked, свойство которое будет помечено атрибутом Networked будет синхронизироваться между устройствами. Также стоит понимать что такое Remove Procedural Call далее RPC, это методы которым мы можем сказать кто их может отправить и кто может их вызвать, более простыми словами мы можем сказать что этот метод могут отправить клиенты а вызваться он должен у сервера. Теперь когда вводную часть закончили давайте напишешь счетчик очков который будет инкрементировать очки по нажатию клавиши K:using Fusion;using TMPro;using UnityEngine;public class ScoreController : NetworkBehaviour{ [Networked, OnChangedRender(nameof(SetScoreView))] private float Score { get; set; } [SerializeField] private TextMeshProUGUI scoreText; public override void Spawned() { SetScoreView(); } public void Update() { if (Input.GetKeyDown(KeyCode.K)) { RPC_IncreaseScore(); } } private void SetScoreView() { scoreText.text = Score.ToString(); } [Rpc(RpcSources.All, RpcTargets.StateAuthority)] public void RPC_IncreaseScore() { Score++; }}В это классе у нас есть поле Score у которого есть атрибут Networked со свойством OnChangeRender - это свойство говорит какой метод должен вызваться при изменении этого поля. Далее в Update мы считываем нажатие на клавишу K и вызываем Наш Rpc метод в котором говорим что отправить этот метод могут все, а вызваться он должен на машине со StateAuthority то есть на сервере.Дисклеймер: Для того чтобы метод считался RPC не достаточно атрибута RPC, ещё либо в начали либо в конце название метода должно быть слова RPC, регистр не важен.Метод Spawned вызывается при подключении к сессии. А теперь надо настроить в Unity наш UI который будет показывать очки(картинка 1). Итог вы видите на видео.Unity Core. Подписаться.Давайте теперь познакомимся c тем как передавать свои данные между игроками
Анимации, давайте теперь немножко углубимся в них:Есть куча способов синхронизировать анимацию, я бы выделил в Photon Fusion, 2 способа:1) State driven - в этом подходе мы помечаем поля как Networked чтобы Photon синхронизировал эти данные:[Networked] public float MoveSpeed;После чего, в методе Render который вызывается когда prediction уже сработал и мы получили состояние сервера, его можно переопределить в наследниках Networkbehaviour, применяем эти параметры к аниматору:public override void Render() { animator.SetFloat("MoveSpeed", MoveSpeed);}Мы должны это делать именно в методе Render, потому что для компонента animator не работает RollBack, то есть если мы сделаем это в обычном Update или FixedUpdateNetwork то у нас может быть такое что мы вызовем анимацию падение которая имеет только одно условие выхода и это окончание анимации, то получим такое что на клиенте может анимации запуститься а после того как сервер получить инпут клиента, он может сказать неа, ты был в какой-то другой позиции и оттуда при таком инпуте ты не можешь падать и вернёт предыдущее состояние, в итоге игрок будет на земле, но анимация падание будет проигрываться пока не закончиться.2) NetworkMecanimAnimator - Это готовый компонент от Photon который делает всю предыдущею историю за нас. В этот раз мы его и будет использвать, допишешь наш код PlayerMove с прошлого поста:using Fusion;using UnityEngine;public class PlayerMove : NetworkBehaviour{ [SerializeField] private NetworkCharacterController controller; [SerializeField] private Animator animator; public override void FixedUpdateNetwork() { if (GetInput(out NetworkInputData data)) { data.direction.Normalize(); controller.Move(5 * data.direction * Runner.DeltaTime); animator.SetFloat("MoveSpeed", data.direction.magnitude); } }}Теперь скачаем пару анимаций из mixamo, персонажа, поменяем наш визуал на персонажа и настроим переходы между анимациями, у меня получилось как-то
Теперь наша задача сделать так чтобы игроки могли двигать своих персонажей и видеть как перемещается другие игроки, для этого первое что мы должна сделать это создать структуру NetworkInputData которая будет реализовывать интерфейс INetworkInput public struct NetworkInputData : INetworkInput{ public Vector3 direction;}Теперь нам надо заполнять этот инпут и передать в Fusion, сделаем мы это в нашем классе NetworkRunnerCallbacksController в методе OnInput:public void OnInput(NetworkRunner runner, NetworkInput input) { var data = new NetworkInputData(); data.direction = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical")); input.Set(data); }А теперь нам нужно создать класс PlayerMove который будет наследоваться от NetworkBehaviour и двигать нашего персонажа:using Fusion;using UnityEngine;public class PlayerMove : NetworkBehaviour{ [SerializeField] private NetworkCharacterController controller; public override void FixedUpdateNetwork() { if (GetInput(out NetworkInputData data)) { data.direction.Normalize(); controller.Move(5 * data.direction * Runner.DeltaTime); } }}Теперь надо понимать одну вещь - proxy, в контексте Photon Fusion это сетевые объекты которые не являются объектами в нашем случае персонажем, текущей машины на которой мы присоединились к сессии. На таких объектах не вызывается FixedUpdateNetwork, кто знает почему - пишите в комментариях. Но это не относится к хосту, на хосте все объекты не считаются proxy.И ещё один момент - когда будете дебажить вы столкнётесь с тем что на одном объекте логи, допустим внутри метода FixedUpdateNetwork будут вызываться дважды это так называемый Prediction, локальная машина работает выхывает FixedUpdateNetwork как обычный FixedUpdate, но может случиться такое что на сервере наш персонаж находиться в другом месте из за того что частота вызова FixedUpdateNetwork на локальной машине и на сервере разная, чтобы предотврати

Теперь первым делом создаем класс который будет реализовывать интерфейс INetworkRunnerCallbacks:public class NetworkRunnerCallbacksController : MonoBehaviour, INetworkRunnerCallbacksВ этот класс добавляем поле:private NetworkRunner _runner;и метод StartGame:private async void StartGame(GameMode mode) { // Create the Fusion runner and let it know that we will be providing user input _runner = gameObject.AddComponent<NetworkRunner>(); _runner.ProvideInput = true; // Create the NetworkSceneInfo from the current scene var scene = SceneRef.FromIndex(SceneManager.GetActiveScene().buildIndex); var sceneInfo = new NetworkSceneInfo(); if (scene.IsValid) { sceneInfo.AddSceneRef(scene, LoadSceneMode.Additive); } // Start or join (depends on gamemode) a session with a specific name await _runner.StartGame(new StartGameArgs() { GameMode = mode, SessionName = "TestRoom", Scene = scene, SceneManager = gameObject.AddComponent<NetworkSceneManagerDefault>() }); }Этот метод принимает GameMode, создаёт NetworkRunner который является сердцем Phoron Fusion и запускает симуляцию мультиплеера.Ещё нам нужно создать вот такой метод:private void OnGUI() { if (_runner == null) { if (GUI.Button(new Rect(0,0,200,40), "Host")) { StartGame(GameMode.Host); } if (GUI.Button(new Rect(0,40,200,40), "Join")) { StartGame(GameMode.Client); } } }Этот метод рисует Две кнопки Host и Client. По кнопке Host мы создаем отдельную сессию а по кнопке Client мы присоединяемся к сессии. Позже сделаем так чтобы мы могли выбирать в какую сессию зайти. Теперь нам нужно создать префаб нашего игрока(картинка 1), ему надо добавить обязательно NetworkObject, этот компонент регистрирует наш объект в NetworkRunner, без него синхронизация не будет работа

Запускаем серию уроков по мультиплееру на Photon Fusion 2. В первом материале разобран базовый минимум и подготовка проекта.В мультиплеерных играх используются три типа соединений: Host, Peer to Peer и Dedicated Server. В рамках нашей серии рассматривается Host-модель, при которой один из игроков одновременно является сервером.Для начала нужно зайти в дашборд Photon и создать новый проект (картинка 1). При создании выбирается фреймворк Photon Fusion 2, указывается название проекта и подтверждается создание (картинка 2).Далее во вкладке SDK необходимо найти Photon Fusion 2 для Unity и скачать пакет (картинка 3). После импорта появляется окно настроек, в которое нужно вставить App ID проекта, скопированный из дашборда Photon (картинка 4).Дополнительно через Package Manager требуется установить Multiplayer Play Mode. Он используется для тестирования мультиплеера прямо в редакторе Unity (картинка 5).На этом этап подготовки завершён. В следующем уроке начнётся работа с кодом и будет показано, как сделать так, чтобы игроки видели друг друга и синхронно двигались.Unity Core. Подписаться.Запускаем серию уроков по мультиплееру на Photon Fusion 2. В первом материале разобран базовый минимум и подготовка проекта.В мультиплеерных играх используются три типа соединений: Host, Peer to Peer и Dedicated Server. В рамках нашей серии рассматривается Host-модель, при которой один из игроков одновременно является сервером.Для начала нужно зайти в дашборд Photon и создать новый проект (картинка 1). При создании выбирается фреймворк Photon Fusion 2, указывается название проекта и подтверждается создание (картинка 2).Далее во вкладке SDK необходимо найти Photon Fusion 2 для Unity и скачать пакет (картинка 3). После импорта появляется окно настроек, в которое нужно вставить App ID проекта, скопированный из дашборда Photon (картинка 4).Дополнительно через Package Manager требуется установить Multiplayer Play Mode. Он используется для тестирования мультиплеера прямо в редакторе Unity (картин
⚡️ Новый шейдер стекла от MirzaBeigМинималистичный стеклянный шейдер для Unity 6.2 URP. Имитирует прозрачность с преломлением, отражениями и дисторшеном чисто на Shader Graph. ⚡️ Ссылка на гайд: вот здесь#unity #indiedev #gamedevUnity Core. Подписаться.
🎈Ребят, сделал новый ролик! всем смотреть! https://youtu.be/K5HwAongrng?si=bnXJSXjCgfynt2Op😎В этом ролике я опирался на крипера2004 и хотел сделать подобное, но в тематике геймдева😔Пирогов не будет, они сгорели
POMIDORCHIK GAMES - ВСЁ! Почему нет постов? - Я устроился на работу и не было времени на геймдев (хотел накопить на электрогитару, но родители не разрешили и все деньги у меня заберут🥲) 🙏Поэтому помогите накопить на электрогитару кому не жалко ссылкаили напрямую на карту (комиссии не будет в таком случае) 2202 2068 6093 0770Когда игра? -Честно, не знаю, скоро учеба начнётся и всё непонятно пока, но я все еще думаю, что до конца лета успею🎰Также возьмусь за любые заказыили мб вам нужна реклама - @Where_i5_My_Mind📍
🍅Ребят всем привет! 😴Я в общем тут у колледж поступил (из-за этого разработка игры замедлилась + я щас работаю, поэтому времени не особо много) Что по игре:-Диалоговая система с вариантами ответов-Моделька кассирши-Прикольный объемный свет(правда я не знаю зачем он нужен в PS1 style, но путь будет) 😵💫Постараюсь выложиться и успеть до конца августа!