Илья, хочу выразить вам огромную благодарность за этот курс 🤗. Все очень понятно и упорядоченно 💪Отдельно хочу Вас поблагодарить, что уделяете внимание разным мелочам, таким как горячие кнопки и настройки инструментов! Для меня, как новичка, это гипер важно))) Вы очень приятный учитель у которого хочется учится дальше! Пока всё получается!)))
Если у кого то камера поворачивает вместе с персонажем, то вытащите "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, где ещё показал примеры работы с массивами, циклами, использование корутинов, ну и так далее. Именно уклон на С#. Юнити не должно вызывать трудности, а вот само программирование для многих остаётся пробелом и сдерживает в создании проектов.
В целом курс полезный, чтобы быстро вкатиться в юнити Но, скажем так. В большинстве случаев (не только это видео, но и предыдущие) вместо грамотных решений используются какие-то костыли. Например проблему с Update() и частотой кадров решает не Time.deltaTime, а FixedUpdate(). Это вариация Update, которая делает расчёты ровно нужное количество раз в секунду (количество задаётся в настройках юнити. По умолчанию вроде универсальные 60)
Здравствуйте. В 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() курсор блокируется, а его изображение скрывается, чтобы игрок мог управлять объектом более точно.
Ещё важно сказать для новичков в программировании, что C# - строго типизированный(нужно явно указать тип, float, int, bool. string), объектно - ориентированный язык.
Большое спасибо за обучающие уроки, все разжевано до мелочей:) Появился вопрос. Я у фигурки человечка (gameObject Player) сделал поле _camera. В это поле просто перетащил в инспекторе объект Main Camera. Учитывая, что это Uniti, с точки зрения ООП, на сколько верно такое решение?
Здравствуйте. Если скрипт будет отвечать только за действия с камерой, то это хорошее решение. При этом в скрипте не должно быть путаницы и методов, которые отвечают за разные задачи. Иначе код будет неоптимизированным и нечитаемым.
Приветствую. Кого в интернете или в ютубе можно попросить сделать тренажер-игра английского языка? Например в виде какого-то 3Д героя, он просто стоит и говорит по английски. Сначала простые слова и предложения, потом все усложняется. Дикция как носитель английского языка. Есть меню перевода, если кому не понятно что он сказал. Нужно выполнять задания, которые он говорит
Хм, а почему бы не взять и перенести MainCamera внутрь самого Player? Тогда не нужен даже скрипт, т.к. камера двигается относительно персонажа также. Технически это не правильно или здесь правило "распределение обязанности" под каждый отдельный объект?
Здравствуйте. Не рекомендуем добавлять камеру в дочерний объект Player. Дело в том, что если игру расширить и добавить препятствия, которые могут нейтрализовать игрока - камера тоже уничтожится. Также это повлияет на возможность реализовать плавность камеры.
Здравствуйте. Я никак не пойму, в каком месте мы обозначили, что переменная oldMousePositonX будет хранить положение мыши из предыдущего кадра? Мы просто создали эту переменную, потом создали ещё одну - deltaX - и присвоили ей значение текущего положения мыши минус переменная oldMousePositonX, значение которой не задавали. Почему это работает?)
Здравствуйте. Дело в том, что значение oldMousePositonX обрабатывается в двух разных стадиях - MouseDown и MouseUp. Если это поле изменено и не равняется 0 или если левая кнопка мыши была нажата и отпущена, то положение мыши будет отслеживаться корректно.
@@МаксимРадюш-ч6т хаах чувак, тебе тут character controller зачем нужен? во первых character controller даёт больше нагрузку, с трансформ позишн производительность лучше это как минимум. во вторых ты бред несёшь, для трансформ позишн это одна строчка кода маленькая, для Character Controller 3-4 строчки
@@fronzayy пиздец, нихуя cc не даёт нагрузку, а если даёт, то такую мизерную, на которую абсолютно поебать, и тебе сука лень написать эти 3 строчки кода? Сразу видно, челик не разбирается
@Яндекс Игры для Разработчиков - здравствуйте , спасибо за обучающие видео ! Интересует вот такая вещь по теме ролика. В браузере всё работает - управление мышкой и кнопками с клавиатуры. Я так понимаю, если игру запустить на мобильном устройстве через браузер, управление работать не будет ? А вот если совместить управление под андроид и клавиатуру+ мышь , то это сработает на мобильных устройствах ?
Здравствуйте. Да, в проекте можно реализовать одновременно управление клавиатурой/мышью или через сенсор. Для этого необходимо определять устройство, на котором запущена игра, и автоматически переключать способ управления. Сделать это можно с помощью объекта deviceInfo нашего SDK. Подробнее в Руководстве разработчика: clck.ru/33oU7R
Здравствуйте! Не пойму, зачем для камеры писать скрипт и вкладывать в другой объект если камеру можно кинуть в объект Player и она будет следовать за ним??
Здравствуйте. Если прикрепить камеру к объекту игрока, она станет дочерней. В этом случае перемещаться и вращаться она будет некорректно. Наличие отдельного метода обработки следования позволяет более точно настроить логику камеры.
Здравствуйте. «Cinemachine» можно использовать, но в этом проекте он не понадобился. Рекомендуем добавлять в игру то, что поможет улучшить её без увеличения потребляемой мощности компьютера.
Добрый день. Для публикации игры в нашем каталоге, её механики и графическое оформление должны быть уникальными. Пишем в пункте 3.6. Требований к играм: clck.ru/344npj
Если мы верно поняли, то объект «Player» двигается по координатам, однако координаты объекта «Man» не меняются. Тогда это корректное поведение объектов. Дело в том, что у дочерних объектов центр находится на родительском объекте. Поэтому дочерний объект «Man» движется по координатам родительского объекта «Player».
Здравствуйте. Сохранять внутриигровые данные можно с помощью методов объекта Player. Метод player.setData сохраняет прогресс на сервер. Максимальный размер данных - 200 KБ. Чтобы асинхронно возвращать внутриигровой прогресс пользователя, который записан в базе Яндекса, используйте player.getData. Численные данные можно получать через метод player.setStats. Чтобы проверить, удалось ли сохранить прогресс, используйте метод Promise. Подробнее рассказываем по ссылке: clck.ru/34aKsq
Егор, добрый день. В играх с поддержкой нескольких устройств необходимо настроить адаптивное управление в зависимости от платформы пользователя. На десктопе оно должно осуществляться с помощью мыши и/или клавиатуры, на мобильных - жестами и/или с использованием акселерометра. Чтобы определять устройство игрока и автоматически менять управление, рекомендуем использовать метод ysdk.deviceInfo. Инструкция по настройке в Руководстве разработчика: clck.ru/33oU7R
У меня почему то при привязке поворота к клавишам KeyCode.A/D, при попытке ограничить через Clamp() угол имеет диапазон с 0 до 360, то есть Clamp(y, -70, 70) не работает (у него нет отрицательного значения в принципе). Пробовал по разному обойти этот нюанс, но не канает почему то. Версия 2022.3.4f1, тачка: Mac os m1 pro. Если кто сталкивался/знает, буду благодарен за ответ, ну или хак как обойти.
у меня код с поворотом персонажа написан в точь в точь как у вас, но сам персонаж поворачивается с большой скоростью и я не знаю в чем может быть проблема
Здравствуйте. Дело может быть в методе Update - если поворот персонажа прописан с его помощью, то он может меняться в зависимости от устройства. Рекомендуем использовать метод FixedUpdate(). Тогда движение персонажа будет происходит на основании заданной величины.
Так немного не понял ✅ 1. У меня не трясся персонаж закинул своего ☝ почему Unity 2023.1.12f1 2. Не увидел разницы между между 👉❗👈 тем что скрипт весит на камере пустого объекта и без него 🧐🤔 почему все тоже самое. Грубо говоря ☝ создал я пустой объект закинул туда как дочерний камеру и выставил её как надо 🤔 а скрипт тогда зачем если все так же работает?
Здравствуйте. Ответим на всё по порядку: 1. Тряска персонажа может быть заметней из-за разницы в FPS, а также при более низкой частоте кадров. 2. Не рекомендуем добавлять камеру в дочерний объект Player. Дело в том, что если игру расширить и добавить препятствия, которые могут нейтрализовать игрока - камера тоже уничтожится. Также это повлияет на возможность реализовать плавность камеры.
У меня ничего не работает( Я уже день сижу переделываю... Я даже код скопировал от готовой работы, ничего не поменялось. Может мне какой то параметр поменять?
Помогите, пожалуйста. У меня во время вращения персонаж очень сильно крутится, при этом перемещаясь по окружности. Как можно сделать так, чтобы он крутился только на месте
возможно у тебя 3д модель персонажа не в центре родительского объекта стоит , нажми на Man в иерархии и проверь чтобы все координаты были 0 0 0, также сделай с Base Human
Она слишком жёстко привязана к игроку будет. Будет поворачиваться за ним при повороте игрока, не получится реализовать плавное перемещение и т.п. В некоторых случаях это важно, поэтому лучше скриптить
Константин, здравствуйте. Как уже подсказали, скрипт движения камеры добавляется, чтобы она не была привязана только к объекту 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);
В ролике во время 21:33 на объекте Player создается пустой объект CameraCenter, который является подчиненным для объекта Player. Во время 21:51 на объект CameraCenter переносится MainCamera. При этом объект CameraCenter непонятно каким образом уходит из под объекта Player и становится с ним одинаковым в иерархии. Дальше везде CameraCenter является одинаковым в иерархии по отношению к объекту Player. В чем тут смысл? Почему надо создавать объект CameraCenter подчиненным объекту Player вместо того, чтобы сразу не создать объект CameraCenter на пустом месте?
Здравствуйте. Объект «CameraCenter» создаётся в объекте «Player» для того, чтобы сменить глобальные координаты на те, которые будут находиться внутри игрока. «MainCamera» используется для того, чтобы стать дочерним объектом - он всегда следует за родителем.
eу меня в этом коде выдает ошибку на моменте ограничения движения по дороге, ссылаясь на Mathf.Clamp Vector3 newPosition = transform.position + transform.forward * Time.deltaTime * _speed; newPosition.x = Mathf.Clamp(newPosition.x -2.5f, 2.5f); transform.position = newPosition;
float deltaX = Input.mousePosition.x - _oldMousePositionX; _oldMousePositionX = Input.mousePosition.x; _eulerY += deltaX; _eulerY = Mathf.Clamp(_eulerY, -70, 70); transform.eulerAngles = new Vector3(0, _eulerY, 0); Assets\Scripts\Playermove.cs(26,35): error CS1501: No overload for method 'Clamp' takes 2 arguments подскажите, с чем может быть связано?
Тут ошибка - 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 и его движок начинает обрабатывать. А в данной игре у нас нет физических компонентов)
Блин, ну вот я смотрю этот курс и... ничего не понимаю. Просто тупо списываю код... Эхх, совсем не интересно так. Хочется же понимать что ты делаешь, а не тупо делать тоже самое
Не очень понял зачем на камеру вешать скрипт с апдейтом? Может просто сделать камеру дочерним объектом игрока и она автоматом будет следовать за персонажем без всяких апдейтов?
Илья, хочу выразить вам огромную благодарность за этот курс 🤗. Все очень понятно и упорядоченно 💪Отдельно хочу Вас поблагодарить, что уделяете внимание разным мелочам, таким как горячие кнопки и настройки инструментов! Для меня, как новичка, это гипер важно))) Вы очень приятный учитель у которого хочется учится дальше!
Пока всё получается!)))
Здравствуйте. Рады, что курс вам понравился. Спасибо за такой позитивный отзыв. Желаем вам успехов и развития ❤️
Мега полезный урок! Благодарю!
Если у кого то камера поворачивает вместе с персонажем, то вытащите "Camera Center" из родительской ветки в системе иерархии "Player" и поместите просто её так, чтобы она сама стала родительской. Т.к все движения она наследует от объекта "Player" и совершает все те же движения. У автора на видео это сделалось автоматически на 21:50.
😁спасибо что написал, кучу времени мне съэкономил, я подумал что гдето в коде накосячил, но решил сначала посмотреть коментарии 😁
Можно и не вытаскивать, но в скрипте прописать, что Rotate всегда ноль )
@@ihabia Это костыль, если в будущем понадобится вращать, то придется искать и исправлять. Не факт, что быстро получится разобраться.
@@alexoem7633 + лишнее процессорное время тратить
Спасибо! Пришлось искать где косяк, вовремя решила посмотреть комменты. 👍
Спасибо познавательные уроки! Но я думаю что кое где можно сделать по-проще:
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)
Для тех, у кого не работает метод Clamp, проверьте MathF ли у вас или Mathf, у меня была большая и из-за этого были ошибки.
Спасибо за курс!
Здравствуйте. Спасибо, что делитесь решением с другими разработчиками 🙂
Курс офигенный. Но с камерой это просто жесть, чтобы понять тот алгоритм пришлось на бумажке поле рисовать чтобы плавно и красиво двигался а не просто передать эулеру позицию мыши, а еще сначала ввело в ступор что 0,0 координата мыши начинается внизу слева а не сверху
У тебя хорошие уроки, и ты очень хорошо объясняешь для новичков в с#. Было бы круто, если бы ты сделал ещё какой-нибудь курс по С# для Unity, где ещё показал примеры работы с массивами, циклами, использование корутинов, ну и так далее. Именно уклон на С#. Юнити не должно вызывать трудности, а вот само программирование для многих остаётся пробелом и сдерживает в создании проектов.
может еще игру написать? chatGP в помощь
Спасибо очень полезная информация
Здравствуйте. Рады, что видео оказалось полезным. Спасибо, что поделились 🙂
В целом курс полезный, чтобы быстро вкатиться в юнити
Но, скажем так. В большинстве случаев (не только это видео, но и предыдущие) вместо грамотных решений используются какие-то костыли. Например проблему с Update() и частотой кадров решает не Time.deltaTime, а FixedUpdate(). Это вариация Update, которая делает расчёты ровно нужное количество раз в секунду (количество задаётся в настройках юнити. По умолчанию вроде универсальные 60)
Видимо на этом моё изучение юнити заканчивается. Логику управления через мышь вообще не понял
Здравствуйте. В 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() курсор блокируется, а его изображение скрывается, чтобы игрок мог управлять объектом более точно.
А у тебя?)@@valungamedev
А у тебя?)@@valungamedev
А у тебя как?)@@valungamedev
Ещё важно сказать для новичков в программировании, что C# - строго типизированный(нужно явно указать тип, float, int, bool. string), объектно - ориентированный язык.
Большое спасибо за обучающие уроки, все разжевано до мелочей:)
Появился вопрос.
Я у фигурки человечка (gameObject Player) сделал поле _camera. В это поле просто перетащил в инспекторе объект Main Camera. Учитывая, что это Uniti, с точки зрения ООП, на сколько верно такое решение?
Здравствуйте. Если скрипт будет отвечать только за действия с камерой, то это хорошее решение. При этом в скрипте не должно быть путаницы и методов, которые отвечают за разные задачи. Иначе код будет неоптимизированным и нечитаемым.
Что-то не понял, а где урок про эту дорожку в горизонт, синий фон и импорте персонажа для этого урока?
Приветствую. Кого в интернете или в ютубе можно попросить сделать тренажер-игра английского языка? Например в виде какого-то 3Д героя, он просто стоит и говорит по английски. Сначала простые слова и предложения, потом все усложняется. Дикция как носитель английского языка. Есть меню перевода, если кому не понятно что он сказал. Нужно выполнять задания, которые он говорит
Мне кажется или видео где добавляли персонажа и дорогу почему то пропало
Можно его где нибудь посмотреть?
Здравствуйте. Возможно, речь идёт о ролике про добавление анимации: clck.ru/399JuY. Посмотрите, пожалуйста.
А где-то было видео в котором Илья создает персонажа, дорогу и скайбокс. Подскажите где оно?...
Поищи на канале: Настройка камеры и работа с материалами
@@Kirvun Спасибо)
Внутри проекта который вы выложили на яндекс диск нет файла скрипта который писали в этом уроке?
Здравствуйте. Файл скрипта из этого урока можно скачать по ссылке в описании к следующему: clck.ru/36uUeo
Хм, а почему бы не взять и перенести MainCamera внутрь самого Player? Тогда не нужен даже скрипт, т.к. камера двигается относительно персонажа также. Технически это не правильно или здесь правило "распределение обязанности" под каждый отдельный объект?
хз, но я просто так и сделал
Здравствуйте. Не рекомендуем добавлять камеру в дочерний объект Player. Дело в том, что если игру расширить и добавить препятствия, которые могут нейтрализовать игрока - камера тоже уничтожится. Также это повлияет на возможность реализовать плавность камеры.
@@yagamesdev спасибо за объяснение!
@@yagamesdev понял, спасибо
Здравствуйте. Я никак не пойму, в каком месте мы обозначили, что переменная oldMousePositonX будет хранить положение мыши из предыдущего кадра? Мы просто создали эту переменную, потом создали ещё одну - deltaX - и присвоили ей значение текущего положения мыши минус переменная oldMousePositonX, значение которой не задавали. Почему это работает?)
Здравствуйте. Дело в том, что значение oldMousePositonX обрабатывается в двух разных стадиях - MouseDown и MouseUp. Если это поле изменено и не равняется 0 или если левая кнопка мыши была нажата и отпущена, то положение мыши будет отслеживаться корректно.
Оно просто автоматически задаётся как "0", если при объявлении переменной не присваивать значение.
А если я хочу сделать движение с физикой, то есть через RigidBody, код для поворота камерой останется таким же? Или там все придется менять?
Здравствуйте. Переход на управление игрока через RigidBody не повлияет на камеру. Поэтому изменять её код передвижения необязательно.
А почему бы не использовать Character Controller или RigidBody? Так же намного лучше и легче)
Здравствуйте. Использование «RigidBody» понадобится для других скриптов. Рассказываем в следующих видео курса по ссылке: clck.ru/36Nnmt
ахахха для этого такое использовать? лишняя нагрузка
@@fronzayy нет, неправда. Лучше взять character controller, и не писать лишней хуйни
@@МаксимРадюш-ч6т хаах чувак, тебе тут character controller зачем нужен? во первых character controller даёт больше нагрузку, с трансформ позишн производительность лучше это как минимум. во вторых ты бред несёшь, для трансформ позишн это одна строчка кода маленькая, для Character Controller 3-4 строчки
@@fronzayy пиздец, нихуя cc не даёт нагрузку, а если даёт, то такую мизерную, на которую абсолютно поебать, и тебе сука лень написать эти 3 строчки кода? Сразу видно, челик не разбирается
@Яндекс Игры для Разработчиков - здравствуйте , спасибо за обучающие видео !
Интересует вот такая вещь по теме ролика. В браузере всё работает - управление мышкой и кнопками с клавиатуры. Я так понимаю, если игру запустить на мобильном устройстве через браузер, управление работать не будет ? А вот если совместить управление под андроид и клавиатуру+ мышь , то это сработает на мобильных устройствах ?
Здравствуйте. Да, в проекте можно реализовать одновременно управление клавиатурой/мышью или через сенсор. Для этого необходимо определять устройство, на котором запущена игра, и автоматически переключать способ управления. Сделать это можно с помощью объекта deviceInfo нашего SDK. Подробнее в Руководстве разработчика: clck.ru/33oU7R
Здравствуйте! Не пойму, зачем для камеры писать скрипт и вкладывать в другой объект если камеру можно кинуть в объект Player и она будет следовать за ним??
Здравствуйте. Если прикрепить камеру к объекту игрока, она станет дочерней. В этом случае перемещаться и вращаться она будет некорректно. Наличие отдельного метода обработки следования позволяет более точно настроить логику камеры.
А как насчёт cinemaMashin в юнити?
Здравствуйте. «Cinemachine» можно использовать, но в этом проекте он не понадобился. Рекомендуем добавлять в игру то, что поможет улучшить её без увеличения потребляемой мощности компьютера.
шаблон данной игры можно использовать?
используя свое оформление конечно же.
Добрый день. Для публикации игры в нашем каталоге, её механики и графическое оформление должны быть уникальными. Пишем в пункте 3.6. Требований к играм: clck.ru/344npj
что делать если пустой объект "player" не двигается вместе с персонажем а стоит на месте ?
Объект player и есть персонаж, скрипт должен висеть на нем и двигать именно его, а меш(моделька) персонажа, должен быть дочерним объектом для player'a
Если мы верно поняли, то объект «Player» двигается по координатам, однако координаты объекта «Man» не меняются. Тогда это корректное поведение объектов. Дело в том, что у дочерних объектов центр находится на родительском объекте. Поэтому дочерний объект «Man» движется по координатам родительского объекта «Player».
@@yagamesdev С этим я уже разобрался. Теперь новая проблема. Яндекс игры не может взять данные игрока. А в консоли пишется куча ошибок.
Здравствуйте. Сохранять внутриигровые данные можно с помощью методов объекта Player. Метод player.setData сохраняет прогресс на сервер. Максимальный размер данных - 200 KБ. Чтобы асинхронно возвращать внутриигровой прогресс пользователя, который записан в базе Яндекса, используйте player.getData. Численные данные можно получать через метод player.setStats. Чтобы проверить, удалось ли сохранить прогресс, используйте метод Promise. Подробнее рассказываем по ссылке: clck.ru/34aKsq
Подскажите, я создаю пустой объект, вставляю в него камеру и пустой объект автоматически соединяется с камерой. Что не так делаю?
Здравствуйте. Всё верно, если создавать пустой объект и добавлять на него камеру, они будут автоматически соединяться.
Я выбрал 3D Icons но у меня значки не отображаются.
Здравствуйте. Такое бывает, если вы не активировали Gizmo - визуально его меню похоже на 3D сферу с точками. Подробнее по ссылке: clck.ru/36soGW
Здравствуйте! Почему на 14:43 мы можем прибавлять к _eulerY значение, если эта переменная не инициализирована?
Здравствуйте. На момент прибавления значения переменная _eulerY инициализирована на 10 строке.
@@yagamesdev В 10 строчке просто переменная объявлена как "private float _eulerY;", но значение не присвоено. Не понимаю, объясните пожалуйста)
ей по умолчанию присвоен ноль@@daniilv7639
@@daniilv7639 Числовые типы при объявлении по умолчанию имеют значение "0".
Подробнее
Значения по умолчанию типов C# (справка по C#)
Если у нас в коде управление мышью, то как пользователь будет играть в мобильной версии игры?
Егор, добрый день. В играх с поддержкой нескольких устройств необходимо настроить адаптивное управление в зависимости от платформы пользователя. На десктопе оно должно осуществляться с помощью мыши и/или клавиатуры, на мобильных - жестами и/или с использованием акселерометра.
Чтобы определять устройство игрока и автоматически менять управление, рекомендуем использовать метод ysdk.deviceInfo. Инструкция по настройке в Руководстве разработчика: clck.ru/33oU7R
У меня почему то при привязке поворота к клавишам KeyCode.A/D, при попытке ограничить через Clamp() угол имеет диапазон с 0 до 360, то есть Clamp(y, -70, 70) не работает (у него нет отрицательного значения в принципе). Пробовал по разному обойти этот нюанс, но не канает почему то. Версия 2022.3.4f1, тачка: Mac os m1 pro. Если кто сталкивался/знает, буду благодарен за ответ, ну или хак как обойти.
Здравствуйте. Предлагаем 2 варианта кода, которые могут решить вопрос:
1. Скрипт, который используется в курсе:
if (Input.GetMouseButton(0))
{
Vector3 newPosition = transform.position + transform.forward * Time.deltaTime * _speed;
newPosition.x = Mathf.Clamp(newPosition.x, -2.5f, 2.5f);
transform.position = newPosition;
float deltaX = Input.mousePosition.x - _oldMousePositionX;
_oldMousePositionX = Input.mousePosition.x;
_eulerY += deltaX;
_eulerY = Mathf.Clamp(_eulerY, -70f, 70f);
transform.eulerAngles = new Vector3(0, _eulerY, 0);
}
2. Можно заменить строку «_eulerY = Mathf.Clamp(_eulerY, -70f, 70f);» на «_eulerY = ClampAngle(_eulerY, -70f, 70f);». В таком случае скрипт будет выглядеть так:
public static float ClampAngle(float current, float min, float max)
{
float dtAngle = Mathf.Abs(((min - max) \+ 180) % 360 - 180);
float hdtAngle = dtAngle \* 0.5f;
float midAngle = min \+ hdtAngle;
float offset = Mathf.Abs(Mathf.DeltaAngle(current, midAngle)) - hdtAngle;
if (offset \> 0)
current = Mathf.MoveTowardsAngle(current, midAngle, offset);
return current;
}
есть еще более простой и стандартный вариант- привязка к Get.Axis
у меня код с поворотом персонажа написан в точь в точь как у вас, но сам персонаж поворачивается с большой скоростью и я не знаю в чем может быть проблема
Здравствуйте. Дело может быть в методе Update - если поворот персонажа прописан с его помощью, то он может меняться в зависимости от устройства. Рекомендуем использовать метод FixedUpdate(). Тогда движение персонажа будет происходит на основании заданной величины.
Так немного не понял ✅
1. У меня не трясся персонаж закинул своего ☝ почему Unity 2023.1.12f1
2. Не увидел разницы между между 👉❗👈 тем что скрипт весит на камере пустого объекта и без него 🧐🤔 почему все тоже самое.
Грубо говоря ☝ создал я пустой объект закинул туда как дочерний камеру и выставил её как надо 🤔 а скрипт тогда зачем если все так же работает?
Здравствуйте. Ответим на всё по порядку:
1. Тряска персонажа может быть заметней из-за разницы в FPS, а также при более низкой частоте кадров.
2. Не рекомендуем добавлять камеру в дочерний объект Player. Дело в том, что если игру расширить и добавить препятствия, которые могут нейтрализовать игрока - камера тоже уничтожится. Также это повлияет на возможность реализовать плавность камеры.
У меня ничего не работает( Я уже день сижу переделываю... Я даже код скопировал от готовой работы, ничего не поменялось. Может мне какой то параметр поменять?
скрипт на папку пустую с персонажем перекинь
Помогите, пожалуйста. У меня во время вращения персонаж очень сильно крутится, при этом перемещаясь по окружности. Как можно сделать так, чтобы он крутился только на месте
возможно у тебя 3д модель персонажа не в центре родительского объекта стоит , нажми на Man в иерархии и проверь чтобы все координаты были 0 0 0, также сделай с Base Human
@@Ritme да, так и было, спасибо
@@kerofx пожалуйста, я сам уже задолбался с всякими ошибками и прЭколами юнити, поэтому хочу чтобы у других этого не было
@@Ritme Thanks
у меня такая же проблема как у того человека, но координаты модельки man и player идентичны то есть 0 0 0 @@Ritme
Не понял, зачем камере скрипт.
Она уже следует за челом, как ее добавляем в объект Player
Она слишком жёстко привязана к игроку будет. Будет поворачиваться за ним при повороте игрока, не получится реализовать плавное перемещение и т.п. В некоторых случаях это важно, поэтому лучше скриптить
Константин, здравствуйте. Как уже подсказали, скрипт движения камеры добавляется, чтобы она не была привязана только к объекту 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);
Почему у меня камера поворачивается в сторону, в которую смотрит персонаж? У вас камера идет за персом, а у меня + поворачивается
Объект CameraCenter нужно вытащить из объекта Player, чтобы он стоял отдельно.
@@gamerovn5229 понял, спасибо
Камера за персонажем не двигается, в чем может быть причина ?
Проверь,накинул скрипт камерамув на камеру центр
И еще проверь накинул на таргет плеера
Здравствуйте. Попробуйте, пожалуйста, добавить на камеру скрипт CameraMove и перенести Player в поле Target скрипта CameraMove - должно помочь.
camera.position = transform.position + new Vector3(0, 2.5f, -2.3f); я её прилепил как в предыдущем и не дёргалось ничего
сказано же было что может просто повести
В ролике во время 21:33 на объекте Player создается пустой объект CameraCenter, который является подчиненным для объекта Player.
Во время 21:51 на объект CameraCenter переносится MainCamera. При этом объект CameraCenter непонятно каким образом уходит из под объекта Player и становится с ним одинаковым в иерархии. Дальше везде CameraCenter является одинаковым в иерархии по отношению к объекту Player.
В чем тут смысл? Почему надо создавать объект CameraCenter подчиненным объекту Player вместо того, чтобы сразу не создать объект CameraCenter на пустом месте?
Здравствуйте. Объект «CameraCenter» создаётся в объекте «Player» для того, чтобы сменить глобальные координаты на те, которые будут находиться внутри игрока. «MainCamera» используется для того, чтобы стать дочерним объектом - он всегда следует за родителем.
eу меня в этом коде выдает ошибку на моменте ограничения движения по дороге, ссылаясь на Mathf.Clamp
Vector3 newPosition = transform.position + transform.forward * Time.deltaTime * _speed;
newPosition.x = Mathf.Clamp(newPosition.x -2.5f, 2.5f);
transform.position = newPosition;
float deltaX = Input.mousePosition.x - _oldMousePositionX;
_oldMousePositionX = Input.mousePosition.x;
_eulerY += deltaX;
_eulerY = Mathf.Clamp(_eulerY, -70, 70);
transform.eulerAngles = new Vector3(0, _eulerY, 0);
Assets\Scripts\Playermove.cs(26,35): error CS1501: No overload for method 'Clamp' takes 2 arguments
подскажите, с чем может быть связано?
Тут ошибка - newPosition.x = Mathf.Clamp(newPosition.x -2.5f, 2.5f);
Забыл запятую между newPosition.x и -2.5f.
Должно быть так:
newPosition.x = Mathf.Clamp(newPosition.x, -2.5f, 2.5f);
@@Dianom спасибо.
У меня перс просто вместо того чтобы смотреть вперед смотрит назад
Здравствуйте. Обычно так случается, если объекты на сцене повёрнуты в другом направлении. Если персонаж «Man» также двигается в обратную сторону, нужно развернуть все объекты на сцене - это должно помочь.
у меня мозги закипели с этим положением мышки
Странно, но у меня почему то нет никаких дерганий камеры, как в уроке, без LateUpdate нормально работает.
сказали же что может повести
у меня трансформ позицион меняется примерно так 0.00137952 и движения не видно это потому что + перед = забыл поставить +=))
+1
А почему бы не использовать "FixedUpdate", вместо того чтобы умножать что-то на `Time.deltaTime"? Это не наставление, просто реально интересно :)
FixedUpdate стандартно срабатывает 50 раз в секунду, и его используют для изменения физических компонентов. (потому что физика с такой частотой обновляется).
1. В данном случае у нас нет никакой физики.
2. У нас идёт постоянное считывание клавиш которые игрок нажал, и если мы будет проверять в FixedUpdate (50 раз) он может пропустить нажатие игрока.
@@КтоТо-х6ь6ь Спасибо, большое что отозвались и разъяснили. А что имеется ввиду, когда вы говорите "физический компонент"? Разве игрок - это не физический компонент?
@@rovshanbadirkhanov Игрок это обычный объект и Юнити его просто перемещает по сцене. Юнити для обработки физической симуляции использует физический движок nvidia PhysX, а он начинает работать когда на объект добавляешь физический компонент например Rigidbody и его движок начинает обрабатывать. А в данной игре у нас нет физических компонентов)
@@КтоТо-х6ь6ь Аа, терпеть более менее понятно, спасибо)
@@КтоТо-х6ь6ь Сколько раз в секунду Time.deltaTime ?
Блин, ну вот я смотрю этот курс и... ничего не понимаю. Просто тупо списываю код... Эхх, совсем не интересно так. Хочется же понимать что ты делаешь, а не тупо делать тоже самое
Не очень понял зачем на камеру вешать скрипт с апдейтом? Может просто сделать камеру дочерним объектом игрока и она автоматом будет следовать за персонажем без всяких апдейтов?