Илья, хочу выразить вам огромную благодарность за этот курс 🤗. Все очень понятно и упорядоченно 💪Отдельно хочу Вас поблагодарить, что уделяете внимание разным мелочам, таким как горячие кнопки и настройки инструментов! Для меня, как новичка, это гипер важно))) Вы очень приятный учитель у которого хочется учится дальше! Пока всё получается!)))
Если у кого то камера поворачивает вместе с персонажем, то вытащите "Camera Center" из родительской ветки в системе иерархии "Player" и поместите просто её так, чтобы она сама стала родительской. Т.к все движения она наследует от объекта "Player" и совершает все те же движения. У автора на видео это сделалось автоматически на 21:50.
Спасибо познавательные уроки! Но я думаю что кое где можно сделать по-проще: void Update() { if (Input.GetMouseButton(0)) { // перемещение игрока var position = transform.position + transform.forward * Time.deltaTime * _speed; position.x = Mathf.Clamp(position.x, -2.5f, 2.5f); transform.position = position; // Поворот за курсором var diff = Input.mousePosition - Camera.main.WorldToScreenPoint(transform.position); var angel = diff.normalized.x * 180 / Mathf.PI; transform.eulerAngles = Vector3.up * angel; // Привязка камеры position = Camera.main.transform.position + transform.forward * Time.deltaTime * _speed; position.x = Mathf.Clamp(position.x, -2.5f, 2.5f); Camera.main.transform.position = position; } В этом случае не нужно запоминать предыдущее положение курсора, а так же не нужно создавать для камеры отдельный объект со скриптом.
Да с камерой можно сделать ещё проще - просто сделать её дочерней, например, к объекту Player и всё. Всё работает и без скрипта, камеру не трясёт, она прекрасно следует за игроком. Что бы не дать игроку выйти за рамки дороги ( или любого другого игрового поля), достаточно просто добавить логичное препятствие и воспользоваться коллайдерами + Regidboby. Эффект тот же самый но выглядит логично, без костылей в виде *невидимых стен*. Да и в игре так и так придётся использовать эти компоненты. Я конечно только учусь делать игры, но как говорил мой друг программист со стажем работы 7 лет: "Если можно не писать код - не пиши. Меньше кода пишешь > меньше вероятности совершить ошибку > меньше рыскать в поиске ошибки > тратить меньше времени на отладку > получать в среднем больше денег за строчку кода". П.С.: Это не про то что нужно вообще отказываться от написания кода, просто те задачи, решение для которых уже реализовано, в том же интерфейсе Unity, лучше решить именно так, а не придумывать велосипед заново. Например в том же Unreal используют BluePrints, и знание этого инструмента очень часто значится в вакансиях как требуемый навык. Быстрее решить простые задачи готовыми скриптами, лишь может быть немного переписав скрипт, а остальное время потратить на более сложные задачи.
Здравствуйте подскажите пожалуйста разница между Camera.main.WorldToScreenPoint(transform.position); и Camera.main.transform.position . я попробовал оба варианта и никакой разницы (в строке объявления diff)
Курс офигенный. Но с камерой это просто жесть, чтобы понять тот алгоритм пришлось на бумажке поле рисовать чтобы плавно и красиво двигался а не просто передать эулеру позицию мыши, а еще сначала ввело в ступор что 0,0 координата мыши начинается внизу слева а не сверху
У тебя хорошие уроки, и ты очень хорошо объясняешь для новичков в с#. Было бы круто, если бы ты сделал ещё какой-нибудь курс по С# для Unity, где ещё показал примеры работы с массивами, циклами, использование корутинов, ну и так далее. Именно уклон на С#. Юнити не должно вызывать трудности, а вот само программирование для многих остаётся пробелом и сдерживает в создании проектов.
Здравствуйте. В Unity можно настроить управление объектом через мышь с помощью скрипта на C#. Для этого нужно использовать методы класса Input, которые позволяют получить текущее положение указателя мыши и изменять его при перемещении мыши. Приведём пример такого скрипта: public class MouseLook : MonoBehaviour { public float mouseSensitivity = 100f; // чувствительность мыши float xRotation = 0f; void Start() { // Блокировка курсора и скрытие его изображения Cursor.lockState = CursorLockMode.Locked; } void Update() { // Получаем показания смещения мыши float mouseX = Input.GetAxis("Mouse X") * mouseSensitivity * Time.deltaTime; float mouseY = Input.GetAxis("Mouse Y") * mouseSensitivity * Time.deltaTime; // Поворачиваем объект в соответствии с показаниями смещения мыши xRotation -= mouseY; xRotation = Mathf.Clamp(xRotation, -90f, 90f); // Ограничение угла поворота по оси X transform.localRotation = Quaternion.Euler(xRotation, 0f, 0f); transform.Rotate(Vector3.up * mouseX); } } В этом скрипте мы получаем показания смещения мыши в каждом кадре в методе Update(). Затем эти значения используются для поворота объекта в соответствии с движением мыши. Кроме того, угол поворота объекта по оси X ограничивается до 180 градусов. Также в методе Start() курсор блокируется, а его изображение скрывается, чтобы игрок мог управлять объектом более точно.
В целом курс полезный, чтобы быстро вкатиться в юнити Но, скажем так. В большинстве случаев (не только это видео, но и предыдущие) вместо грамотных решений используются какие-то костыли. Например проблему с Update() и частотой кадров решает не Time.deltaTime, а FixedUpdate(). Это вариация Update, которая делает расчёты ровно нужное количество раз в секунду (количество задаётся в настройках юнити. По умолчанию вроде универсальные 60)
Ещё важно сказать для новичков в программировании, что C# - строго типизированный(нужно явно указать тип, float, int, bool. string), объектно - ориентированный язык.
Большое спасибо за обучающие уроки, все разжевано до мелочей:) Появился вопрос. Я у фигурки человечка (gameObject Player) сделал поле _camera. В это поле просто перетащил в инспекторе объект Main Camera. Учитывая, что это Uniti, с точки зрения ООП, на сколько верно такое решение?
Здравствуйте. Если скрипт будет отвечать только за действия с камерой, то это хорошее решение. При этом в скрипте не должно быть путаницы и методов, которые отвечают за разные задачи. Иначе код будет неоптимизированным и нечитаемым.
Хм, а почему бы не взять и перенести MainCamera внутрь самого Player? Тогда не нужен даже скрипт, т.к. камера двигается относительно персонажа также. Технически это не правильно или здесь правило "распределение обязанности" под каждый отдельный объект?
Здравствуйте. Не рекомендуем добавлять камеру в дочерний объект Player. Дело в том, что если игру расширить и добавить препятствия, которые могут нейтрализовать игрока - камера тоже уничтожится. Также это повлияет на возможность реализовать плавность камеры.
Здравствуйте. Я никак не пойму, в каком месте мы обозначили, что переменная oldMousePositonX будет хранить положение мыши из предыдущего кадра? Мы просто создали эту переменную, потом создали ещё одну - deltaX - и присвоили ей значение текущего положения мыши минус переменная oldMousePositonX, значение которой не задавали. Почему это работает?)
Здравствуйте. Дело в том, что значение oldMousePositonX обрабатывается в двух разных стадиях - MouseDown и MouseUp. Если это поле изменено и не равняется 0 или если левая кнопка мыши была нажата и отпущена, то положение мыши будет отслеживаться корректно.
@Яндекс Игры для Разработчиков - здравствуйте , спасибо за обучающие видео ! Интересует вот такая вещь по теме ролика. В браузере всё работает - управление мышкой и кнопками с клавиатуры. Я так понимаю, если игру запустить на мобильном устройстве через браузер, управление работать не будет ? А вот если совместить управление под андроид и клавиатуру+ мышь , то это сработает на мобильных устройствах ?
Здравствуйте. Да, в проекте можно реализовать одновременно управление клавиатурой/мышью или через сенсор. Для этого необходимо определять устройство, на котором запущена игра, и автоматически переключать способ управления. Сделать это можно с помощью объекта deviceInfo нашего SDK. Подробнее в Руководстве разработчика: clck.ru/33oU7R
Добрый день. Для публикации игры в нашем каталоге, её механики и графическое оформление должны быть уникальными. Пишем в пункте 3.6. Требований к играм: clck.ru/344npj
Приветствую. Кого в интернете или в ютубе можно попросить сделать тренажер-игра английского языка? Например в виде какого-то 3Д героя, он просто стоит и говорит по английски. Сначала простые слова и предложения, потом все усложняется. Дикция как носитель английского языка. Есть меню перевода, если кому не понятно что он сказал. Нужно выполнять задания, которые он говорит
Здравствуйте! Не пойму, зачем для камеры писать скрипт и вкладывать в другой объект если камеру можно кинуть в объект Player и она будет следовать за ним??
Здравствуйте. Если прикрепить камеру к объекту игрока, она станет дочерней. В этом случае перемещаться и вращаться она будет некорректно. Наличие отдельного метода обработки следования позволяет более точно настроить логику камеры.
Здравствуйте. «Cinemachine» можно использовать, но в этом проекте он не понадобился. Рекомендуем добавлять в игру то, что поможет улучшить её без увеличения потребляемой мощности компьютера.
@@МаксимРадюш-ч6т хаах чувак, тебе тут character controller зачем нужен? во первых character controller даёт больше нагрузку, с трансформ позишн производительность лучше это как минимум. во вторых ты бред несёшь, для трансформ позишн это одна строчка кода маленькая, для Character Controller 3-4 строчки
@@fronzayy пиздец, нихуя cc не даёт нагрузку, а если даёт, то такую мизерную, на которую абсолютно поебать, и тебе сука лень написать эти 3 строчки кода? Сразу видно, челик не разбирается
Если мы верно поняли, то объект «Player» двигается по координатам, однако координаты объекта «Man» не меняются. Тогда это корректное поведение объектов. Дело в том, что у дочерних объектов центр находится на родительском объекте. Поэтому дочерний объект «Man» движется по координатам родительского объекта «Player».
Здравствуйте. Сохранять внутриигровые данные можно с помощью методов объекта Player. Метод player.setData сохраняет прогресс на сервер. Максимальный размер данных - 200 KБ. Чтобы асинхронно возвращать внутриигровой прогресс пользователя, который записан в базе Яндекса, используйте player.getData. Численные данные можно получать через метод player.setStats. Чтобы проверить, удалось ли сохранить прогресс, используйте метод Promise. Подробнее рассказываем по ссылке: clck.ru/34aKsq
Егор, добрый день. В играх с поддержкой нескольких устройств необходимо настроить адаптивное управление в зависимости от платформы пользователя. На десктопе оно должно осуществляться с помощью мыши и/или клавиатуры, на мобильных - жестами и/или с использованием акселерометра. Чтобы определять устройство игрока и автоматически менять управление, рекомендуем использовать метод ysdk.deviceInfo. Инструкция по настройке в Руководстве разработчика: clck.ru/33oU7R
у меня код с поворотом персонажа написан в точь в точь как у вас, но сам персонаж поворачивается с большой скоростью и я не знаю в чем может быть проблема
Здравствуйте. Дело может быть в методе Update - если поворот персонажа прописан с его помощью, то он может меняться в зависимости от устройства. Рекомендуем использовать метод FixedUpdate(). Тогда движение персонажа будет происходит на основании заданной величины.
Она слишком жёстко привязана к игроку будет. Будет поворачиваться за ним при повороте игрока, не получится реализовать плавное перемещение и т.п. В некоторых случаях это важно, поэтому лучше скриптить
Константин, здравствуйте. Как уже подсказали, скрипт движения камеры добавляется, чтобы она не была привязана только к объекту Player. Это помогает сделать повороты камеры более плавными.
Я бы сделал так: Объявляем в начале (до методов Start и Update) поле, которое будет хранить скорость поворота. Например [SerializeField] private float _rotationRate; Дальше в методе Update пишем if (Input.GetKey(KeyCode.D)) { _eulerY += (_rotationRate * Time.deltaTime); _eulerY = Mathf.Clamp(_eulerY, -70, 70); transform.eulerAngles = new Vector3(0, _eulerY, 0); } if (Input.GetKey(KeyCode.A)) { _eulerY -= (_rotationRate * Time.deltaTime); _eulerY = Mathf.Clamp(_eulerY, -70, 70); transform.eulerAngles = new Vector3(0, _eulerY, 0);
Так немного не понял ✅ 1. У меня не трясся персонаж закинул своего ☝ почему Unity 2023.1.12f1 2. Не увидел разницы между между 👉❗👈 тем что скрипт весит на камере пустого объекта и без него 🧐🤔 почему все тоже самое. Грубо говоря ☝ создал я пустой объект закинул туда как дочерний камеру и выставил её как надо 🤔 а скрипт тогда зачем если все так же работает?
Здравствуйте. Ответим на всё по порядку: 1. Тряска персонажа может быть заметней из-за разницы в FPS, а также при более низкой частоте кадров. 2. Не рекомендуем добавлять камеру в дочерний объект Player. Дело в том, что если игру расширить и добавить препятствия, которые могут нейтрализовать игрока - камера тоже уничтожится. Также это повлияет на возможность реализовать плавность камеры.
У меня ничего не работает( Я уже день сижу переделываю... Я даже код скопировал от готовой работы, ничего не поменялось. Может мне какой то параметр поменять?
У меня почему то при привязке поворота к клавишам KeyCode.A/D, при попытке ограничить через Clamp() угол имеет диапазон с 0 до 360, то есть Clamp(y, -70, 70) не работает (у него нет отрицательного значения в принципе). Пробовал по разному обойти этот нюанс, но не канает почему то. Версия 2022.3.4f1, тачка: Mac os m1 pro. Если кто сталкивался/знает, буду благодарен за ответ, ну или хак как обойти.
В ролике во время 21:33 на объекте Player создается пустой объект CameraCenter, который является подчиненным для объекта Player. Во время 21:51 на объект CameraCenter переносится MainCamera. При этом объект CameraCenter непонятно каким образом уходит из под объекта Player и становится с ним одинаковым в иерархии. Дальше везде CameraCenter является одинаковым в иерархии по отношению к объекту Player. В чем тут смысл? Почему надо создавать объект CameraCenter подчиненным объекту Player вместо того, чтобы сразу не создать объект CameraCenter на пустом месте?
Здравствуйте. Объект «CameraCenter» создаётся в объекте «Player» для того, чтобы сменить глобальные координаты на те, которые будут находиться внутри игрока. «MainCamera» используется для того, чтобы стать дочерним объектом - он всегда следует за родителем.
Помогите, пожалуйста. У меня во время вращения персонаж очень сильно крутится, при этом перемещаясь по окружности. Как можно сделать так, чтобы он крутился только на месте
возможно у тебя 3д модель персонажа не в центре родительского объекта стоит , нажми на Man в иерархии и проверь чтобы все координаты были 0 0 0, также сделай с Base Human
Тут ошибка - newPosition.x = Mathf.Clamp(newPosition.x -2.5f, 2.5f); Забыл запятую между newPosition.x и -2.5f. Должно быть так: newPosition.x = Mathf.Clamp(newPosition.x, -2.5f, 2.5f);
Здравствуйте. Обычно так случается, если объекты на сцене повёрнуты в другом направлении. Если персонаж «Man» также двигается в обратную сторону, нужно развернуть все объекты на сцене - это должно помочь.
FixedUpdate стандартно срабатывает 50 раз в секунду, и его используют для изменения физических компонентов. (потому что физика с такой частотой обновляется). 1. В данном случае у нас нет никакой физики. 2. У нас идёт постоянное считывание клавиш которые игрок нажал, и если мы будет проверять в FixedUpdate (50 раз) он может пропустить нажатие игрока.
@@КтоТо-х6ь6ь Спасибо, большое что отозвались и разъяснили. А что имеется ввиду, когда вы говорите "физический компонент"? Разве игрок - это не физический компонент?
@@rovshanbadirkhanov Игрок это обычный объект и Юнити его просто перемещает по сцене. Юнити для обработки физической симуляции использует физический движок nvidia PhysX, а он начинает работать когда на объект добавляешь физический компонент например Rigidbody и его движок начинает обрабатывать. А в данной игре у нас нет физических компонентов)
Блин, ну вот я смотрю этот курс и... ничего не понимаю. Просто тупо списываю код... Эхх, совсем не интересно так. Хочется же понимать что ты делаешь, а не тупо делать тоже самое
Не очень понял зачем на камеру вешать скрипт с апдейтом? Может просто сделать камеру дочерним объектом игрока и она автоматом будет следовать за персонажем без всяких апдейтов?