Нашел того человека, который в несколько видео объяснил мне все то, чему я пытался добиться на протяжении пол года.... Кто читает мой комент, можете смело подписаться и оставить лайк.
И ещё, что касается Flip, функция та что покороче не совсем одно и то же, что и первый вариант. Так как второй вариант после ходьбы в лево, возвращает idle на стоковую позицию, смотреть в право, первый вариант работает как надо. В Вашем же случае, разницы нет так как перс в положении idle фронтальный, ну а если бы перс стоял бы боком, то короткая функция не подошла бы. На моём персе, который стоит полубоком это ощутимо)) А так функция Reflect супер решение!
спасибо большое, у всех других баги или ошибки на новых версиях юнити, большая часть таких туторщиков сами непонимают как писать код а тут всё просто, быстро, понятно и если не правильно понял можно скачать исходный код из видео и посмотреть свои ошибки
Не знаю, как другие, но я уже полгода планирую перезаписать первые 3-4 видео, потому что и сам понял чего раньше не понимал и в движке кое-что поменялось - а значит надо обновлять инфу)
@@NoobGameDev бро а как сделать по вертикали ? типо нужно писать: moveVector.x = Input.GetAxisRaw("Vertical"); rb.velocity = new Vector2(moveVector.x * speed, rb.velocity.y); anim.SetFloat("moveX", Mathf.Abs(moveVector.x));
@@THEMERUSH И да и нет, а точнее не совсем) Если сделать так, то по идее перс при нажатии кнопки "вверх" будет идти в право, а при нажатии "вниз" - влево) Input.GetAxisRaw("Vertical") - грубо говоря, это с какой оси производить считывание... вниз = -1, вверх = 1, ничего = 0. А вот чтобы изменять ускорение самого объекта персонажа, нужно изменять значение по игрику свойства "velocity". Т.е. rb.velocity.x - это текущее ускорение по горизонтали. rb.velocity.y - по вертикали. Но напрямую их можно только считывать, а вот менять их можно через вектор: rb.velocity = new Vector2(); А уже в векторе указывать направление по горизонтали и вертикали: rb.velocity = new Vector2(X, Y); Текущие ускорения будут записываться так: rb.velocity = new Vector2(rb.velocity.x, rb.velocity.y); Т.е. чтобы перемещать перса по вертикали нужно сначала считать значение с оси ввода по вертикали: moveVector.y = Input.GetAxisRaw("Vertical"); а после изменить ускорение только по вертикали: rb.velocity = new Vector2(rb.velocity.x, moveVector.y); ну и можно умножить направление на какой-либо коэффициент, чтобы иметь возможность изменять скорость, типа: rb.velocity = new Vector2(rb.velocity.x, moveVector.y * speed); Но двигаться вниз ему будет мешать земля, а вверх гравитация. Поэтому нужно либо изменять в Инспекторе поле "Body Type" на "Kinematic", либо обнулять гравитацию. В 11-м уроке эта тема затронута)
@@Madl_Madl Упущение данного видео... Сорри! При создании первой анимации, нужно перейти во вкладку Animation и нажать на большую (серую с белыми буквами) кнопку Create, которая будет по центру окна вкладки (вместо шкалы).
До этого видео не знал про рефлект))) Пойду испробую новый метод). Кстати, советую в конце видео говорить про свой дискорд. Если бы не посмотрел "обращение к подписчикам" так бы о нем и не узнал, а задумка очень хорошая!
Используй лучше вот этот код в Reflect: if ((moveVector.x > 0 && !faceRight) || (moveVector.x < 0 && faceRight)) { Vector3 temp = transform.localScale; temp.x *= -1; transform.localScale = temp; faceRight = !faceRight; } Он самый стабильный - не вызывает проблем с камерой и прочим в отличии от такого варианта ещё к примеру: transform.Rotate(0, 180, 0); А Дискорд только 2 дня назад запустился, в следующие видео уже буду вставлять об этом инфу)
Да, спасибо! Я просто тот ещё дурень и поэтому забыл за этот вариант, когда видео делал... )) Когда буду перезаписывать первые 3-4 урока - обязательно его включу к остальным!
Спасибо за подробные уроки, они очень помогают! Я искал такое решение для разворота персонажа, чтобы вместе с ним поворачивались и его дочерние объекты, смотрел еще одно ваше видео про карабканья по стене и не мог понять как у вас разворачивается коллайдер wallChec вслед за персонажем, я у своего персонаже не мог этого добиться и вынужден был использовать два wallChec, для левой и правой стороны, что было не очень удобно, потому что когда персонаж спрыгивая со стены спиной все равно начинал на нее карабкаться ). Но теперь у меня другая проблема, камера сцены, является дочерним объектом персонажа, для того чтобы следовать за ним, и теперь при помощи этого метода разворота, она тоже разворачивается и моя сцена пропадает из вида камеры. У вас камера не двигается вслед за персонажем? Как бы вы решили эту проблему?
Привет спасибо за твои ролики. Очень помогают. Делаю свою файтинг игру в стиле битемапа. Хотел бы узнать как сделать для героя атаку, блок, комбо и способности. Если умеешь пожалуйста сними видео или ответь хотя бы. Ещё хотел бы узнать как сделать анимацию поворота слева на право и справа на лево персонажа
Правда эти видео уже можно считать устаревшими (есть практики получше, попонятнее, поудобнее) - нужно выкатить обновление, но всё никак не доберусь до них 😅Но когда-нибудь уж точно)
@@NoobGameDev да, я заметил некоторые проблемы. Пока только в переходах анимации, но ничего. Самое главное такие видео хотя бы задают направление. А от него уже можно двигатся
помогите пж. я добавил анимацию врагу но как мне ее в скрипт вставить, у меня враг двигается из стороны в сторону вот такой код: public class WalkBandit : Entity { public float speed = 3.5f; private Vector3 dir; private SpriteRenderer sprite; public Animator anim; private void Awake() { sprite = GetComponentInChildren(); }
Ну, смотрите... На сколько я понял, то враг вообще стоять не умеет) Поэтому в данном конкретном примере можно было бы обойтись лишь анимацией движения (сделать её дефолтной в аниматоре). Но если планируется добавить анимацию покоя, то я бы изменял moveX в методе Move после изменения transform.position. Но так как сейчас энеми заточен только под движение, то Вам придётся много чего переделать. И код немного переусложнён) Так что Вы и сами в нём начинаете запутываться (например есть переменная speed, но скорость движения врага нигде не регулируется, а так же есть сомнения, что перс нанесёт урон неподвижному игроку - скорей всего, он до него дойдёт, развернётся, и пойдёт искать стену... Я не уверен, но проверьте (: ). Конечно всегда приятно видеть, как люди сами пытаются придумывать свои решения, а не слизывают под чистую, но я бы посоветовал глянуть видео у Graphical Design на эту тему: ua-cam.com/channels/Hr72IH-33mrD2h09MR3N3Q.htmlsearch?query=патруль Для первых экспериментов с патрулём они неплохо подойдут)
@@NoobGameDev спасибо большое, я учту, а по поводу урона, я ещё не заморачивался, решил сначала с движениями разобраться а потом уже с уороном и тд. Спасибо за совет
Еще один способ разворота анимации он просто удобен но в нем наверно тоже есть недостатки (я пишу ротацию но можно и скеел ) void Flip() { if (Input.GetAxis("Horizontal") > 0) transform.localRotation = Quaternion.Euler(0, 0, 0); if (Input.GetAxis("Horizontal") < 0) transform.localRotation = Quaternion.Euler(0, 180, 0); }
Почему когда я ствлю знак умножить в рефлекте мне выдаёт ошибку вот код void Reflect() { if ((moveVector.x > 0 && !faceRighte) || (moveVector.x < 0 && faceRighte)) { transform.localScale *= new Vector2(-1, 1); faceRighte = !faceRighte; } } оператор"*=" не может применяться к опертандам типа "UnityEngine.Vector3" и "UnityEngine.Vector2"
Странно... А какую версию Unity используете? Можете попробовать такой вариант: void Reflect() { if ((moveVector.x > 0 && !faceRight) || (moveVector.x < 0 && faceRight)) { Vector3 temp = transform.localScale; temp.x *= -1; transform.localScale = temp; faceRight = !faceRight; } } или такой: void Reflect() { if ((moveVector.x > 0 && !faceRight) || (moveVector.x < 0 && faceRight)) { transform.Rotate(0, 180, 0); faceRight = !faceRight; } } При такой реализации и с камерой проблем меньше будет. Только чтобы у Вас всё заработало нужно заменить везде в примере faceRight на faceRighte. Ну или переименовать переменную перед функцией с faceRighte на faceRight.
@@WallDiesel Привет) Ну, совет будет таким же) А версия, да - старенькая уже. Советую, если не свежие, то попробовать хотя бы до 2019 LTS обновиться (там уже большинство полезных штук имеется, типа поддержки тайлмапов, событийной системы ввода и пр.)
@@NoobGameDev примного благодарен. Я первый способ сразу применил - всё работает. Буду обновляться. И спасибо за ролики. Эти уроки просто нечто. Абсолютно не зная С, при наличии фантазии уже можно что-то сделать.
Честно говоря, не сталкивался с таким (насколько я помню), но попробуйте следующее: если игра запущена, то остановите её и выделите в Иерархии объект персонажа, а уже потом попробуйте добавить переменную.
С Горизонтальной оси ввода может поступать либо отрицательное, либо положительное, либо нулевое вещественное (дробное) значение. В Аниматоре (в условиях перехода) для вещественных переменных есть только условия "больше" либо "меньше". Допустим, мы выбрали в условии перехода, что будем его запускать, когда значение ввода больше нуля. Тогда, если мы нажмём "вправо", то с оси ввода поступит положительное значение (допустим, единица) и сработает переход от анимации покоя к анимации ходьбы. Но если нажать "влево", то в аниматор поступит отрицательное значение (допустим, минус единица) и как следствие, переход настроенный на положительное значение не сработает, а значит персонаж будет перемещаться влево, но будет продолжать проигрываться анимация покоя. Поэтому мы можем передавать в Аниматор абсолютное значение, при котором любое число (и положительное и отрицательное) будет передаваться, как положительное. И как следствие переход к анимации ходьбы будет срабатывать при любом отличном от нуля значении. Можете попробовать убрать метод Mathf.Abs и наглядно увидеть, что получится)
А до добавления анимации он двигался? Если "да", то какую анимацию использовали (спрайтовую или позиционную)? Если не спрайтовую, то нужно смотреть на иерархию персонажа (должен быть основной объект, положение которого при анимировании изменять нельзя, а вот те объекты (руки, ноги, голова), которые находятся внутри главного - можно). Скорей всего, Вы, когда анимировали персонажа (нажимали кнопку "запись" и изменяли положение) изменили положение не того объекта. Но чтобы сказать наверняка, мне нужно видеть скриншот Иерархии и, какие параметры изменялись при анимации (выбрать анимацию в окне Animation). Поэтому, если есть возможность - скиньте скриншоты мне в ВК.
@@kodest8017 1. До добавления анимации он двигался (перемещался)? 2. В окне Иерархия или на Сцене выделить/выбрать персонажа, запустить игру. И обратить внимание меняется ли в блоке Transform в свойстве Position значение по X, когда Вы нажимаете клавиши движения?
@Noob Game Dev, Спасибо за понятный урок. Некоторые любят растекаться мыслью по древу, у тебя этого не увидел) Для тех у кого вылезает ошибка (AnimationEvent has no function name specified!) пкм по белому штриху, в аниматоре, удалить, удалять пока полностью не избавимся от всех штрихов. Видео с подробностями. ua-cam.com/video/rwnqHEd174w/v-deo.html
Здравствуйте) Да, есть такое упущение в ролике. У Вас, скорей всего, вместо шкалы анимации (когда переходите в окно Animation) должна быть по центру серая кнопка с надписью "Create" вот для первой анимации Вам, как раз нужна она. Если я не ошибаюсь и если правильно понял Вашу проблему.
всё сделал как в видео, код написан так же и ошибок никаких не выдаёт, анимации сменяются правильно, значения по x меняются и в компоненте скрипт и в аниматоре, короче всё работает кроме самой ходьбы, помоги пожалуйста, 7:47 вот тут я остановился и понял что у тебя он ходит а у меня нет((
:)) Это самое распространённое выражение среди начинающих "Всё сделал один в один, а ничего не работает". Значит не один в один, значит, что-то упустили... Если перс перемещался до анимации, то должен и после, - она на перемещение абсолютно не влияет в данном случае. Я ведь правильно понял, что при нажатии клавиши движения анимация воспроизводится, но перемещение не происходит? Очень похоже, что либо пропущена строка: rb.velocity = new Vector2(moveVector.x * speed, rb.velocity.y); Либо в Инспекторе в поле "Speed" стоит ноль, меняйте на 1,2,3,4... Если я не угадал, то скиньте сюда код)
@@NoobGameDev using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerMove : MonoBehaviour { public Rigidbody2D rb; public Animator anim; public Vector2 moveVector; public float speed = 2; void Start() { rb = GetComponent(); anim = GetComponent(); } void Update() { walk(); } void walk() { moveVector.x = Input.GetAxis("Horizontal"); rb.velocity = new Vector2(moveVector.x * speed, rb.velocity.y); anim.SetFloat("MoveX",Mathf.Abs(moveVector.x)); } } строка была и скорость 2f стояла, но персонаж все также не двигается, единственное что отличается в моем проекте от вашего это то что у меня анимация покоя не глаза увеличиваются а персонаж уменьшается и увеличивается (типо дышит) возможно это изза этого хотя хз, спасибо за ответ. И кстати да вы все правильно поняли, анимации работают правильно но перемещения нету
@@winter2021inmemory В окне Инспектора ещё посмотрите, какое значение в поле "Speed" и попробуйте изменить его прям значительно, например на 50, на 100. Именно в Инспекторе, а не в коде. Возможно, он у Вас движется, но очень медленно. Обратите внимание на поле Position по иксу в Инспекторе. Изменяется при движении или нет. И ещё попробуйте изменить строку: moveVector.x = Input.GetAxis("Horizontal"); на следующую: moveVector.x = Input.GetAxisRaw("Horizontal");
@@NoobGameDev ех все сделал и ничего не помогло, Position по иксу изменяется но он не движется, прийдетсся создавать новый и заново идти по вашему курсу, подскажите пожалуйста где вы изучаете юнити или C#
@@winter2021inmemory Ой, эта фраза "Position по иксу изменяется но он не движется" противоречит сама себе... Изменение координат по икс это и есть перемещение вправо/влево) Т.е. по всем признакам он у Вас перемещается)) Получается, что визуально кажется, что ничего не происходит... Может вы с камерой уже успели что-то сделать, например, добавить на неё скрипты для слежения за персонажем? Если да, то попробуйте их отключить или удалить. Начать заново оно то можно, но если не устранить проблему, не найти её причину, то она снова может появиться. Если есть желание, то можете мне в ВК кинуть видео или скрины и мы ещё пободаемся с этой ситуацией, ну, или можете начать заново, пока ещё слишком далеко не ушли) Про изучение, я напишу где-нибудь в Обсуждении или О канале, так как не первый раз уже спрашивают, ну, а вкратце - это поисковики, форумы, youtube.
Приветствую! Спасибо за видео. Простой вопрос, почему после движения влево спрайт персонажа обратно разворачивается вправо в исходное положение, в инспекторе видно что Flip оси Х при нажатии влево включается а потом выключается. использовал одну строчку кода через функцию flip.
Нужно код смотреть, скорей всего, где-то в условиях срабатывания ошибка и поэтому он не остаётся смотреть в ту сторону, в которую шёл. Так же, возможно, что если использовалась запись в Аниматоре, то Flip был записан и там, что и вызывает такое поведение...
@@NoobGameDev у меня немного другой вопрос.У меня все так как в видео вроде,но когда я хочу при беге повернуться в другую сторону,то сначала начинается анимация покоя и лишь позже анимация бега.Незнаю важно это или нет,но заметил что x имеет всего 2 значения,это 0 и 1,хотя у вас у него значений больше.
@@ВиталийИваногло-ф7в Смотрите, если у Вас moveX в Аниматоре имеет только 0 и 1, то это даже лучше (вещественные значения могут приводить в движение анимацию покоя - оно вам не нужно). Так происходит из-за использования метода GetAxisRaw вместо GetAxis. Поэтому советую оставить всё как есть, но вот в Аниматоре попробовать немного изменить настройки переходов: от Покоя к Ходьбе - HasExitTime (откл.), в условии moveX -> Greater (больше) -> 0 от Ходьбы к Покою - HasExitTime (откл.), в условии moveX -> Less (меньше)-> 1 Должно починиться)
Здравствуйте! Проблема ещё актуальна? Если да, то скажите: вы код переписывали или копировали из описания? Если переписывали, то скиньте код - посмотрю. Так же проблема может быть связана с FlipX... Возможно, пробовали и забыли убрать при записи анимации.
:) Прямо над Enter'ом должна быть (на англ. раскладке Shift + "'эта кнопка") P.S. если вдруг у Вас эта кнопка залипает или ещё чего, то можете скопировать и вставить: " || "
Красавчик, очень информативно хотелось еще от тебя уч.пособий! Будут? Главное что показываешь варианты и объясняешь ща и против 🤝 А вот фразочка (Рисовач) меня повеселила! Вот этого точно не хватает😟
Спасибо!) Будут) Куда же им деваться!? Я сейчас в геймджеме участвую до конца месяца. Так что материала много имеется, как познавательного, так и развлекательного. Джем закончится, снег выпадет и я засяду за видосы) Надеюсь))
@@NoobGameDev оке ждемс у меня 14 числа начинается обучение по Unity 4 месяца и вот твой туториал прохожу, но подставляю синего челика с Assets Unity уроки 2d платформер кстати посмотри этот ассет какая у них механика в игре очень прикольно челик дохнет и появляется ну и т.д Ну тогда ждемс!
@@NoobGameDev Eccentric Games тап паренёк Илья очень интересные вещи показывает купил еще месяц или более назад за 40т.р Я как бы на сайте и Unity прохожу и у Вас тут на Тюбе, но захотел как говорится структурированные уроки от и до. Я как бы после его курса (4 месяца) пойду далее учится и учится с кем пока не знаю ,но мысли есть. У него на Тюбе есть канал зайди глянь !
@@oldborodach Я знаю этот канал) Там и правда парень довольно умный и говорят курсы неплохие. Правда я прям буквально на днях узнал, что у него курсы есть...
Всё нормально - опечатались: не "ads", а "Abs" (не "d", а "b" и с большой буквы). Если всё настроено правильно, то при вводе начала метода, VS должна предлагать Вам варианты команд (это очень помогает делать меньше ошибок), поэтому если Вам при вводе имён методов не предлагают вариантов и/или если нет подсветки кода, то ещё советую посмотреть это видео: ua-cam.com/video/w8J-srV9uzw/v-deo.html
Я правильно понимаю, что в строчке: if ((moveVector.x > 0 && !faceRight) || (moveVector.x < 0 && faceRight)) имеется ввиду, что за переменной(если я так понял) "moveVector" считается движение всего персонажа с прилегающими к нему вещами типа анимации и привязанных спрайтов, а условие "&& faceRight" это сторона, в которую смотрит спрайт переменной moveVector? UPD: после этого, анимации idle и move перестали показываться в игре, хотя в просмотре сцены все работает. UPD 2.0 : если убрать привязку камеры к персонажу, то анимация появляется в игре. UPD 3.0 : если не вызывать "transform.localScale" при привязанной к персонажу камеры, то анимация сохраняется, но если повернуться, то сразу пропадает и не возвращается. Я думаю, если как-то заставить игнорировать камеру отзеркаливание персонажа, то все наладится, но я не знаю как это сделать
Да, да) Вы плюс/минус правильно мыслите) Я так понимаю, что Вы просто перетащили камеру на перса? Это не самый лучший вариант, к тому же накладывает некоторые ограничения. Но она должна адекватно заработать, если изменить содержимое функции для отражения спрайтов на такое: if ((moveVector.x > 0 && !faceRight) || (moveVector.x < 0 && faceRight)) { Vector3 temp = transform.localScale; temp.x *= -1; transform.localScale = temp; faceRight = !faceRight; } Или на такое (лучше первый вариант): if ((moveVector.x > 0 && !faceRight) || (moveVector.x < 0 && faceRight)) { transform.Rotate(0, 180, 0); faceRight = !faceRight; }
@@NoobGameDev я сделал первый вариант и все работает, спасибо! Только один вопрос: что такое temp и Vector3, типа для камеры отдельный вектор создается, который игнорирует отражение?
@@mukulash7865 Нет. Всё дело в том, что localScale - это масштаб и он имеет три параметра (по одному на каждую ось: X, Y, Z) и всё это хранится в переменной типа Vector3. В Vector2 хранится только X и Y. Но в Unity есть ограничения - нельзя умножить какой-то из параметров переменной localScale отдельно от других. Т.е. если сделать localScale.x * 2, то это вызовет ошибку. Однако если сделать так: localScale * 3, т.е. умножить вектор (а не параметр), то всё нормально. Но в таком случае на 3 умножится и значение по X, и по Y, и по Z... Пример на видео перемножает Vector3(localScale) на Vector2 в результате чего масштаб по оси Z обнуляется (а был равен 1). В результате чего привязанная к персонажу камера не "дотягивается" до слоев... Это можно увидеть если перевести сцену из 2D режима в 3D. А localScale на Vector3 Unity умножать не позволяет... Поэтому приходится делать временную переменную "temp", копировать в неё значение localScale, потом отдельно изменять значение по иксу, а потом уже присваивать localScale значение из временного вектора (temp) с уже изменённым параметром X. Кратко говоря - это особенности движка. Которым я по неопытности не предал должного значения, когда делал видео... Поэтому, скорей всего, когда руки до этого дойдут, то обязательно перезалью или дополню первые три/четыре видео)
Скажи пожалуйста как сделать анимацию для атаки персонажа точнее что нужно вписать в скрипте что бы нажимаю какую то кнопку производилась анимация атаки
Вам в любом случае нужна ссылка на Animator. В моих примерах это anim. И вы можете, либо использовать переменные в Аниматоре (в условиях переходов) и тогда изменять эти переменные примерно так (пример для float): anim.SetFloat('имяпеременной', значение); либо можете прерывать текущую анимацию и запускать какую вам нужно: anim.Play("имяанимации"); Только следите за регистром букв, потому что "moveX" и "movex" будут считаться разными переменными (то же самое и с именами анимаций)
Что значит "заходя в игру"? Когда запускаете проект из UnityHub, или когда нажимаете кнопку "Play" в Unity. Если второе, то, скорей всего, в коде пунктуационная ошибка (пропустили ";" опечатались и пр.), либо, создали публичное поле, в которое забыли перетащить нужный объект или компонент. Такое поведение обычно сопровождается красным текстом в консоли и в левом нижнем углу Unity. В любом случае, без текста ошибки большего сказать не могу...
Когда прописываю Reflect, scale персонажа не меняется. В инспекторе вижу, что faceRight включается и отключается правильно, но персонаж не поворачивается. Почему так может быть?
А вы случайно не пробовали вариант с Flip'ами, может быть, когда создавали анимации, то не обратили внимание и где-то оставили чек-бокс Flip включенным. Или может у вас сразу обе ф-и работают и Flip и Reflect (должна остаться только одна). Просто если faceRight меняется, то значит, что код работает правильно, только что-то ещё разворачивает персонажа обратно. Я бы искал проблему в анимациях, особенно если вы делали их процедурными - нажимали кнопку записи и что-то двигали. Я к сожалению больше по описанию сказать не могу, сорри...
@@NoobGameDev сейчас посмотрю насчет Flip, может не заметил. А еще насчет Scale спросить хотел. Не особо разбираюсь в коде, но вы написали: изменение Scale с 1 на -1, при этом, размер вашего персонажа как раз целая единица и десятые там. А у меня размер персонажа 0.6332 Может ли это как-то повлиять?
@@alterationofficial Нет, не должно, потому что каждый раз происходит умножение значения Scale по X на -1, т.е. у Вас он когда будет смотреть вправо, то по икс будет 0.6332, а когда влево, то -0.6332.
@@NoobGameDev возможно проблемы правда с анимацией были. Создал новый проект, и первым делом настроил ходьбу, прыжок и поворот, а потом уже анимации добавил - все заработало как нужно
Возможно, Вы в Аниматоре создали int переменную - попробуйте её удалить и заново создать float. Так же в коде обратите внимание, что метод у аниматора должен быть SetFloat для float переменных и SetInteger для переменных типа int.
А может есть жёлтые предупреждения? Обратите внимание, на имена и типа переменных в Аниматоре. Если Вы из кода меняете float переменную (anim.SetFloat("moveX", 2f)), а в Аниматоре она у Вас int, то работать не будет. Так же важно, чтобы совпадали регистры букв, т.е. если в Аниматоре переменная имеет имя "moveX", а в коде Вы меняете "movex", то тоже работать не будет.
Помоги пожалуйста, первый раз как я сделал анимацию она полностью работала, я вышел из юнити и сохранил все. Потом я захожу и у меня ничего не сохранилось и пишет "the animator controller (player) you have used is not valid. animations will not play". Что делать?
Похоже, что не выбран (или слетел каким-то образом) контроллер Аниматора. Попробуйте выбрать объект персонажа в Иерархии и справа, в окне Инспектора найдите блок Animator. В этом блоке в первом поле "Controller" посмотрите, что выбрано... Если там "None", то нажмите на кружок с точкой чуть правее поля, откроется окно... выберете в нём то, что там будет. Если в открывшемся окне ничего кроме None, то вы удалили контроллер аниматора (в проводнике Unity, который выглядит, как два серых квадрата на фоне бирюзового). Тогда можете в проводнике Unity создать новый контроллер (правой кнопкой по пустому мету -> Create -> Animator Controller) и переместить его в поле Controller блока Animator в Инспекторе. Ну, или, если Вас запутало данное объяснение, то делайте заново с момента добавления анимации.
Помогите пожалуйста. У меня выдаёт ошибку: Parametr 'moveX' does not exist. UnityEngine.Animator:SetFloat(String, Single) Помогите пожалуйста разобраться в этом.
Unity сообщает Вам, что не может найти среди переменный в Аниматоре переменную с именем "moveX". Т.е. Вы либо ещё не создали переменную "moveX" (именно в окне Аnimator), либо неправильно указали её имя (обратите внимание на регистр букв в имени переменной, т.к. "moveX", "MoveX", "MOVEx" - это три разных переменных)
Привет вот вопрос как пофиксить чтобы в анимации walk синяя линия не останавливалась в конце, а начинала с начала идти. Поросто она у меня до конца доходит и все.
Привет) Если я правильно понял, то нужно включить для анимации зацикливание. Для этого в Аниматоре дважды нужно щёлкнуть по нужному блоку анимации (по walk) и после этого в Инспекторе (обычно справа) появится поле (а точнее чек-бокс) "Loop" - нужно в нём поставить галочку.
Только недавно начал изучать Unity, и возник такой вопрос вот есть у меня анимация покоя, анимация бега и анимация прыжка, всё делал по вашим урокам. Но как быть если рисовачь нормально прокачен, а в юнити нуб? Дело в том, что мне надо сделать переходные анимации моему герою. Например анимация от бега до покоя, скажем между ними анимация остановки героя или от прыжка, до покоя и бега и между ними анимация приземления после того как проверилась земля? Разными способами пробовал но постоянно отрабатывает всё очень некорректно.
С мучением и методом тыка добился корректной работы моей идеи, не знаю на сколько это правильно, возможно у кого-то будет более интересное решение. От прыжка к анимации приземления я оставил настройки такие как были от прыжка и до покоя, а вот от анимации приземления до покоя и бега Has Exit time ставим галочку, Exit time=1, fixet duration ставим галочку, transition duration=0, transition ofset=0, interaption source=Current state, Order interaption ставим галочку. loop time убираем галочку. Такое можно применять от бега до покоя, например момент остановки. С такими мелочами игра будет выглядеть более богаче и насыщеннее.
Всё Вы правильно делаете (и, спасибо, что делитесь своими идеями!), я давал такие настройки, для самого базового знакомства с этими монстрами, понятно, что если добавлять переходные анимации, то всё выглядит круто, но в начале работы с Unity очень тяжело настроить такие мелочи. К тому же, как Вы понимаете, я и сам далеко не ас в Unity (из нескольких примеров делаю свой, пытаюсь разобраться как всё работает, делаю урок, чтобы поделиться и ещё глубже понять реализацию). Кстати, скоро, в 3-ем отчётном видео будет в конце пример подобной механики.
А как себя ведёт перс, когда вы приземляетесь и резко начинаете идти, при данных настройках? По идее, если не отключать управление до конца проигрывания анимации приземления, то перс уже будет перемещаться, а проигрываться будет анимация приземления... (особенно, если она довольно продолжительная)
Не нашел ответа в коментариях, поэтому задам сам этот вопрос. У меня при анимации Idle персонаж смотрит вправо, анимации передвижения тоже работают коректно (в том числе и при движении справа влево все зеркалится как надо). Вот только после перемещения влево и остановки анимация переходит в Idle и персонаж снова смотрит вправо (визуально это выглядит резко и рывком). Можно ли как то в скрипте прописать условие чтобы после движения влево галочка FlipX не снималась, и персонаж оставался смотреть в ту же сторону куда перед этим двигался?
Я так понял, что Вы решили через Flip сделать и выбрали вариант записи в одну строку... Реализуйте тот вариант метода Flip, который был до 8:40 (т.е. тот который в несколько строк) - он не будет срабатывать, когда от игрока нет ввода (т.е. когда moveVector.x == 0)
@@NoobGameDev спасибо, уже попробовал но через Reflect. Все заработало как надо, действительно как и сказанно в видео проблем с ним должно встретится меньше :) Спасибо!
я не понимаю именно когда прописываю код флип на поворот он не чувствует управления ну типо вообще не управляется и со вторым способом в других видосах видел не понимал почему не ходит и щас тоже самое зато я понял что он не ходит изза этого кода а как исправить? прошу ответь(сори что без запятых)
Ответить то не проблема, только боюсь, что я не совсем понял, что и почему у Вас происходит... Данные функции "Flip" и "Reflect" только лишь отражают картинку по горизонтали. За движение персонажа (влево/вправо) отвечает функция "Walk" (в моём примере). Т.е., если персонаж у Вас ходил до добавления методов отражения, то должен перемещаться и после... Скопируйте, скиньте код всего своего скрипта в комментарии (думаю он должен быть ещё не очень большой), чтобы не гадать, чтобы прям наверняка)
А какой используется метод ввода в скрипте управления персонажем? Если Input.GetAxis("Horizontal")... и в условиях перехода между анимациями moveX > 0.1, к примеру, то такое вполне возможно, потому что при использовании данного метода вектор будет расти от 0 к 1 постепенно. Поэтому попробуйте использовать Input.GetAxisRaw("Horizontal")... и тоже самое с вертикальной осью. Возможно, это решит проблему. Если нет, то есть вероятность, что задано слишком "большое" наложение анимаций друг на друга в настройках перехода.
Если в одно и тоже место независимо от того, в какую сторону смотрел перс до анимации, то причина может быть в том, что при записи анимации был затронут компонент Transform - например, если случайно или специально подвинули какую-то часть тела. Чтобы такого избежать у персонажа должна быть корректная иерархия: один основной объект (без спрайтов), а дочерние (в нём/под ним) уже могут спокойно перемещаться. Потому что позиция будет считаться относительно родительского объекта, а не центра всей сцены. Если же перс при нажатии влево-вправо, как будто бы отпрыгивает от центра, то проблема может быть в том, что некорректно настроен Pivot спрайта (синий бублик, в Sprite Editor - где спрайты нарезаются). В идеале он должен быть в центре снизу, т.е. под ногами. Так как этот бублик спрайта всегда совмещается с центром объекта. Если он будет где-то в стороне, то и спрайт будет настолько же далеко от центра объекта.
Помогите пожалуйста, персонаж стоит с бензопилой (нарисован так) и когда он поворачивается - то выглядит будто центр не там где персонаж, а там где бензопила.
Вам нужно сместить Pivot спрайта. Это, так скажем точка, которую Unity будет считать за центр изображения. 1. Выделите изображение в окне Project 2. В Инспекторе нажмите на кнопку Sprite Editor 3. Отроется редактор спрайтов (обычно им нарезают атласы на отдельные изображения). Поэтому если изображений несколько, то кликните по нужному. Если же одно, то вы должны увидеть синий бублик (скорей всего, в центре спрайта). 4. Отпозиционируйте этот кружок так как вам нужно. Обычно его ставят либо в районе живота персонажа, либо в ногах. Более точно можете выставить положение, если выберете Pivot - Custom (в небольшом меню справа внизу) и изменив X так, чтобы пивот переместился по центру перса (думаю, что в Вашем случае будет достаточно изменить только X, чтобы не переделывать перса) 5. После этого нажмите кнопку Apply в правом верхнем углу окна Sprite Renderer'а, чтобы применить изменения. Лучше бы Вам это скриншотами показать, поэтому, если не поймёте, то посетите наш Дискорд сервер (ссылка есть в шапке канала) и задайте свой вопрос в соответствующем канале)
Если проблема ещё актуальна, то проверьте не меняется ли Flip, т.е. не используете ли Вы оба способа сразу, в результате чего один способ мешает другому.
Здравствуйте. Можете объяснить зачем мы после transform.localScale написали "*=", а не просто ровно? Там идёт умножение на -1 и поэтому получается противоположное значение?
Всё верно) Чтобы от лишних действий избавиться, если просто присваивать, т. е. просто = , то перс всегда влево будет смотреть. Работает по такому же принципу, как и +=, и -=. A *= B, равносильно A = A * B.
Здравствуйте все прекрасно работает, но у меня появился еще 1 вопрос когда я привязываю камеру к персонажу она поворачивается вместе с ним как это пофиксить ?
Я так понимаю, что это мы с Вами в ВК общались?) В любом случае, я отвечу, чтобы этот коммент, возможно, избавил кого-то от подобного вопроса. Если делать простую (грубую, без сглаживаний) привязку камеры к Персонажу (сделать его дочерним, переместив в Иерархии объект "MainCamera" на объект "Character"), то необходимо изменить функцию Reflect следующим образом: void Reflect() { if ((moveVector.x > 0 && !faceRight) || (moveVector.x < 0 && faceRight)) { Vector3 theScale = transform.localScale; theScale.x *= -1; transform.localScale = theScale; faceRight = !faceRight; } } Если же это делать через скрипт "слежения" ("вешается" на камеру) за Персонажем, то необходимо принимать решения в зависимости от конкретного скрипта.
Привет, У меня после команды else if (moveVector.x < 0); { Sr.flipX = true; } Начало писать 6 ошибок: Else не может запускать оператор Синтаксическая ошибка, требуется ( Недопустимый термин else в выражении Требуется ) Требуется ; но после того как я всё это сделал зелёным (я не очень помню) дописал код. А в итоге он не поварачивается
Ну, всё логично) Вы написали часть кода, каким-то образом исправили ошибки Студии, но это вовсе не означает, что код будет работать должным образом. Перепишите всё в точности как в видео и посмотрите какой-нибудь видеоурок по основам программирования. Так как, например, в любом языке оператор else не может существовать без if перед ним. Т.е. должно быть примерно так: if (а > b) { // выполняемый код } else { // выполняемый код } На "псевдо языке" это выглядит так: если (данное условие верно) { // то выполняем код здесь } иначе { // выполняем код здесь }
@@NoobGameDev Спасибо большое) Я написал Скрипт полностью как у вас, но всё равно выдает ошибки. Ну да ладно, всё равно спасибо, я попробую переписать :))
@@zheckacentrop :)) Попробуйте понять движок) Переводите ошибки на русский или гуглите. Обычно, если есть номер строки и номер символа (например 36; 17), то ошибка синтаксическая (т.е. допущена Вами), зачастую пишется символ, который по логике программы должен был стоять на указанном в ошибке месте.
Скорей всего анимация ходьбы воспроизводится только после полного проигрывания анимации покоя. Думаю, проблема в переходе: idle ➝ walk В настройках этого перехода нужно убрать галочку с поля Has Exit Time (это выход по завершению анимации)
можете помочь те кто разбираются? у меня на игроке висит камера(дочерний объект) и соответственно при повороте она тоже разворачивается. как это изменить?
Здравствуйте, есть проблема-все делал с нуля по вашим урокам, но почему то при ходьбе влево персонаж смотрит направо, и наоборот. Pulsar 13 что-то писал про это снизу в коментариях, но хотелось бы получить помощь от самого автора:)
Здравствуйте!) Скорей всего у Вас включен FlipX. Выберите персонажа, и в Инспекторе снимите галочку с чек-бокса FlipX. Так же нужно знать какую ф-ю вы используете, с изменением FlipX или LocalScale.x? И как у Вас нарисованы спрайты? По умолчанию они должны быть "смотрящими" вправо. А Pulsar13 говорил за то, что при использовании ф-и с изменением FlipX, персонаж при нажатой клавише влево смотрел влево, но когда клавиша отпускалась, то перс разворачивался вправо)
Controller 'Player 1': Transition '' in state 'walk' uses parameter 'MoveX' which does not exist in controller. UnityEditor.EditorApplication:Internal_CallGlobalEventHandler() так же и с айдл, помоги пожалуйста
У Вас раньше в Аниматоре была переменная "MoveX", которую Вы использовали в условии перехода от анимации "walk". Видимо после того как Вы выбрали её в условии перехода, Вы её удалили или переименовали. Во-первых, убедитесь, что у вас есть переменная "MoveX" в Аниматоре (так же обратите внимание на регистр букв! в уроке было использовано "moveX") Во-вторых, проверьте переходы: walk -> idle idle -> walk В них, скорей всего, в окне Инспектора в блоке Conditions будет пустое поле с надписью "Parametr dos not exist Controller", выбирайте в поле параметр "MoveX" и настраивайте в соответствии с переходом. А, возможно, чтобы не запутаться , лучше удалить переходы walk -> idle idle -> walk и создать и настроить их заново.
У старой системы ввода есть два метода: GetAxis и GetAxisRaw. Первый возвращает вещественные числа (0.1, 0.23 и т.д.), а второй только 0 или 1/-1. Когда Вы нажимаете кнопки A, D или стрелки "влево/вправо", то значения Горизонтальной оси ввода меняются хоть и быстро, но плавно (это в настройках при необходимости меняется). В вашем случае достаточно будет заменить GetAxis на GetAxisRaw в строке, похожей на эту: Input.GetAxis("Horizontal") чтобы стало так: Input.GetAxisRaw("Horizontal")
Здравствуйте! Проверьте наличие самой переменной в аниматоре, а так же раскладку в её имени (как в самом Аниматоре) так и при изменении её из кода, т.е. чтобы не было такого, что в имени "moveX" будет кириллическая "о", "е", или "Х". Т.е. перепишите название переменной в Аниматоре, скопируйте и вставьте туда где происходит изменение (anim.SetFloat("moveX") = ...) Так же проверьте, чтобы и тип переменной (при её создании) и метод для изменения значения были соответствующими. Т.е. если Вы создали float (вещественную) переменную, то и изменять её нужно при помощи anim.SetFloat("moveX"), а если int (целочисленную), то anim.SetInteger("moveX")
@@Матвеёга Если до добавления анимации перс нормально падал, то это значит, что во время записи анимации вы меняли положение основного (родительского) объекта персонажа, т.е. другими словами: сами указали , чтобы объект находился на том или ином месте. Поэтому он и висит на месте) Т.е. есть, допустим объект "Player", и если его развернуть (в Иерархии), то в нём есть, допустим "Правая рука", "Левая нога", "Голова" и пр. Так вот изменять положение рук, ног, головы при записи анимации можно, а основного объекта - Player не стоит.
Я под вашим комментом ответил на похожий вопрос. Там конечно и другие причины могут быть, но судя по тому, под каким видео возник вопрос, то вероятнее всего, проблема именно в том, что использовалась запись при анимировании, и двигался основной объект персонажа. Нужно переделать анимацию, либо, что лучше - сделать её с нуля и следить за тем, чтобы в изменяемых параметрах не оказалось положения родительского объекта.
В коде приведенном по ссылке, отсутствует строка: public bool faceRight = true; из-за чего появляется ошибка: CS0103 Имя "faceRight" не существует в текущем контексте.
На вскидку такое может быть, из-за Pivot'ов спрайтов. Когда используется Sprite Editor (например, для нарезки спрайтов), то при выделении спрайта он обводится рамкой в которой есть синий кружок. Вот этот синий кружок - это, грубо говоря, центр рисунка. мне кажется, что он у тебя либо слева с краю, либо справа - нужно переместить его (в идеале) в ноги персонажа. Речь вот об этом (просто, чтобы понять что это и где): ua-cam.com/video/HC24ugl5YFI/v-deo.html UPD: Чтобы сильно не мучаться, сначала посоветовал бы изменить Pivot на Bottom (кружок станет снизу по центру)
@@NoobGameDev Я создал перса через empty, присваивая ему дочерние объекты в виде спрайтов head, hand и пр. Соответственно я начал менять Pivot на bottom center у каждого спрайта по отдельности, как иначе сделать в моем случае хз. Не помогло. Добавлю еще, что я хз как нормально прикрепить empty к его дочерним спрайтам, вначале он у меня вообще был расположен вдали от своих дочерних моделей(словно его душа покинула:D), но потом кое-как, выделив на сцене спрайты, определил на глаз и перетащил их к предполагаемой позиции empty. При выставлении идентичной позиции у empty и спрайтов получается какая-то лажа - расположение иконок оси координат все так же не совпадает. Ах да, так же я менял order in layer и все, что с этим связано. Ну это все я так к слову, может поможет как-то решению проблемы)
@@NoobGameDev В общем ситуация меняется когда я подгоняю расположение empty под расположение его дочерних спрайтов, но выглядит как-то все это костыльно, есть метод как их уверенно расположить? UPD Разобрался. Вытащил спрайты из эмпти и ресетнул позиции у всех. Сорян за глупые вопросы)
Здравствуйте. Скажите пожалуйста в чем может быть проблема. Когда персонаж начинает идти, то анимация не сразу начинает проигрываться... То есть он начинает двигаться, а анимация ног начинается где-то через пару секунд. И потом он останавливается, а ноги еще идут, хоте перс уже остановился. Буду очень признательна, за ответ
Приветствую) В переходах от анимации покоя к анимации ходьбы и обратно нужно отключить галочку Has Exit Time... Потому что она означает что переход между анимациями произойдёт только после того, как текущая анимация доиграется до конца. Так же можно ещё заменить метод Input.GetAxis("Horizontal") на Input.GetAxisRaw("Horizontal"), тогда значение moveX в Аниматоре будет изменяться не плавно от 0.0 до 1.0, а резко (если влево/вправо нажаты то 1, если не нажаты то 0) и соответственно анимации будут переключаться чётче.
привет тут такая проблема что я сделал все как на видео, даже код позоимствовал) но анимация не работает, только в кампонентах у персонажа в кампоненте анимация стоит белый значок сообщение и внутри возклецательный знак и написанно что то про кревые, помоги пожайлуйста)
Здравствуйте, надеюсь ответите, как я знаю для того что бы движение персонажа работало одинаково на разных устройствах, нужно метод walk перетащить в метод FixedUpdate и при этом скорость персонажа у меня в окне Game должна была измениться(на прошлом проекте изменялась) но тут этого не произошло, так и должно быть или у меня какая-то проблема? И правда ли что при использовании метода FixedUpdate на разных устройствах будет одинаковая скорость движение или я ошибаюсь?
Здравствуйте! Если глобально, то Вы правы. Разница в том, что FixedUpdate вызывается фиксированное число раз (по умолчанию каждые 0.02 сек), а вот число вызовов Update зависит от мощностей компьютера, т.е. 120 fps в игре будут означать, что за секунду Update будет вызван 120 раз. При этом FixedUpdate будет вызван за секунду 50 раз не зависимо от мощностей. Поэтому обычно делают так. Весь ввод от игрока (клавиши, мышка...) считываются в Update (чтобы ничего не пропустить), а вот всё что связано с "физикой" (расположением в пространстве, скоростями) вычисляют в FixedUpdate. Однако от того, как написан метод тоже много зависит. Например, если метод перемещения имеющий такой вид: rb.velocity = new Vector2(inputVector.x * speed, rb.velocity.y); изменить на такой: rb.velocity = new Vector2(inputVector.x * speed * Time.deltaTime, rb.velocity.y); То он будет одинаково работать на всех машинах, так как Time.deltaTime - время, прошедшее между последним и текущим кадрами. Чтобы точно всё работало, как задумывалось пишите считывающие ввод от игрока методы в Update (тот же Walk, Jump), а те, которые работают "самостоятельно" (например CheckGround) вызывайте в FixedUpdate.
@@NoobGameDev спасибо большое, теперь в этом я буду уверен. Извените если отвлекаю, но появилась проблема которую я никак не могу решить, (весь код я брал у вас, и вроде бы ошибок не было) когда персонаж двигается он слегка подпрыгивает при этом ось "y" совсем немного изменяется, материал у меня в персонаже по всем параметрам выставлен на 0, графика пиксельная, сделана с помощью title map. И ещё когда я добавил камеру с помощью cinemachine и указал объект(персонажа) за которым она должна двигаться, персонаж начал очень сильно дёргаться при движении, на форумах я вычитал что это может быть связано с рассинхроном между физикой персонажа и камерой (я так это понял), я не сделал main camera дочерним объектом как в прошлом проекте, так как при повороте персонажа всё что видела камера исчезло(скорее всего это связано с тем, что я использовал другой код для флипа персонажа) Можно ли как-то исправить эти проблемы? Извените за потраченное время
Почитав ваши коментарии я понял, что при использовании titleMapCollider2D возможно появление остановок придвижении (это именно у boxcollider2D) и небольшие подпрыгивания (при использовании capsule Collider2D)
@@makestudio1505 По поводу подпрыгиваний, тут мне кажется, что дело либо в самой анимации ходьбы (особенно если происходят изменения коллайдера), либо из-за стыков тайлов. Обратите внимание, если перс подпрыгивает именно на стыке, то посмотрите в сторону Composite коллайдер (он объединяет тайлы одного тайлмапа в один, тем самым убирая стыки). А по поводу камеры и дёрганий - это бы конечно посмотреть, как именно это выглядит. Обратить внимание на трансформ - изменяются ли при этом какие-то параметры. Это может быть связано, как с отражением и флипами спрайтов, так и с настройками синемашин... Звучит очень знакомо и как будто бы было такое... Но, к сожалению, сходу не вспомню в чём проблема. Если есть возможность, то можете присоединиться к нам в Дискорд (ссылка есть в шапке канала) - может, там у кого из ребят похожая проблема была или я вдруг вспомню с чем это связано)
Если в одном изображении несколько спрайтов, то очень важно изменить параметр Sprite Mode на Multiple (выделить картинку и найти поле в Инспекторе). А при разрезке поначалу можно использовать автоматический режим: выделить изображение, нажать в Инспекторе Sprite Editor и во вкладке Slice (слева сверху окна) в поле Type выбрать Automatic. В этом же выпавшем подменю нажать на Slice и Unity автоматически нарежет спрайты (если они не соприкасаются друг с другом). Он обычно может нарезать даже больше чем нужно (он может отдельную точку за спрайт посчитать), но при такой инструкции он должен нарезать спрайты нормально. После этого справа сверху нажать кнопку Apply, чтобы сохранить изменения. После этих манипуляций, если нажать на стрелку справа на изображении которое было нарезано, то развернутся все спрайты, по отдельности. Возможно я вас не совсем правильно понял... Поэтому, если есть желание, то можете присоединиться к нам в Дискорд: discord.gg/AHpWFBAJJr Там со скриншотами проще будет и вам объяснить и мне)
Здраствуйте, у меня следующая проблема. При написании строчки кода, anim.SetFloat() , выдает ошибку, что анимация не содержит в себе метод SetFloat(). В чем же проблема? Спасибо заранее. Ошибка : "Animation" не содержит определения "SetFloat", и не удалось найти доступный метод расширения "SetFloat", принимающий тип "Animation" в качестве первого аргумента (возможно, пропущена директива using или ссылка на сборку).
Приветствую) На сколько я могу судить из описания, то Вы ошиблись в начале кода, когда создавали ссылку на Animator. Вместо: public Animator anim; Вы, скорей всего, написали: public Animation anim; Animation отвечает за саму анимацию (раскадровку, ключевые кадры и пр.) А Animator - за воспроизведение и переключение анимаций (вот он нам нужен) Вам Animation, скорей всего Visual Studio авто-подстановкой предложила и Вы не то выбрали - должен быть Animator. Перепроверьте, возможно, я ошибаюсь в своих предположениях...
@@NoobGameDev Здравствуйте ещё раз. Спасибо вам огромное, извините что потревожил. Я просто учусь этому искусству и старался писать код в большей мере самостоятельно ( перед анимацией персонажа я делал анимацию монеток в игре , где использовал Animation. Потому наверное, когда я смотрел видео, не обратил внимание на ваши строчки с Animator).
Добрый вечер, это опять я. Наверное придётся теперь писать под каждым видео, хах. В общем, где искать иконку Animator? Добавить я её не могу, как Animation.
:)) Всё ок) Если её нигде не видно, то можно её включить через вкладку Window (Там где File? Edit, Assets...) И найти там Animator, у Вас сразу откроется и подсветится данная вкладка. Сразу тоже самое можете сделать и с вкладкой Animation.
Скорей всего, проблема в типе переменной. Возможно, что она у Вас целочисленная (int), в таком случае в неё можно записать только целое число... Для вещественных значений нужна переменная типа float. Могу ошибаться, но можете удалить int-овую переменную (в переходах появится ошибка), а потом создать float переменную с таким же именем(!) и тогда в переходах она должна автоматически подставиться на место удалённой (ошибки исчезнут).
Очень мало информации... Есть ли какие-то ошибки в консоли (красные сообщения в левом нижнем углу Unity)? Что происходит в Аниматоре (например, воспроизводится только анимация покоя, при этом переменная "moveX" всегда равна нулю)? Ну, или хотя бы что-нибудь за что можно зацепиться) Просто довольно часто такое можно услышать на очень базовых видео, потому что некоторым вещам не придаётся должного значения. Например, имя переменной в Аниматоре и имя данной переменной в коде должны полностью совпадать. Регистр имеет значение. Т.е. "movex" и "moveX" - это 2 разные переменные...
@@prosto_chel544 Не уверен, что понял 😅 Если код без ошибок, то остаётся Аниматор, а именно наличие и имена переменных (я говорил за регистр), а так же настройки переходов (обратить внимание на Has Exit Time). Если там ничего не найдёшь, то советую вступить к нам в Дискорд (ссылка есть в шапке). Там можно и скрины выложить, и видео снять, чтобы понятнее было, в специально выделенном канале спросить, и либо я, либо кто-то из ребят постараемся помочь)
Спасибо вам большое! Вы мне очень помогли. Я новичок в создании игр, и я никогда не видела таких подробных туториалов! Спасибо! :D
Как подробно автор рассказал! Самому бы разбираться намного дольше пришлось бы. Спасибо.
:))) Мерси)
Нашел того человека, который в несколько видео объяснил мне все то, чему я пытался добиться на протяжении пол года.... Кто читает мой комент, можете смело подписаться и оставить лайк.
:)) Большое спасибо!)
И ещё, что касается Flip, функция та что покороче не совсем одно и то же, что и первый вариант. Так как второй вариант после ходьбы в лево, возвращает idle на стоковую позицию, смотреть в право, первый вариант работает как надо. В Вашем же случае, разницы нет так как перс в положении idle фронтальный, ну а если бы перс стоял бы боком, то короткая функция не подошла бы. На моём персе, который стоит полубоком это ощутимо)) А так функция Reflect супер решение!
Спасибо огромное! Делал по другим гайдам, ничего не работало, сделал по твоему - всё отлично работает!
Все понятно обьесняешь и все работает. Спасибо за ваш труд и удачи.
Спасибо! И вам успехов)
спасибо большое, у всех других баги или ошибки на новых версиях юнити, большая часть таких туторщиков сами непонимают как писать код а тут всё просто, быстро, понятно и если не правильно понял можно скачать исходный код из видео и посмотреть свои ошибки
Не знаю, как другие, но я уже полгода планирую перезаписать первые 3-4 видео, потому что и сам понял чего раньше не понимал и в движке кое-что поменялось - а значит надо обновлять инфу)
Спасибо тебе за урок. Приятно слушать как ты объясняешь. Был вопрос один, но пока писал комментарий сам понял )))
Бро ты волшебник , спасибо тебе очень помог , нормально обьесняешь , ты просто чудо)))
:)) Спасибо! Рад, что видео помогло)
@@NoobGameDev бро а как сделать по вертикали ? типо нужно писать:
moveVector.x = Input.GetAxisRaw("Vertical");
rb.velocity = new Vector2(moveVector.x * speed, rb.velocity.y);
anim.SetFloat("moveX", Mathf.Abs(moveVector.x));
@@THEMERUSH
И да и нет, а точнее не совсем)
Если сделать так, то по идее перс при нажатии кнопки "вверх" будет идти в право, а при нажатии "вниз" - влево)
Input.GetAxisRaw("Vertical") - грубо говоря, это с какой оси производить считывание... вниз = -1, вверх = 1, ничего = 0.
А вот чтобы изменять ускорение самого объекта персонажа, нужно изменять значение по игрику свойства "velocity".
Т.е. rb.velocity.x - это текущее ускорение по горизонтали.
rb.velocity.y - по вертикали.
Но напрямую их можно только считывать, а вот менять их можно через вектор:
rb.velocity = new Vector2();
А уже в векторе указывать направление по горизонтали и вертикали:
rb.velocity = new Vector2(X, Y);
Текущие ускорения будут записываться так:
rb.velocity = new Vector2(rb.velocity.x, rb.velocity.y);
Т.е. чтобы перемещать перса по вертикали нужно сначала считать значение с оси ввода по вертикали:
moveVector.y = Input.GetAxisRaw("Vertical");
а после изменить ускорение только по вертикали:
rb.velocity = new Vector2(rb.velocity.x, moveVector.y);
ну и можно умножить направление на какой-либо коэффициент, чтобы иметь возможность изменять скорость, типа:
rb.velocity = new Vector2(rb.velocity.x, moveVector.y * speed);
Но двигаться вниз ему будет мешать земля, а вверх гравитация. Поэтому нужно либо изменять в Инспекторе поле "Body Type" на "Kinematic", либо обнулять гравитацию.
В 11-м уроке эта тема затронута)
Спасибо. Да хоть на пол часа видео. Для новичков самое то
Спасибо вам огромное за гайды! Только благодаря вашим видео, у меня всё отлично работает
Это радует, надеюсь, что так и дальше будет) И спасибо за подписку!)
Спасибо, я столько всего пересмотрел , помог именно ты , лайк подписка автоматом!
Сейчас смотрю твои уроки и понимаю, что большую часть кодов в скрипте я знал ещё со времён информатики в школе
Так и есть)
Везёт, у кого-то действительно полезная информатика была...
Знаете что. Я подпишусь на этот канал. Ибо тут все понятно и доходчиво объясняет автор.
Спасибо большое! Буду дальше смотреть видео
Спасибо, и добро пожаловать!)
@@NoobGameDev У меня вопрос. На 4-ой минуте у тебя там компонент idle. У меня такого нету вообще, как сделать?
@@Madl_Madl Упущение данного видео... Сорри! При создании первой анимации, нужно перейти во вкладку Animation и нажать на большую (серую с белыми буквами) кнопку Create, которая будет по центру окна вкладки (вместо шкалы).
@@NoobGameDev Спасибо большое, по пробую я
Ты очень хорошо объясняешь. Знаю, что таких роликов в инете навалом, но хотелось бы увидеть тутор по стрельбе именно от тебя:3
Шедевр, особенно "дЕв", это прекрасно ( ͡◉ ͜ ʖ ͡◉)
😂 Сорри, если кому-то режет слух) Просто будем считать, что я амбасадор русификации английского в России)) И борец за свободу ударений в словах)
До этого видео не знал про рефлект))) Пойду испробую новый метод). Кстати, советую в конце видео говорить про свой дискорд. Если бы не посмотрел "обращение к подписчикам" так бы о нем и не узнал, а задумка очень хорошая!
Используй лучше вот этот код в Reflect:
if ((moveVector.x > 0 && !faceRight) || (moveVector.x < 0 && faceRight))
{
Vector3 temp = transform.localScale;
temp.x *= -1;
transform.localScale = temp;
faceRight = !faceRight;
}
Он самый стабильный - не вызывает проблем с камерой и прочим в отличии от такого варианта ещё к примеру:
transform.Rotate(0, 180, 0);
А Дискорд только 2 дня назад запустился, в следующие видео уже буду вставлять об этом инфу)
@@NoobGameDev Спасибо! все прекрасно работает)
Уроки просто супер. Спасибо за труд. Такой вопрос: как сделать, чтобы персонаж пятился назад
пропустить всё с 8:00
Простой разворот персонажа
void Flip()
{
facingRight = !facingRight;
transform.Rotate(0, 180, 0);
}
Да, спасибо! Я просто тот ещё дурень и поэтому забыл за этот вариант, когда видео делал... )) Когда буду перезаписывать первые 3-4 урока - обязательно его включу к остальным!
Спасибо большое! У меня всё получилось! Круто! :)
Спасибо за подробные уроки, они очень помогают! Я искал такое решение для разворота персонажа, чтобы вместе с ним поворачивались и его дочерние объекты, смотрел еще одно ваше видео про карабканья по стене и не мог понять как у вас разворачивается коллайдер wallChec вслед за персонажем, я у своего персонаже не мог этого добиться и вынужден был использовать два wallChec, для левой и правой стороны, что было не очень удобно, потому что когда персонаж спрыгивая со стены спиной все равно начинал на нее карабкаться ). Но теперь у меня другая проблема, камера сцены, является дочерним объектом персонажа, для того чтобы следовать за ним, и теперь при помощи этого метода разворота, она тоже разворачивается и моя сцена пропадает из вида камеры. У вас камера не двигается вслед за персонажем? Как бы вы решили эту проблему?
Уже разобрался, уже все работает )
ваще кайф, очень понятно и просто,
2-ой способ почему то не получается, хотя он мне и не нужен был😅
Очень круто объяснил! Сделал 1-вым способом и доволен.
Если интересно и есть желание попробовать, то есть ещё пару вариантов, такой:
if (!blockMoveXforJump)
{
if ((moveVector.x > 0 && !faceRight) || (moveVector.x< 0 && faceRight))
{
Vector3 temp = transform.localScale;
temp.x *= -1;
transform.localScale = temp;
faceRight = !faceRight;
}
}
и такой:
if (!blockMoveXforJump)
{
if ((moveVector.x > 0 && !faceRight) || (moveVector.x< 0 && faceRight))
{
transform.Rotate(0, 180, 0);
faceRight = !faceRight;
}
}
Привет спасибо за твои ролики. Очень помогают. Делаю свою файтинг игру в стиле битемапа. Хотел бы узнать как сделать для героя атаку, блок, комбо и способности. Если умеешь пожалуйста сними видео или ответь хотя бы. Ещё хотел бы узнать как сделать анимацию поворота слева на право и справа на лево персонажа
спасибо. Очень помогаешь освоиться в юнити
Правда эти видео уже можно считать устаревшими (есть практики получше, попонятнее, поудобнее) - нужно выкатить обновление, но всё никак не доберусь до них 😅Но когда-нибудь уж точно)
@@NoobGameDev да, я заметил некоторые проблемы. Пока только в переходах анимации, но ничего. Самое главное такие видео хотя бы задают направление. А от него уже можно двигатся
помогите пж. я добавил анимацию врагу но как мне ее в скрипт вставить, у меня враг двигается из стороны в сторону
вот такой код:
public class WalkBandit : Entity
{
public float speed = 3.5f;
private Vector3 dir;
private SpriteRenderer sprite;
public Animator anim;
private void Awake()
{
sprite = GetComponentInChildren();
}
void Start()
{
dir = transform.right;
anim = GetComponent();
}
private void Move()
{
Collider2D[] colliders = Physics2D.OverlapCircleAll(transform.position + transform.up * 0.1f + transform.right * dir.x * 0.7f, 0.1f);
if (colliders.Length > 0 ) dir *= -1f;
transform.position = Vector3.MoveTowards(transform.position, transform.position + dir, Time.deltaTime);
sprite.flipX = dir.x < 0.0f;
}
private void Update()
{
Move();
}
private void OnCollisionEnter(Collision collision)
{
if(collision.gameObject == Hero.Instance.gameObject)
{
Hero.Instance.GetDamage();
}
}
я добавил метод анимации, указал его в старте,
но куда мне вставить эту строчку
anim.SetFloat("moveX", Mathf.Abs(moveVector.x));
бля ну
и нахер я пытаюсь научится этому
если у меня все равно ничерта
не выйдет
(да я пытался сделать свое сообщение как код)
Ну, смотрите... На сколько я понял, то враг вообще стоять не умеет) Поэтому в данном конкретном примере можно было бы обойтись лишь анимацией движения (сделать её дефолтной в аниматоре).
Но если планируется добавить анимацию покоя, то я бы изменял moveX в методе Move после изменения transform.position. Но так как сейчас энеми заточен только под движение, то Вам придётся много чего переделать.
И код немного переусложнён) Так что Вы и сами в нём начинаете запутываться (например есть переменная speed, но скорость движения врага нигде не регулируется, а так же есть сомнения, что перс нанесёт урон неподвижному игроку - скорей всего, он до него дойдёт, развернётся, и пойдёт искать стену... Я не уверен, но проверьте (: ). Конечно всегда приятно видеть, как люди сами пытаются придумывать свои решения, а не слизывают под чистую, но я бы посоветовал глянуть видео у Graphical Design на эту тему: ua-cam.com/channels/Hr72IH-33mrD2h09MR3N3Q.htmlsearch?query=патруль
Для первых экспериментов с патрулём они неплохо подойдут)
@@NoobGameDev спасибо большое, я учту, а по поводу урона, я ещё не заморачивался, решил сначала с движениями разобраться а потом уже с уороном и тд. Спасибо за совет
@@NoobGameDev я занимаюсь, этим просто 3 день всего, но очень интересно, правда информацией переполнен сильно. Но затягивает невозможно просто
Привет, помоги пожалуйста! Вылазеет ошибка: Mathf и moveVector не существует, что делать?
Проверь ты правильно написал " public Animator anim; " А то у меня было, что я авто заполнением написал " public Animation anim; "
привет а где можно взять эти спрайты перса и земли? просто что бы по примеру делал
Еще один способ разворота анимации он просто удобен но в нем наверно тоже есть недостатки (я пишу ротацию но можно и скеел )
void Flip()
{
if (Input.GetAxis("Horizontal") > 0) transform.localRotation = Quaternion.Euler(0, 0, 0);
if (Input.GetAxis("Horizontal") < 0) transform.localRotation = Quaternion.Euler(0, 180, 0);
}
Да, да! Я про него забыл в видео упомянуть. Тоже очень хороший вариант! Спасибо)
Спасибо огромное!
Почему когда я добавляю анимацию, персонаж перестаёт двигаться, а анимация работает
Почему когда я ствлю знак умножить в рефлекте мне выдаёт ошибку вот код
void Reflect()
{
if ((moveVector.x > 0 && !faceRighte) || (moveVector.x < 0 && faceRighte))
{
transform.localScale *= new Vector2(-1, 1);
faceRighte = !faceRighte;
}
}
оператор"*=" не может применяться к опертандам типа "UnityEngine.Vector3" и "UnityEngine.Vector2"
Странно... А какую версию Unity используете?
Можете попробовать такой вариант:
void Reflect()
{
if ((moveVector.x > 0 && !faceRight) || (moveVector.x < 0 && faceRight))
{
Vector3 temp = transform.localScale;
temp.x *= -1;
transform.localScale = temp;
faceRight = !faceRight;
}
}
или такой:
void Reflect()
{
if ((moveVector.x > 0 && !faceRight) || (moveVector.x < 0 && faceRight))
{
transform.Rotate(0, 180, 0);
faceRight = !faceRight;
}
}
При такой реализации и с камерой проблем меньше будет. Только чтобы у Вас всё заработало нужно заменить везде в примере faceRight на faceRighte. Ну или переименовать переменную перед функцией с faceRighte на faceRight.
@@NoobGameDev Большое спасибо мне помог первый случай
@@NoobGameDev привет. У меня юнити 5.6.4.p2
Это типа уже допотопная? Такая же ошибка.
@@WallDiesel Привет) Ну, совет будет таким же) А версия, да - старенькая уже. Советую, если не свежие, то попробовать хотя бы до 2019 LTS обновиться (там уже большинство полезных штук имеется, типа поддержки тайлмапов, событийной системы ввода и пр.)
@@NoobGameDev примного благодарен. Я первый способ сразу применил - всё работает. Буду обновляться. И спасибо за ролики. Эти уроки просто нечто. Абсолютно не зная С, при наличии фантазии уже можно что-то сделать.
6:19 подскажите что за проблема, когда нажимаю на + ничего не происходит , он просто серый
Честно говоря, не сталкивался с таким (насколько я помню), но попробуйте следующее: если игра запущена, то остановите её и выделите в Иерархии объект персонажа, а уже потом попробуйте добавить переменную.
6:54 - а зачем нужно выбирать значение по модулю?
С Горизонтальной оси ввода может поступать либо отрицательное, либо положительное, либо нулевое вещественное (дробное) значение.
В Аниматоре (в условиях перехода) для вещественных переменных есть только условия "больше" либо "меньше".
Допустим, мы выбрали в условии перехода, что будем его запускать, когда значение ввода больше нуля. Тогда, если мы нажмём "вправо", то с оси ввода поступит положительное значение (допустим, единица) и сработает переход от анимации покоя к анимации ходьбы.
Но если нажать "влево", то в аниматор поступит отрицательное значение (допустим, минус единица) и как следствие, переход настроенный на положительное значение не сработает, а значит персонаж будет перемещаться влево, но будет продолжать проигрываться анимация покоя.
Поэтому мы можем передавать в Аниматор абсолютное значение, при котором любое число (и положительное и отрицательное) будет передаваться, как положительное. И как следствие переход к анимации ходьбы будет срабатывать при любом отличном от нуля значении.
Можете попробовать убрать метод Mathf.Abs и наглядно увидеть, что получится)
@@NoobGameDev понял, спасибо
Привет очень классные видео учусь по ним спасибо большое. Как вы удаляете пустой слайд в sprite edition?
у меня почемуто нет idle в анимации
не к чему стрелку проводить idle walk(walk any srtay exit entry )только эти знаения есть хелп плиз
Решил проблему?
@@feelingfealty да да спасибо
@@feelingfealty подскажите пожалуйста где можно получится гейм деву платно или бесплатно
@@iscooiscoo5045 хах, я сам только начал по видео учиться)
Зачем присваивать значения переменным rb и anim в void Start, если в инспекторе в компоненте Script это можно сделать?
А что делать если персонаж не двигается, а только стоит и меняет анимацию?
А до добавления анимации он двигался?
Если "да", то какую анимацию использовали (спрайтовую или позиционную)?
Если не спрайтовую, то нужно смотреть на иерархию персонажа (должен быть основной объект, положение которого при анимировании изменять нельзя, а вот те объекты (руки, ноги, голова), которые находятся внутри главного - можно).
Скорей всего, Вы, когда анимировали персонажа (нажимали кнопку "запись" и изменяли положение) изменили положение не того объекта.
Но чтобы сказать наверняка, мне нужно видеть скриншот Иерархии и, какие параметры изменялись при анимации (выбрать анимацию в окне Animation).
Поэтому, если есть возможность - скиньте скриншоты мне в ВК.
@@NoobGameDev, у меня та же фигня, но анимация спрайтовая. Что делать?
@@kodest8017
1. До добавления анимации он двигался (перемещался)?
2. В окне Иерархия или на Сцене выделить/выбрать персонажа, запустить игру. И обратить внимание меняется ли в блоке Transform в свойстве Position значение по X, когда Вы нажимаете клавиши движения?
@@NoobGameDev 1. Да! 2. Нет, цифры не меняются
Когда я включаю аниматор у персонажа, персонаж перестаёт двигаться, а как выключаю, сразу начинает, как решить?((((
Скорее всего у тебя в основной анимации есть изменение позиции самого игрока, а не его части
@Noob Game Dev, Спасибо за понятный урок. Некоторые любят растекаться мыслью по древу, у тебя этого не увидел)
Для тех у кого вылезает ошибка (AnimationEvent has no function name specified!)
пкм по белому штриху, в аниматоре, удалить, удалять пока полностью не избавимся от всех штрихов.
Видео с подробностями.
ua-cam.com/video/rwnqHEd174w/v-deo.html
Здравствуйте подскажите когда создаю add tab animation то не получается сделать то что показанно на уроке все пусто
Здравствуйте) Да, есть такое упущение в ролике. У Вас, скорей всего, вместо шкалы анимации (когда переходите в окно Animation) должна быть по центру серая кнопка с надписью "Create" вот для первой анимации Вам, как раз нужна она. Если я не ошибаюсь и если правильно понял Вашу проблему.
Спаибо большое
Сделал анимацию как сказали все заработало спасибо!
всё сделал как в видео, код написан так же и ошибок никаких не выдаёт, анимации сменяются правильно, значения по x меняются и в компоненте скрипт и в аниматоре, короче всё работает кроме самой ходьбы, помоги пожалуйста, 7:47 вот тут я остановился и понял что у тебя он ходит а у меня нет((
:)) Это самое распространённое выражение среди начинающих "Всё сделал один в один, а ничего не работает". Значит не один в один, значит, что-то упустили...
Если перс перемещался до анимации, то должен и после, - она на перемещение абсолютно не влияет в данном случае.
Я ведь правильно понял, что при нажатии клавиши движения анимация воспроизводится, но перемещение не происходит?
Очень похоже, что либо пропущена строка:
rb.velocity = new Vector2(moveVector.x * speed, rb.velocity.y);
Либо в Инспекторе в поле "Speed" стоит ноль, меняйте на 1,2,3,4...
Если я не угадал, то скиньте сюда код)
@@NoobGameDev using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerMove : MonoBehaviour
{
public Rigidbody2D rb;
public Animator anim;
public Vector2 moveVector;
public float speed = 2;
void Start()
{
rb = GetComponent();
anim = GetComponent();
}
void Update()
{
walk();
}
void walk()
{
moveVector.x = Input.GetAxis("Horizontal");
rb.velocity = new Vector2(moveVector.x * speed, rb.velocity.y);
anim.SetFloat("MoveX",Mathf.Abs(moveVector.x));
}
}
строка была и скорость 2f стояла, но персонаж все также не двигается, единственное что отличается в моем проекте от вашего это то что у меня анимация покоя не глаза увеличиваются а персонаж уменьшается и увеличивается (типо дышит) возможно это изза этого хотя хз, спасибо за ответ. И кстати да вы все правильно поняли, анимации работают правильно но перемещения нету
@@winter2021inmemory В окне Инспектора ещё посмотрите, какое значение в поле "Speed" и попробуйте изменить его прям значительно, например на 50, на 100. Именно в Инспекторе, а не в коде. Возможно, он у Вас движется, но очень медленно. Обратите внимание на поле Position по иксу в Инспекторе. Изменяется при движении или нет.
И ещё попробуйте изменить строку:
moveVector.x = Input.GetAxis("Horizontal");
на следующую:
moveVector.x = Input.GetAxisRaw("Horizontal");
@@NoobGameDev ех все сделал и ничего не помогло, Position по иксу изменяется но он не движется, прийдетсся создавать новый и заново идти по вашему курсу, подскажите пожалуйста где вы изучаете юнити или C#
@@winter2021inmemory Ой, эта фраза "Position по иксу изменяется но он не движется" противоречит сама себе... Изменение координат по икс это и есть перемещение вправо/влево)
Т.е. по всем признакам он у Вас перемещается))
Получается, что визуально кажется, что ничего не происходит...
Может вы с камерой уже успели что-то сделать, например, добавить на неё скрипты для слежения за персонажем? Если да, то попробуйте их отключить или удалить.
Начать заново оно то можно, но если не устранить проблему, не найти её причину, то она снова может появиться.
Если есть желание, то можете мне в ВК кинуть видео или скрины и мы ещё пободаемся с этой ситуацией, ну, или можете начать заново, пока ещё слишком далеко не ушли)
Про изучение, я напишу где-нибудь в Обсуждении или О канале, так как не первый раз уже спрашивают, ну, а вкратце - это поисковики, форумы, youtube.
Приветствую! Спасибо за видео. Простой вопрос, почему после движения влево спрайт персонажа обратно разворачивается вправо в исходное положение, в инспекторе видно что Flip оси Х при нажатии влево включается а потом выключается. использовал одну строчку кода через функцию flip.
Нужно код смотреть, скорей всего, где-то в условиях срабатывания ошибка и поэтому он не остаётся смотреть в ту сторону, в которую шёл. Так же, возможно, что если использовалась запись в Аниматоре, то Flip был записан и там, что и вызывает такое поведение...
@@NoobGameDev у меня немного другой вопрос.У меня все так как в видео вроде,но когда я хочу при беге повернуться в другую сторону,то сначала начинается анимация покоя и лишь позже анимация бега.Незнаю важно это или нет,но заметил что x имеет всего 2 значения,это 0 и 1,хотя у вас у него значений больше.
@@ВиталийИваногло-ф7в Смотрите, если у Вас moveX в Аниматоре имеет только 0 и 1, то это даже лучше (вещественные значения могут приводить в движение анимацию покоя - оно вам не нужно). Так происходит из-за использования метода GetAxisRaw вместо GetAxis.
Поэтому советую оставить всё как есть, но вот в Аниматоре попробовать немного изменить настройки переходов:
от Покоя к Ходьбе - HasExitTime (откл.), в условии moveX -> Greater (больше) -> 0
от Ходьбы к Покою - HasExitTime (откл.), в условии moveX -> Less (меньше)-> 1
Должно починиться)
@@NoobGameDev не выходит,все равно при повороте на секунду moveX становится 0-из за чего проигрывается анимация покоя
@@NoobGameDev я пытаюсь что то поменять,но суть не в аниматоре.Суть именно в том,что почему то moveX становится 0 даже когда я не прекращаю движение.
У меня почему то вылезла ошибка, что moveVector не существует в контексте
Ошиблись в коде - пропустили объявление переменной, а именно вот эту строку:
public Vector2 moveVector;
Добрый день проблема написал все прям как в видео все ошибки убрал но перс не ходит а только анимация в правый бок и все .. Помогите пожалуйста
Здравствуйте! Проблема ещё актуальна? Если да, то скажите: вы код переписывали или копировали из описания? Если переписывали, то скиньте код - посмотрю. Так же проблема может быть связана с FlipX... Возможно, пробовали и забыли убрать при записи анимации.
@@NoobGameDev на данный момент такая проблема, переписывал код, персонаж не двигается, но анимация есть :(
Спасибооо
у меня почему-то анимация проигрывалась с большой задержкой а оказалось что у меня была галочка на has Exit time
Бротан все круто но! Как сделать этот знак палочки на 9:19 ?(
:) Прямо над Enter'ом должна быть (на англ. раскладке Shift + "'эта кнопка")
P.S. если вдруг у Вас эта кнопка залипает или ещё чего, то можете скопировать и вставить: " || "
@@NoobGameDev спасибо большое )
Красавчик, очень информативно хотелось еще от тебя уч.пособий! Будут?
Главное что показываешь варианты и объясняешь ща и против 🤝
А вот фразочка (Рисовач) меня повеселила! Вот этого точно не хватает😟
Спасибо!) Будут) Куда же им деваться!? Я сейчас в геймджеме участвую до конца месяца. Так что материала много имеется, как познавательного, так и развлекательного. Джем закончится, снег выпадет и я засяду за видосы) Надеюсь))
@@NoobGameDev оке ждемс у меня 14 числа начинается обучение по Unity 4 месяца и вот твой туториал прохожу, но подставляю синего челика с Assets Unity уроки 2d платформер кстати посмотри этот ассет какая у них механика в игре очень прикольно челик дохнет и появляется ну и т.д
Ну тогда ждемс!
@@oldborodach А что за обучение? Чьи курсы?)
@@NoobGameDev Eccentric Games тап паренёк Илья очень интересные вещи показывает купил еще месяц или более назад за 40т.р
Я как бы на сайте и Unity прохожу и у Вас тут на Тюбе, но захотел как говорится структурированные уроки от и до.
Я как бы после его курса (4 месяца) пойду далее учится и учится с кем пока не знаю ,но мысли есть.
У него на Тюбе есть канал зайди глянь !
@@oldborodach Я знаю этот канал) Там и правда парень довольно умный и говорят курсы неплохие. Правда я прям буквально на днях узнал, что у него курсы есть...
простите у меня проблема, там где void walk значение ads пишет якобы «Mathf не содержит определения для ads” что делать?(
Всё нормально - опечатались: не "ads", а "Abs" (не "d", а "b" и с большой буквы). Если всё настроено правильно, то при вводе начала метода, VS должна предлагать Вам варианты команд (это очень помогает делать меньше ошибок), поэтому если Вам при вводе имён методов не предлагают вариантов и/или если нет подсветки кода, то ещё советую посмотреть это видео: ua-cam.com/video/w8J-srV9uzw/v-deo.html
Я правильно понимаю, что в строчке:
if ((moveVector.x > 0 && !faceRight) || (moveVector.x < 0 && faceRight))
имеется ввиду, что за переменной(если я так понял) "moveVector" считается движение всего персонажа с прилегающими к нему вещами типа анимации и привязанных спрайтов, а условие "&& faceRight" это сторона, в которую смотрит спрайт переменной moveVector?
UPD: после этого, анимации idle и move перестали показываться в игре, хотя в просмотре сцены все работает.
UPD 2.0 : если убрать привязку камеры к персонажу, то анимация появляется в игре.
UPD 3.0 : если не вызывать "transform.localScale" при привязанной к персонажу камеры, то анимация сохраняется, но если повернуться, то сразу пропадает и не возвращается. Я думаю, если как-то заставить игнорировать камеру отзеркаливание персонажа, то все наладится, но я не знаю как это сделать
Да, да) Вы плюс/минус правильно мыслите)
Я так понимаю, что Вы просто перетащили камеру на перса? Это не самый лучший вариант, к тому же накладывает некоторые ограничения. Но она должна адекватно заработать, если изменить содержимое функции для отражения спрайтов на такое:
if ((moveVector.x > 0 && !faceRight) || (moveVector.x < 0 && faceRight))
{
Vector3 temp = transform.localScale;
temp.x *= -1;
transform.localScale = temp;
faceRight = !faceRight;
}
Или на такое (лучше первый вариант):
if ((moveVector.x > 0 && !faceRight) || (moveVector.x < 0 && faceRight))
{
transform.Rotate(0, 180, 0);
faceRight = !faceRight;
}
@@NoobGameDev я сделал первый вариант и все работает, спасибо! Только один вопрос: что такое temp и Vector3, типа для камеры отдельный вектор создается, который игнорирует отражение?
@@mukulash7865 Нет. Всё дело в том, что localScale - это масштаб и он имеет три параметра (по одному на каждую ось: X, Y, Z) и всё это хранится в переменной типа Vector3.
В Vector2 хранится только X и Y.
Но в Unity есть ограничения - нельзя умножить какой-то из параметров переменной localScale отдельно от других. Т.е. если сделать localScale.x * 2, то это вызовет ошибку.
Однако если сделать так: localScale * 3, т.е. умножить вектор (а не параметр), то всё нормально. Но в таком случае на 3 умножится и значение по X, и по Y, и по Z...
Пример на видео перемножает Vector3(localScale) на Vector2 в результате чего масштаб по оси Z обнуляется (а был равен 1). В результате чего привязанная к персонажу камера не "дотягивается" до слоев... Это можно увидеть если перевести сцену из 2D режима в 3D.
А localScale на Vector3 Unity умножать не позволяет...
Поэтому приходится делать временную переменную "temp", копировать в неё значение localScale, потом отдельно изменять значение по иксу, а потом уже присваивать localScale значение из временного вектора (temp) с уже изменённым параметром X.
Кратко говоря - это особенности движка. Которым я по неопытности не предал должного значения, когда делал видео... Поэтому, скорей всего, когда руки до этого дойдут, то обязательно перезалью или дополню первые три/четыре видео)
@@NoobGameDevпонял, спасибо
Скажи пожалуйста как сделать анимацию для атаки персонажа точнее что нужно вписать в скрипте что бы нажимаю какую то кнопку производилась анимация атаки
Вам в любом случае нужна ссылка на Animator. В моих примерах это anim.
И вы можете, либо использовать переменные в Аниматоре (в условиях переходов) и тогда изменять эти переменные примерно так (пример для float):
anim.SetFloat('имяпеременной', значение);
либо можете прерывать текущую анимацию и запускать какую вам нужно:
anim.Play("имяанимации");
Только следите за регистром букв, потому что "moveX" и "movex" будут считаться разными переменными (то же самое и с именами анимаций)
Здраствуйте, у меня персонаж не поворачивается влево когда я иду влево, что мне делать? ПОМОГИТЕ ПОЖАЛУЙСТА!
я сам уже исправил видео топ спасибо продолжай
@@miraclebloom2744 МолодцОм!) 👍
Шедевр
спасибо что лайкнул
ты мне очень помог
что делать если ты написал код но заходя в игру пишет ошибку и не заходит в игру
Что значит "заходя в игру"? Когда запускаете проект из UnityHub, или когда нажимаете кнопку "Play" в Unity. Если второе, то, скорей всего, в коде пунктуационная ошибка (пропустили ";" опечатались и пр.), либо, создали публичное поле, в которое забыли перетащить нужный объект или компонент. Такое поведение обычно сопровождается красным текстом в консоли и в левом нижнем углу Unity. В любом случае, без текста ошибки большего сказать не могу...
@@NoobGameDev спасибо я переписал код и все работает!
Когда прописываю Reflect, scale персонажа не меняется. В инспекторе вижу, что faceRight включается и отключается правильно, но персонаж не поворачивается. Почему так может быть?
А вы случайно не пробовали вариант с Flip'ами, может быть, когда создавали анимации, то не обратили внимание и где-то оставили чек-бокс Flip включенным.
Или может у вас сразу обе ф-и работают и Flip и Reflect (должна остаться только одна).
Просто если faceRight меняется, то значит, что код работает правильно, только что-то ещё разворачивает персонажа обратно.
Я бы искал проблему в анимациях, особенно если вы делали их процедурными - нажимали кнопку записи и что-то двигали.
Я к сожалению больше по описанию сказать не могу, сорри...
@@NoobGameDev сейчас посмотрю насчет Flip, может не заметил. А еще насчет Scale спросить хотел. Не особо разбираюсь в коде, но вы написали: изменение Scale с 1 на -1, при этом, размер вашего персонажа как раз целая единица и десятые там. А у меня размер персонажа 0.6332
Может ли это как-то повлиять?
@@alterationofficial Нет, не должно, потому что каждый раз происходит умножение значения Scale по X на -1, т.е. у Вас он когда будет смотреть вправо, то по икс будет 0.6332, а когда влево, то -0.6332.
@@NoobGameDev возможно проблемы правда с анимацией были. Создал новый проект, и первым делом настроил ходьбу, прыжок и поворот, а потом уже анимации добавил - все заработало как нужно
Прошу помощи, делал все как на видео, но при движение параметр moveX остается нулем, кроме того почему отображается только целое число: 0, а не 0.0
Возможно, Вы в Аниматоре создали int переменную - попробуйте её удалить и заново создать float.
Так же в коде обратите внимание, что метод у аниматора должен быть SetFloat для float переменных и SetInteger для переменных типа int.
@@NoobGameDev А у меня и тот и тот метод не работает
вопрос: что делать если анимация идёт только в блоке idle (даже когда я двигаюсь)
красных ошибок нет, moveX на 0.
А может есть жёлтые предупреждения? Обратите внимание, на имена и типа переменных в Аниматоре. Если Вы из кода меняете float переменную (anim.SetFloat("moveX", 2f)), а в Аниматоре она у Вас int, то работать не будет. Так же важно, чтобы совпадали регистры букв, т.е. если в Аниматоре переменная имеет имя "moveX", а в коде Вы меняете "movex", то тоже работать не будет.
@@NoobGameDev Спасибо за ответ, всё работает отлично, благодарю за такой хороший ролик!
Помоги пожалуйста, первый раз как я сделал анимацию она полностью работала, я вышел из юнити и сохранил все. Потом я захожу и у меня ничего не сохранилось и пишет "the animator controller (player) you have used is not valid. animations will not play". Что делать?
Похоже, что не выбран (или слетел каким-то образом) контроллер Аниматора.
Попробуйте выбрать объект персонажа в Иерархии и справа, в окне Инспектора найдите блок Animator. В этом блоке в первом поле "Controller" посмотрите, что выбрано... Если там "None", то нажмите на кружок с точкой чуть правее поля, откроется окно... выберете в нём то, что там будет.
Если в открывшемся окне ничего кроме None, то вы удалили контроллер аниматора (в проводнике Unity, который выглядит, как два серых квадрата на фоне бирюзового).
Тогда можете в проводнике Unity создать новый контроллер (правой кнопкой по пустому мету -> Create -> Animator Controller) и переместить его в поле Controller блока Animator в Инспекторе.
Ну, или, если Вас запутало данное объяснение, то делайте заново с момента добавления анимации.
У меня возникла проблема - анимации проигрываются, а поворота и движения не происходит.
жиза почему то так же!
Помогите пожалуйста. У меня выдаёт ошибку: Parametr 'moveX' does not exist. UnityEngine.Animator:SetFloat(String, Single)
Помогите пожалуйста разобраться в этом.
Unity сообщает Вам, что не может найти среди переменный в Аниматоре переменную с именем "moveX".
Т.е. Вы либо ещё не создали переменную "moveX" (именно в окне Аnimator), либо неправильно указали её имя (обратите внимание на регистр букв в имени переменной, т.к. "moveX", "MoveX", "MOVEx" - это три разных переменных)
Спасибо огромное
Привет вот вопрос как пофиксить чтобы в анимации walk синяя линия не останавливалась в конце, а начинала с начала идти. Поросто она у меня до конца доходит и все.
Привет) Если я правильно понял, то нужно включить для анимации зацикливание.
Для этого в Аниматоре дважды нужно щёлкнуть по нужному блоку анимации (по walk) и после этого в Инспекторе (обычно справа) появится поле (а точнее чек-бокс) "Loop" - нужно в нём поставить галочку.
Только недавно начал изучать Unity, и возник такой вопрос вот есть у меня анимация покоя, анимация бега и анимация прыжка, всё делал по вашим урокам. Но как быть если рисовачь нормально прокачен, а в юнити нуб? Дело в том, что мне надо сделать переходные анимации моему герою. Например анимация от бега до покоя, скажем между ними анимация остановки героя или от прыжка, до покоя и бега и между ними анимация приземления после того как проверилась земля? Разными способами пробовал но постоянно отрабатывает всё очень некорректно.
С мучением и методом тыка добился корректной работы моей идеи, не знаю на сколько это правильно, возможно у кого-то будет более интересное решение. От прыжка к анимации приземления я оставил настройки такие как были от прыжка и до покоя, а вот от анимации приземления до покоя и бега Has Exit time ставим галочку, Exit time=1, fixet duration ставим галочку, transition duration=0, transition ofset=0, interaption source=Current state, Order interaption ставим галочку. loop time убираем галочку. Такое можно применять от бега до покоя, например момент остановки. С такими мелочами игра будет выглядеть более богаче и насыщеннее.
Всё Вы правильно делаете (и, спасибо, что делитесь своими идеями!), я давал такие настройки, для самого базового знакомства с этими монстрами, понятно, что если добавлять переходные анимации, то всё выглядит круто, но в начале работы с Unity очень тяжело настроить такие мелочи. К тому же, как Вы понимаете, я и сам далеко не ас в Unity (из нескольких примеров делаю свой, пытаюсь разобраться как всё работает, делаю урок, чтобы поделиться и ещё глубже понять реализацию). Кстати, скоро, в 3-ем отчётном видео будет в конце пример подобной механики.
А как себя ведёт перс, когда вы приземляетесь и резко начинаете идти, при данных настройках? По идее, если не отключать управление до конца проигрывания анимации приземления, то перс уже будет перемещаться, а проигрываться будет анимация приземления... (особенно, если она довольно продолжительная)
@@NoobGameDev согласен, по хорошему нужно отключать управление, но анимация крайне не продолжительная, поэтому незаметно.
Не нашел ответа в коментариях, поэтому задам сам этот вопрос. У меня при анимации Idle персонаж смотрит вправо, анимации передвижения тоже работают коректно (в том числе и при движении справа влево все зеркалится как надо). Вот только после перемещения влево и остановки анимация переходит в Idle и персонаж снова смотрит вправо (визуально это выглядит резко и рывком). Можно ли как то в скрипте прописать условие чтобы после движения влево галочка FlipX не снималась, и персонаж оставался смотреть в ту же сторону куда перед этим двигался?
Я так понял, что Вы решили через Flip сделать и выбрали вариант записи в одну строку... Реализуйте тот вариант метода Flip, который был до 8:40 (т.е. тот который в несколько строк) - он не будет срабатывать, когда от игрока нет ввода (т.е. когда moveVector.x == 0)
@@NoobGameDev спасибо, уже попробовал но через Reflect. Все заработало как надо, действительно как и сказанно в видео проблем с ним должно встретится меньше :) Спасибо!
как сделать спрайт капец для меня это проблема помогите
найди в интернете, или нарисую в фотошопе, посмотри туторы
Я сейчас как раз готовлю видео на тему создания споайтов ( игрока, окружения ) залетай на канал
я не понимаю именно когда прописываю код флип на поворот он не чувствует управления ну типо вообще не управляется и со вторым способом в других видосах видел не понимал почему не ходит и щас тоже самое зато я понял что он не ходит изза этого кода а как исправить? прошу ответь(сори что без запятых)
Ответить то не проблема, только боюсь, что я не совсем понял, что и почему у Вас происходит...
Данные функции "Flip" и "Reflect" только лишь отражают картинку по горизонтали. За движение персонажа (влево/вправо) отвечает функция "Walk" (в моём примере). Т.е., если персонаж у Вас ходил до добавления методов отражения, то должен перемещаться и после...
Скопируйте, скиньте код всего своего скрипта в комментарии (думаю он должен быть ещё не очень большой), чтобы не гадать, чтобы прям наверняка)
чёт у меня немного поздно включает анимацию при перемещении, будто первая стоит та же, которая в положении покоя.
А какой используется метод ввода в скрипте управления персонажем?
Если Input.GetAxis("Horizontal")... и в условиях перехода между анимациями moveX > 0.1, к примеру, то такое вполне возможно, потому что при использовании данного метода вектор будет расти от 0 к 1 постепенно.
Поэтому попробуйте использовать Input.GetAxisRaw("Horizontal")... и тоже самое с вертикальной осью. Возможно, это решит проблему. Если нет, то есть вероятность, что задано слишком "большое" наложение анимаций друг на друга в настройках перехода.
Ребята кто знает что делать если анимация в юнити работает но когда она начинается персонажа тепает в другое место?
Если в одно и тоже место независимо от того, в какую сторону смотрел перс до анимации, то причина может быть в том, что при записи анимации был затронут компонент Transform - например, если случайно или специально подвинули какую-то часть тела. Чтобы такого избежать у персонажа должна быть корректная иерархия: один основной объект (без спрайтов), а дочерние (в нём/под ним) уже могут спокойно перемещаться. Потому что позиция будет считаться относительно родительского объекта, а не центра всей сцены.
Если же перс при нажатии влево-вправо, как будто бы отпрыгивает от центра, то проблема может быть в том, что некорректно настроен Pivot спрайта (синий бублик, в Sprite Editor - где спрайты нарезаются). В идеале он должен быть в центре снизу, т.е. под ногами. Так как этот бублик спрайта всегда совмещается с центром объекта. Если он будет где-то в стороне, то и спрайт будет настолько же далеко от центра объекта.
Помогите пожалуйста, персонаж стоит с бензопилой (нарисован так) и когда он поворачивается - то выглядит будто центр не там где персонаж, а там где бензопила.
Вам нужно сместить Pivot спрайта. Это, так скажем точка, которую Unity будет считать за центр изображения.
1. Выделите изображение в окне Project
2. В Инспекторе нажмите на кнопку Sprite Editor
3. Отроется редактор спрайтов (обычно им нарезают атласы на отдельные изображения). Поэтому если изображений несколько, то кликните по нужному. Если же одно, то вы должны увидеть синий бублик (скорей всего, в центре спрайта).
4. Отпозиционируйте этот кружок так как вам нужно. Обычно его ставят либо в районе живота персонажа, либо в ногах. Более точно можете выставить положение, если выберете Pivot - Custom (в небольшом меню справа внизу) и изменив X так, чтобы пивот переместился по центру перса (думаю, что в Вашем случае будет достаточно изменить только X, чтобы не переделывать перса)
5. После этого нажмите кнопку Apply в правом верхнем углу окна Sprite Renderer'а, чтобы применить изменения.
Лучше бы Вам это скриншотами показать, поэтому, если не поймёте, то посетите наш Дискорд сервер (ссылка есть в шапке канала) и задайте свой вопрос в соответствующем канале)
При написании 2 вар кода персонаж идет только направо, даже нажимаю налево все равно, исполняет лунную походку. Помоги пожалуйста!!!
Если проблема ещё актуальна, то проверьте не меняется ли Flip, т.е. не используете ли Вы оба способа сразу, в результате чего один способ мешает другому.
Здравствуйте. Можете объяснить зачем мы после transform.localScale написали "*=", а не просто ровно? Там идёт умножение на -1 и поэтому получается противоположное значение?
Всё верно) Чтобы от лишних действий избавиться, если просто присваивать, т. е. просто = , то перс всегда влево будет смотреть. Работает по такому же принципу, как и +=, и -=.
A *= B, равносильно A = A * B.
@@NoobGameDev спасибо!
у меня вкладка с анимацией не работает, все кнопки заблокированы
а всё, я тупой просто
@@nembus5009 😂Это нормально) Со всеми бывает)) 👍
Здравствуйте все прекрасно работает, но у меня появился еще 1 вопрос когда я привязываю камеру к персонажу она поворачивается вместе с ним как это пофиксить ?
Я так понимаю, что это мы с Вами в ВК общались?)
В любом случае, я отвечу, чтобы этот коммент, возможно, избавил кого-то от подобного вопроса.
Если делать простую (грубую, без сглаживаний) привязку камеры к Персонажу (сделать его дочерним, переместив в Иерархии объект "MainCamera" на объект "Character"), то необходимо изменить функцию Reflect следующим образом:
void Reflect()
{
if ((moveVector.x > 0 && !faceRight) || (moveVector.x < 0 && faceRight))
{
Vector3 theScale = transform.localScale;
theScale.x *= -1;
transform.localScale = theScale;
faceRight = !faceRight;
}
}
Если же это делать через скрипт "слежения" ("вешается" на камеру) за Персонажем, то необходимо принимать решения в зависимости от конкретного скрипта.
Привет,
У меня после команды
else if (moveVector.x < 0);
{
Sr.flipX = true;
}
Начало писать 6 ошибок:
Else не может запускать оператор
Синтаксическая ошибка, требуется (
Недопустимый термин else в выражении
Требуется )
Требуется ;
но после того как я всё это сделал зелёным (я не очень помню)
дописал код. А в итоге он не поварачивается
Ну, всё логично) Вы написали часть кода, каким-то образом исправили ошибки Студии, но это вовсе не означает, что код будет работать должным образом. Перепишите всё в точности как в видео и посмотрите какой-нибудь видеоурок по основам программирования.
Так как, например, в любом языке оператор else не может существовать без if перед ним.
Т.е. должно быть примерно так:
if (а > b)
{
// выполняемый код
}
else
{
// выполняемый код
}
На "псевдо языке" это выглядит так:
если (данное условие верно)
{
// то выполняем код здесь
}
иначе
{
// выполняем код здесь
}
@@NoobGameDev Спасибо большое)
Я написал Скрипт полностью как у вас, но всё равно выдает ошибки. Ну да ладно, всё равно спасибо, я попробую переписать :))
@@zheckacentrop :)) Попробуйте понять движок) Переводите ошибки на русский или гуглите. Обычно, если есть номер строки и номер символа (например 36; 17), то ошибка синтаксическая (т.е. допущена Вами), зачастую пишется символ, который по логике программы должен был стоять на указанном в ошибке месте.
привет я сделал всё как в видео но почему когда я нажимаю чтобы персонаж шол то анимация появляется только через сикунду помоги пж
Скорей всего анимация ходьбы воспроизводится только после полного проигрывания анимации покоя.
Думаю, проблема в переходе:
idle ➝ walk
В настройках этого перехода нужно убрать галочку с поля Has Exit Time (это выход по завершению анимации)
@@NoobGameDev спасибо тебе большое
@@NoobGameDev я за это даже подпишусь ты ряльно молодец и не забиваешь болт на таких как я которые делают ошибки спасибо)))
@@vlandarin6196 :)) Спасибо!)
@@NoobGameDev Была такая же проблема.. Спасибо огромное! Лучшие уроки, которые я когда-либо видел!
можете помочь те кто разбираются? у меня на игроке висит камера(дочерний объект) и соответственно при повороте она тоже разворачивается. как это изменить?
@@Player_MV спасибо за совет! по итогу поставила синемашин и все заработало !
а что делет метод mathf abs ?
Возвращает модуль числа, типа как |-4| = 4, другими словами отбросит знак от числа.
агаааа спасибо!!!
@@NoobGameDev
у меня на последней скобке } ругается почему?
Вопрос. На способе reflect надо было писать faceRight или facingRight? Просто Unity выдаёт ошибку.
Вы можете назвать её как угодно, главное, чтобы потом использовали это же имя. Делайте так, чтобы не было ошибок, сравните с кодом в описании.
Здравствуйте, есть проблема-все делал с нуля по вашим урокам, но почему то при ходьбе влево персонаж смотрит направо, и наоборот. Pulsar 13 что-то писал про это снизу в коментариях, но хотелось бы получить помощь от самого автора:)
Здравствуйте!) Скорей всего у Вас включен FlipX. Выберите персонажа, и в Инспекторе снимите галочку с чек-бокса FlipX. Так же нужно знать какую ф-ю вы используете, с изменением FlipX или LocalScale.x? И как у Вас нарисованы спрайты? По умолчанию они должны быть "смотрящими" вправо.
А Pulsar13 говорил за то, что при использовании ф-и с изменением FlipX, персонаж при нажатой клавише влево смотрел влево, но когда клавиша отпускалась, то перс разворачивался вправо)
@@NoobGameDev здраствуйтеcпаааасибо помогли
спасибо!
Controller 'Player 1': Transition '' in state 'walk' uses parameter 'MoveX' which does not exist in controller.
UnityEditor.EditorApplication:Internal_CallGlobalEventHandler()
так же и с айдл, помоги пожалуйста
У Вас раньше в Аниматоре была переменная "MoveX", которую Вы использовали в условии перехода от анимации "walk".
Видимо после того как Вы выбрали её в условии перехода, Вы её удалили или переименовали.
Во-первых, убедитесь, что у вас есть переменная "MoveX" в Аниматоре (так же обратите внимание на регистр букв! в уроке было использовано "moveX")
Во-вторых, проверьте переходы:
walk -> idle
idle -> walk
В них, скорей всего, в окне Инспектора в блоке Conditions будет пустое поле с надписью "Parametr dos not exist Controller", выбирайте в поле параметр "MoveX" и настраивайте в соответствии с переходом.
А, возможно, чтобы не запутаться , лучше удалить переходы
walk -> idle
idle -> walk
и создать и настроить их заново.
@@NoobGameDev щас попробую
Привет, я начинаю ходить и через 0.2сек воспроизводится анимация ходьбы (то есть задержка) подскажите как это исправить?
У старой системы ввода есть два метода: GetAxis и GetAxisRaw.
Первый возвращает вещественные числа (0.1, 0.23 и т.д.), а второй только 0 или 1/-1.
Когда Вы нажимаете кнопки A, D или стрелки "влево/вправо", то значения Горизонтальной оси ввода меняются хоть и быстро, но плавно (это в настройках при необходимости меняется).
В вашем случае достаточно будет заменить GetAxis на GetAxisRaw в строке, похожей на эту:
Input.GetAxis("Horizontal")
чтобы стало так:
Input.GetAxisRaw("Horizontal")
Здравствуйте... Такая проблема сделал всё как в видео, но значение "moveX" просто не меняется... Подскажите в чём может быть проблема?.
Здравствуйте! Проверьте наличие самой переменной в аниматоре, а так же раскладку в её имени (как в самом Аниматоре) так и при изменении её из кода, т.е. чтобы не было такого, что в имени "moveX" будет кириллическая "о", "е", или "Х". Т.е. перепишите название переменной в Аниматоре, скопируйте и вставьте туда где происходит изменение (anim.SetFloat("moveX") = ...)
Так же проверьте, чтобы и тип переменной (при её создании) и метод для изменения значения были соответствующими. Т.е. если Вы создали float (вещественную) переменную, то и изменять её нужно при помощи anim.SetFloat("moveX"), а если int (целочисленную), то anim.SetInteger("moveX")
Что если перс разучился ходить и висит в воздухе хотя риджитбади 2д и колайдер есть?
Во, та же проблема, анимация просто играет, а сам он висит в воздухе
@@Матвеёга Если до добавления анимации перс нормально падал, то это значит, что во время записи анимации вы меняли положение основного (родительского) объекта персонажа, т.е. другими словами: сами указали , чтобы объект находился на том или ином месте. Поэтому он и висит на месте)
Т.е. есть, допустим объект "Player", и если его развернуть (в Иерархии), то в нём есть, допустим "Правая рука", "Левая нога", "Голова" и пр. Так вот изменять положение рук, ног, головы при записи анимации можно, а основного объекта - Player не стоит.
Я под вашим комментом ответил на похожий вопрос. Там конечно и другие причины могут быть, но судя по тому, под каким видео возник вопрос, то вероятнее всего, проблема именно в том, что использовалась запись при анимировании, и двигался основной объект персонажа.
Нужно переделать анимацию, либо, что лучше - сделать её с нуля и следить за тем, чтобы в изменяемых параметрах не оказалось положения родительского объекта.
@@NoobGameDev спасибо большое
@@NoobGameDev хорошр, спасибо!)
В коде приведенном по ссылке, отсутствует строка:
public bool faceRight = true;
из-за чего появляется ошибка:
CS0103 Имя "faceRight" не существует в текущем контексте.
Спасибо, за бдительность, но я перепроверил и строка присутствует... Возможно, не выделилась при копировании.
@@NoobGameDev ты прав- всё там есть.
У меня при поворотах влево и вправо он сначала телепортируется на несколько шагов. С чем это связано?
глянь 1 урок по игре юнити 2д у хитмэна у него так тоже эта проблема гдето-то в середине есть, он показал как исправить
На вскидку такое может быть, из-за Pivot'ов спрайтов. Когда используется Sprite Editor (например, для нарезки спрайтов), то при выделении спрайта он обводится рамкой в которой есть синий кружок. Вот этот синий кружок - это, грубо говоря, центр рисунка. мне кажется, что он у тебя либо слева с краю, либо справа - нужно переместить его (в идеале) в ноги персонажа.
Речь вот об этом (просто, чтобы понять что это и где): ua-cam.com/video/HC24ugl5YFI/v-deo.html
UPD: Чтобы сильно не мучаться, сначала посоветовал бы изменить Pivot на Bottom (кружок станет снизу по центру)
@@NoobGameDev Я создал перса через empty, присваивая ему дочерние объекты в виде спрайтов head, hand и пр. Соответственно я начал менять Pivot на bottom center у каждого спрайта по отдельности, как иначе сделать в моем случае хз. Не помогло. Добавлю еще, что я хз как нормально прикрепить empty к его дочерним спрайтам, вначале он у меня вообще был расположен вдали от своих дочерних моделей(словно его душа покинула:D), но потом кое-как, выделив на сцене спрайты, определил на глаз и перетащил их к предполагаемой позиции empty. При выставлении идентичной позиции у empty и спрайтов получается какая-то лажа - расположение иконок оси координат все так же не совпадает. Ах да, так же я менял order in layer и все, что с этим связано. Ну это все я так к слову, может поможет как-то решению проблемы)
@@sadkotik что-то не нахожу хитмана, можешь ссылку скинуть пожалуйста?)
@@NoobGameDev В общем ситуация меняется когда я подгоняю расположение empty под расположение его дочерних спрайтов, но выглядит как-то все это костыльно, есть метод как их уверенно расположить?
UPD Разобрался. Вытащил спрайты из эмпти и ресетнул позиции у всех. Сорян за глупые вопросы)
Здравствуйте. Скажите пожалуйста в чем может быть проблема. Когда персонаж начинает идти, то анимация не сразу начинает проигрываться... То есть он начинает двигаться, а анимация ног начинается где-то через пару секунд. И потом он останавливается, а ноги еще идут, хоте перс уже остановился. Буду очень признательна, за ответ
Приветствую) В переходах от анимации покоя к анимации ходьбы и обратно нужно отключить галочку Has Exit Time...
Потому что она означает что переход между анимациями произойдёт только после того, как текущая анимация доиграется до конца.
Так же можно ещё заменить метод Input.GetAxis("Horizontal") на Input.GetAxisRaw("Horizontal"), тогда значение moveX в Аниматоре будет изменяться не плавно от 0.0 до 1.0, а резко (если влево/вправо нажаты то 1, если не нажаты то 0) и соответственно анимации будут переключаться чётче.
@@NoobGameDev Спасибо за быстрый ответ. Сейчас попробую и отпишусь
@@NoobGameDev Все убрала галку с Has Exit Time... Все получилась. Еще раз спасибо за быстрый ответ. Это правда сейчас редкость.
привет тут такая проблема что я сделал все как на видео, даже код позоимствовал) но анимация не работает, только в кампонентах у персонажа в кампоненте анимация стоит белый значок сообщение и внутри возклецательный знак и написанно что то про кревые, помоги пожайлуйста)
Здравствуйте, надеюсь ответите, как я знаю для того что бы движение персонажа работало одинаково на разных устройствах, нужно метод walk перетащить в метод FixedUpdate и при этом скорость персонажа у меня в окне Game должна была измениться(на прошлом проекте изменялась) но тут этого не произошло, так и должно быть или у меня какая-то проблема?
И правда ли что при использовании метода FixedUpdate на разных устройствах будет одинаковая скорость движение или я ошибаюсь?
Здравствуйте! Если глобально, то Вы правы.
Разница в том, что FixedUpdate вызывается фиксированное число раз (по умолчанию каждые 0.02 сек), а вот число вызовов Update зависит от мощностей компьютера, т.е. 120 fps в игре будут означать, что за секунду Update будет вызван 120 раз. При этом FixedUpdate будет вызван за секунду 50 раз не зависимо от мощностей.
Поэтому обычно делают так. Весь ввод от игрока (клавиши, мышка...) считываются в Update (чтобы ничего не пропустить), а вот всё что связано с "физикой" (расположением в пространстве, скоростями) вычисляют в FixedUpdate.
Однако от того, как написан метод тоже много зависит. Например, если метод перемещения имеющий такой вид:
rb.velocity = new Vector2(inputVector.x * speed, rb.velocity.y);
изменить на такой:
rb.velocity = new Vector2(inputVector.x * speed * Time.deltaTime, rb.velocity.y);
То он будет одинаково работать на всех машинах, так как Time.deltaTime - время, прошедшее между последним и текущим кадрами.
Чтобы точно всё работало, как задумывалось пишите считывающие ввод от игрока методы в Update (тот же Walk, Jump), а те, которые работают "самостоятельно" (например CheckGround) вызывайте в FixedUpdate.
@@NoobGameDev спасибо большое, теперь в этом я буду уверен.
Извените если отвлекаю, но появилась проблема которую я никак не могу решить, (весь код я брал у вас, и вроде бы ошибок не было) когда персонаж двигается он слегка подпрыгивает при этом ось "y" совсем немного изменяется, материал у меня в персонаже по всем параметрам выставлен на 0, графика пиксельная, сделана с помощью title map.
И ещё когда я добавил камеру с помощью cinemachine и указал объект(персонажа) за которым она должна двигаться, персонаж начал очень сильно дёргаться при движении, на форумах я вычитал что это может быть связано с рассинхроном между физикой персонажа и камерой (я так это понял), я не сделал main camera дочерним объектом как в прошлом проекте, так как при повороте персонажа всё что видела камера исчезло(скорее всего это связано с тем, что я использовал другой код для флипа персонажа)
Можно ли как-то исправить эти проблемы?
Извените за потраченное время
Почитав ваши коментарии я понял, что при использовании titleMapCollider2D возможно появление остановок придвижении (это именно у boxcollider2D) и небольшие подпрыгивания (при использовании capsule Collider2D)
@@makestudio1505 По поводу подпрыгиваний, тут мне кажется, что дело либо в самой анимации ходьбы (особенно если происходят изменения коллайдера), либо из-за стыков тайлов. Обратите внимание, если перс подпрыгивает именно на стыке, то посмотрите в сторону Composite коллайдер (он объединяет тайлы одного тайлмапа в один, тем самым убирая стыки).
А по поводу камеры и дёрганий - это бы конечно посмотреть, как именно это выглядит. Обратить внимание на трансформ - изменяются ли при этом какие-то параметры. Это может быть связано, как с отражением и флипами спрайтов, так и с настройками синемашин... Звучит очень знакомо и как будто бы было такое... Но, к сожалению, сходу не вспомню в чём проблема.
Если есть возможность, то можете присоединиться к нам в Дискорд (ссылка есть в шапке канала) - может, там у кого из ребят похожая проблема была или я вдруг вспомню с чем это связано)
@@NoobGameDev спасибо большое
Что если во время разделение спрайтов выделяется только первый?
Если в одном изображении несколько спрайтов, то очень важно изменить параметр Sprite Mode на Multiple (выделить картинку и найти поле в Инспекторе). А при разрезке поначалу можно использовать автоматический режим: выделить изображение, нажать в Инспекторе Sprite Editor и во вкладке Slice (слева сверху окна) в поле Type выбрать Automatic. В этом же выпавшем подменю нажать на Slice и Unity автоматически нарежет спрайты (если они не соприкасаются друг с другом). Он обычно может нарезать даже больше чем нужно (он может отдельную точку за спрайт посчитать), но при такой инструкции он должен нарезать спрайты нормально. После этого справа сверху нажать кнопку Apply, чтобы сохранить изменения.
После этих манипуляций, если нажать на стрелку справа на изображении которое было нарезано, то развернутся все спрайты, по отдельности.
Возможно я вас не совсем правильно понял... Поэтому, если есть желание, то можете присоединиться к нам в Дискорд: discord.gg/AHpWFBAJJr
Там со скриншотами проще будет и вам объяснить и мне)
привет, если ты ответишь то, ответь все же на вопрос пишет что: не содержит определения для
вернее
ой бро извини я заметил свою ошибку. Снимай побольше такого типа видео очень полезно
если делать анимацию через рефлект то следование за камерой не будет работать
Это если просто камеру перетащить на перса, но обычно так не делают - пишут скрипт слежения.
Здраствуйте, у меня следующая проблема. При написании строчки кода, anim.SetFloat() , выдает ошибку, что анимация не содержит в себе метод SetFloat(). В чем же проблема? Спасибо заранее.
Ошибка :
"Animation" не содержит определения "SetFloat", и не удалось найти доступный метод расширения "SetFloat", принимающий тип "Animation" в качестве первого аргумента (возможно, пропущена директива using или ссылка на сборку).
Приветствую) На сколько я могу судить из описания, то Вы ошиблись в начале кода, когда создавали ссылку на Animator.
Вместо:
public Animator anim;
Вы, скорей всего, написали:
public Animation anim;
Animation отвечает за саму анимацию (раскадровку, ключевые кадры и пр.)
А Animator - за воспроизведение и переключение анимаций (вот он нам нужен)
Вам Animation, скорей всего Visual Studio авто-подстановкой предложила и Вы не то выбрали - должен быть Animator.
Перепроверьте, возможно, я ошибаюсь в своих предположениях...
@@NoobGameDev Здравствуйте ещё раз. Спасибо вам огромное, извините что потревожил. Я просто учусь этому искусству и старался писать код в большей мере самостоятельно ( перед анимацией персонажа я делал анимацию монеток в игре , где использовал Animation. Потому наверное, когда я смотрел видео, не обратил внимание на ваши строчки с Animator).
@@NoobGameDev Спасибо вам большое, вы самый активный ютубер по юнити которого я знаю!!
@@ДаниилДаниленко-т8з Спасибо) Аж, немного стыдно выпускать в среднем одно видео в месяц (так получается...) после таких приятных слов)
Добрый вечер, это опять я. Наверное придётся теперь писать под каждым видео, хах. В общем, где искать иконку Animator? Добавить я её не могу, как Animation.
:)) Всё ок) Если её нигде не видно, то можно её включить через вкладку Window (Там где File? Edit, Assets...) И найти там Animator, у Вас сразу откроется и подсветится данная вкладка. Сразу тоже самое можете сделать и с вкладкой Animation.
что делать если в less и greater не хочет ставится 0.1?
Скорей всего, проблема в типе переменной. Возможно, что она у Вас целочисленная (int), в таком случае в неё можно записать только целое число... Для вещественных значений нужна переменная типа float. Могу ошибаться, но можете удалить int-овую переменную (в переходах появится ошибка), а потом создать float переменную с таким же именем(!) и тогда в переходах она должна автоматически подставиться на место удалённой (ошибки исчезнут).
Помогите пожалуйста где можно найти окно аниматор
после создания анимации оно само должно было появиться, а если нет тогда вверху на вкладке window просто включи его
🥰😍🤩
Комментарии под видео порой полезнее его самого
😂
у меня нету вкладки аниматор
Переходите в основную вкладку Window (вверху слева) -> Animation -> Animator
79 лайков
я:тык
80
Всем привет , сделал все как на видео , не работает анимация , помогите
Очень мало информации... Есть ли какие-то ошибки в консоли (красные сообщения в левом нижнем углу Unity)? Что происходит в Аниматоре (например, воспроизводится только анимация покоя, при этом переменная "moveX" всегда равна нулю)?
Ну, или хотя бы что-нибудь за что можно зацепиться) Просто довольно часто такое можно услышать на очень базовых видео, потому что некоторым вещам не придаётся должного значения. Например, имя переменной в Аниматоре и имя данной переменной в коде должны полностью совпадать. Регистр имеет значение. Т.е. "movex" и "moveX" - это 2 разные переменные...
@@NoobGameDev ничего такого нет , код взял из Гугл диска , все делал как на видео
@@NoobGameDev в аниматоре , когда стою run , а анимация idle когда хожу тоже run и снова анимация idle
@@prosto_chel544 Не уверен, что понял 😅
Если код без ошибок, то остаётся Аниматор, а именно наличие и имена переменных (я говорил за регистр), а так же настройки переходов (обратить внимание на Has Exit Time).
Если там ничего не найдёшь, то советую вступить к нам в Дискорд (ссылка есть в шапке). Там можно и скрины выложить, и видео снять, чтобы понятнее было, в специально выделенном канале спросить, и либо я, либо кто-то из ребят постараемся помочь)
Рил так и было , Я исправил , просто переместив поле walk из update в fixedu