tgindex
Unity Core
@tomatogamedevрусский

Канал о разработке игр! За сотрудничеством @Ilya01s

Последний пост
13 февр.
Последнее чтение
15 авг.
Постов за неделю
0
Всего постов
21
Тип
открытый
Язык
русский
В каталоге с
14 авг.
Подписчики
361
0 за 3 дн.
Сутки
0
0,00%
Неделя
 
Месяц
 
Просмотров на пост
496
21 постов
Вовлечённость
137,4%
к подписчикам
Постов в день
0,0
всего 21
Упоминаний
1
каналов
Охват размещения
оценка
1/24сутки в ленте
1/48двое суток
1/72трое суток

Оценка по просмотрам недавних постов: пост набирает почти всё за первые сутки.

Посты

  • 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. Подписаться.

  • без подписи

  • без подписи

  • Анимации, давайте теперь немножко углубимся в них: Есть куча способов синхронизировать анимацию, я бы выделил в 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, персонажа, поменяем наш визуал на персонажа и настроим переходы между анимациями, у меня получилось как-то так(картинка 1). Добавляем на нашего персонажа компонент NetworkMecanimAnimator и перетаскиваем в нужное поле animator(картинка 2). Итог вы видите на видео.

  • Теперь наша задача сделать так чтобы игроки могли двигать своих персонажей и видеть как перемещается другие игроки, для этого первое что мы должна сделать это создать структуру 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 на локальной машине и на сервере разная, чтобы предотвратить такие случаи, сервер отправляет Snapshot это состояние сетевых объектов. Когда локальная машина получает её, она делает RollBack - откатывает состояние сетевых объектов. В итоге нам надо повесить наш скрипт PlayerMove на наш Prefab Player, который мы создавали на прошлом посте, и можно запускать. Итог видите на видео. Unity Core. Подписаться.

  • без подписи

  • без подписи

  • Теперь первым делом создаем класс который будет реализовывать интерфейс 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, без него синхронизация не будет работать. Теперь добавляем эти поля в наш класс NetworkRunnerCallbacksController: [SerializeField] private NetworkPrefabRef playerPrefab; private Dictionary<PlayerRef, NetworkObject> spawnedCharacters = new Dictionary<PlayerRef, NetworkObject>(); А теперь реализуем функцию OnPlayerJoined public void OnPlayerJoined(NetworkRunner runner, PlayerRef player) { if (runner.IsServer) { // Create a unique position for the player Vector3 spawnPosition = new Vector3((player.RawEncoded % runner.Config.Simulation.PlayerCount) * 3, 1, 0); NetworkObject networkPlayerObject = runner.Spawn(playerPrefab, spawnPosition, Quaternion.identity, player); // Keep track of the player avatars for easy access spawnedCharacters.Add(player, networkPlayerObject); } } Также не забываем на всякий случай OnPlayerLeft: public void OnPlayerLeft(NetworkRunner runner, PlayerRef player) { if (spawnedCharacters.TryGetValue(player, out NetworkObject networkObject)) { runner.Despawn(networkObject); spawnedCharacters.Remove(player); } } Теперь добавялем всё на сцену, перетаскиваем наш префаб в поле playerPrefab класса NetworkRunnerCallbacksController(картинка 2) и можем запустить(видео). 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 (картинка 5). На этом этап подготовки завершён. В следующем уроке начнётся работа с кодом и будет показано, как сделать так, чтобы игроки видели друг друга и синхронно двигались. Unity Core. Подписаться.

  • ⚡️ Новый шейдер стекла от MirzaBeig Минималистичный стеклянный шейдер для Unity 6.2 URP. Имитирует прозрачность с преломлением, отражениями и дисторшеном чисто на Shader Graph. ⚡️ Ссылка на гайд: вот здесь #unity #indiedev #gamedev Unity Core. Подписаться.

  • 🎈Ребят, сделал новый ролик! всем смотреть! https://youtu.be/K5HwAongrng?si=bnXJSXjCgfynt2Op 😎В этом ролике я опирался на крипера2004 и хотел сделать подобное, но в тематике геймдева 😔Пирогов не будет, они сгорели

  • POMIDORCHIK GAMES - ВСЁ! Почему нет постов? - Я устроился на работу и не было времени на геймдев (хотел накопить на электрогитару, но родители не разрешили и все деньги у меня заберут🥲) 🙏Поэтому помогите накопить на электрогитару кому не жалко ссылка или напрямую на карту (комиссии не будет в таком случае) 2202 2068 6093 0770 Когда игра? -Честно, не знаю, скоро учеба начнётся и всё непонятно пока, но я все еще думаю, что до конца лета успею🎰 Также возьмусь за любые заказы или мб вам нужна реклама - @Where_i5_My_Mind 📍

  • 🍅Ребят всем привет! 😴Я в общем тут у колледж поступил (из-за этого разработка игры замедлилась + я щас работаю, поэтому времени не особо много) Что по игре: -Диалоговая система с вариантами ответов -Моделька кассирши -Прикольный объемный свет(правда я не знаю зачем он нужен в PS1 style, но путь будет) 😵‍💫Постараюсь выложиться и успеть до конца августа!

  • без подписи