Непонимаю. Ну покритиковал, культурно указал на ошибки, недочёты, показал лучшие варианты.., но обсирать людей- то зачем)? Такой вроде, как бы не глупый, а способов повысить свой рейтинг в глазах зрителей, не обсирая конкурентов, придумать не можешь. Ну выложи что-то своё и критикуй.
Как по мне Хауди красавчик! Даже если он написал говно код, его ролик стал поводом для создания этого ролика. И потом всегда будет то, кто пишет код лучше, я бы не стал на этом зацикливаться. Роман, тоже молодец, ведь полезно разобрать на примере, как можно сделать лучше. Но если бы Хауди, не записывал свои видосы, я думаю намного меньше людей стали бы интересоваться программированием.
ГАСПАРД ДА ВОТ ЖЕ ОНО! Спасибо огромное за видео. Только начал обучатся, сделал свой проект (крохотный). Очень долго изголялся над передвижением персонажа, он стопорился или и вовсе застревал при переходе на другие поверхности или при хождении по наклонных поверхностях. Пересмотрел множество гайдов но НИГДЕ нет ничего по тому, что такое нормали и как с ними работать, вот теперь моя болванка не вырывает глаза от своего дёрганого передвижения. Ещё раз спасибо. Помог на удивление чат JPT - дал название видео, но не дал ссылку...
Ужасное объяснение, вообще ничего не понятно. Не рассказал куда цеплять эти скрипты, не рассказал как их настроить. "Любой новичок поймёт что здесь сказано" - я новичок и не понял вообще как это использовать.
Отлично работает код. СУПЕР отлично. 200 настроек уровня, 400 дополнительных настроек кода, и теоретически, он будет работать. ТЕОРЕТИЧЕСКИ. Удачи споткнутся об любую поверхность с коллайдером, на которой вам не надо передвигаться.
ХаудиХо сделал видео для новичков, где всё просто и понятно. А тут куча сложных и во многом не нужных новичку манипуляций. Например, зачем новичку вычислять нормали, векторы и т.д, если можно просто написать AddForce. Это тоже самое, что говорить "Велосипед - это гавнотранспорт, есть же машина".
В целом согласен в предложенном варианте код лучше . Но подозреваю что оппонент возможно намерено сделал код через адфорс дабы продемонстрировать новичкам физику движка. п.с. Обьяснения у Хауди зашло на ура , тут же пересмотрел ролик раза 3 , прежде чем догнать суть о нормалях и скалярном произведении векторов. Хотя повторюсь предложенный Романом вариант кода лучше.
Просто Хауди хочет показать быстрый вариант решения без особых затрат времени, он не учит программировать так, как нужно, он завлекает в этот процесс, а дальше уже самому можно пойти разобраться в более качественном решении проблемы. Если честно я реально уважаю Хауди Хо, потому что он привлёк множество подростков (да и не только), к IT сфере, благодаря ему я сейчас активно изучаю Unity и пусть сейчас я и не нуждаюсь в просмотре его видео, я считаю, что он умеет интересно подать материал, пусть и самым простым и иногда плохим способом
@@epiccipe уважения хауди не достоин, но должное ему отдать можно. У него чисто попсовый развлекательный контент, а слово "профессионал" в названиях видосов не более чем шутка. Но если назвался профи, так будь добр лезь в кузов. Ладно бы это, но он ещё к тому же даёт советы в тех областях, где не шарит вовсе, а где он вообще шарит? Чисто на отьебон видос сделал и норм, а человек потом будет мучаться, штудировать от корки до корки шилдта, так и застряв на базовом уровне, дай боже чтобы не забросил, но скорее всего тупо выгорит. А так особых претензий не имею, пусть делает что хочет, лишь бы не вредил.
@@zeroQuantumNullЧел сейчас много людей становятся программистами смотря хауди потаму что он мотивирует людей он две когда просто видосы делает всё там разжёвывает потаму что знает что его в основном смотрят подростки которые тоже хотят стать прогером и за такую матевацию а не простите просто рекламу ему огромный респект
@@zeroQuantumNull Роман да лучше чем хауди в гейм деве потаму что у Романа больше 10 лет опыта и работы в гейм деве а хауди чтобы ты понимал только 7 лет занимаеться программированием и всё ещё учиться и то эти 7 лет он не задротит лишь в гейм дев
Не сторонник хауди и даже не смотрел его видео на час, но твой обзор чекнул. Придрался ко всему, к чему только можно, но при этом сам делаешь не очень: 1) Не убрал не использованные директивы 2) Присутствие магических чисел 3) Почему не сократил методы, состоящие из 1 строчки через лямбду? Глаза режет. По поводу правильности, да, этот подход к движению мне больше симпатичен, но он заставляет задуматься да и не хило. А видео было предназначено для новичков. Какой смысл новичку смотреть и думать о нормалях, когда уже есть метод AddForce? Да и по поводу твоего курса, реально везде его суешь, хотя имеешь на это полное право, но ты даже поленился объяснить про скалярное произведение векторов, а взял старое видео, красавчик. Короче, был лучшего о тебе мнения
Хм, видео называется "как правильно", а с чего ты взял что так правильно? Это верно только для случая когда ты у себя в голове сформировал ТЗ и решил для себя что физика тебе не нужна, буду просто двигать тело без учетов трения и прочих штук, опять же, возникает вопрос "А С ЧЕГО ТЫ ВЗЯЛ ЧТО ЭТО ПРАВИЛЬНО?" и почему это правильнее чем вариант с AddForce()? Просто потому что ты так видишь игру у себя в голове? Охеренный подход, я тоже могу взять тетрис, сказать что в нем не учитывается физика тел и показать как "правильно" его реализовать
либо я тупой либо скрипт имеет пару проблем: 1) кубик намертво липнет к отвесной стене(двигается вдоль неё до столкновения с другим коллайдером) 2) дергано пытается забраться на почти отвесные стены 3) проваливается под землю когда попадает под наклоненную стену
Привет А почему обновление физики не в FixedUpdate ? Если частота кадров больше, чем частота обсчёта физики, то либо будут лишние вычисления либо… рывки?
Есть такой момент, если двигать объект с rigitbody через translate, то будут просадки в производительности, так как движек будет постоянно просчитывать физику при изменении translate.
Только при просмотре этого ролика в голову закралась мысль о том, что стоит объяснить почему и для чего делаются классы, содержащие один метод. Я сейчас учусь в университете, косвенно изучаем программирование, но есть ребята, которые всерьёз хотят видеть себя в этой науке. А поскольку мои навыки куда выше навыков этих ребят, они частенько спрашивают совета у меня. Людям, которые только начинают изучать программирование очень сложно понять все концепты методик SOLID и им подобных. К примеру, была задача: разпихать данные по разным файлам, алгоритм записи в файл один, а пути к файлам разные. Я решил сделать следующее - Выставить несколько публичных методов, в которых в метод для работы с файлом передавался уже заготовленный путь константой, дабы не писать путь в мейне каждый раз через строковые литералы. (Надеюсь, хоть что-то тут было понятно) Итог - никто не понял, зачем это нужно, все говорили, что в мейне проще и быстрее, и вся программа видна на одном экране, и много чего ещё. Я это к тому, что многие новички, особенно те, которые учат программирование не на специализированных курсах с кучей практики, а на ютубе, или в университете не видят задач объёмом кода более, чем на один экран. А те, кто знает про SRP, видят его лишь как разделение большого метода на несколько маленьких, а в рамках класса или выше не смотрят. Да, я просто хочу, чтобы автор сделал ролик, который я смогу пересылать тем, кто пытается понять, зачем столько разделений вместо того, чтобы объяснять каждому отдельно. Та и, как мне кажется, многие люди, которые смотрят как на этом канале поливают говном код их любимых "сеньоров", таки поддержат аргумент "это всё для простоты, а ты вон сколько интерфейсов для одного метода нафигачил, а потом иди разбирайся с этим", если им не сказать, что, как и для чего P.S.: Сори за огромное количество воды, но рефакторить этот текст я уже не хочу(
Чёта я попробовал переписать код из видео, дабы поиграться, а он не робит у меня :) Сначала ругается на KeyboardInput в строке 16 с исключением NullReferenceException - добавляю в Movement любого рода "заглушку" Начинает ругаться на 13 строку в PhysicsMovement в строке 13 с исключением NullReferenceException. Вряд ли мой коммент заметят, но я даже предположить не могу - что я сделал не так? :)
Я тебе больше скажу, есть метод ProjectOnPlane, который как раз возвращает вектор вдоль поверхности, ему нужен вектор направления и вектор нормали поверхности
Как у новичка мозг конечно очень тяжело воспринимает это видео, сразу куча различного кода, части которого не ясны соверщенно. И сразу из каши начинать пытаться вникать. Уххх. Ну хоть основная мысль ясна xd Это видео явно не для новичков :( upd: но справедливости ради если пересмотреть по второму разу и прогуглить каждое непонятное понятие в коде, то будет всё понятно. upd2: а чо не поворачиваешь куб, чтобы он и визуально нормально двигался по поверхности?
Нашел один баг в данном решении, когда происходит столкновение со "стеной" в векторе нормали по одной из координат x или z принимает отрицательное значение, в следствии чего блокируется движении в противоположном направлении, разрешается движении только вдоль плоскости. при столкновении с наклонной поверхностью отрицательное значение сбрасывается в 0 и движение вновь доступно.
в SurfaceSlider надо поменять private void OnCollisionEnter(Collision cln){ _normal = cln.contacts[0].normal; } на private void OnCollisionStay(Collision cln){ _normal = cln.contacts[0].normal; } Этот баг происходит, когда игрок сталкивается с 2 коллизиями. Когда это происходит, то игрок считывает столкновение с последней поверхностью и "забывает" первую, то есть землю. А OnCollisionStay считывает не то, с какой поверхностью мы столкнулись, а стоим ли мы вообще. Минус - это то, что в прыжке мы теряем скорость. Надеюсь норм объяснил.
@@vld7395 да просто ничерта не понятно новичку в методе, описанном в этом видео. Невозможно такой материал объяснить начинающему, чтобы он реально понял, что он делает и как это работает.
@@OkaToka ну логично, к этому нужно идти постепенно. Это как новичку объяснять про pool в обертках, не объяснив про ссылочные типы данных )) никто ниче не поймёт :)
Есть в интернете хоть один гайд, где есть полная разработка с нуля. Т.е создание персонажа, добавление его в движок, анимация, добавление физ свойств и т.д, проработка всех мезаник как пример и затем уде создание Грэй бокса, что бы затестить усе это дело. Где такое найти..
ну Абрахам получается всех переиграл - не знал как правильно сделать, сделал неправильно, придал огласке, и нашелся таки добрый и неравнодушный человек, что объяснил как правильно. И получается бесплатный урок. Современные проблемы...
Ну так себе реализация. Почему KeyboardInput еще объект двигает, разве это его задача, с чего он вообще об этом должен знать? Почему не используется райкаст вниз, лень проверять, но OncollisionEnter выглядит ненадежно и больше как какой-то костыль.
А почему бы не использовать метод ProjectOnPlane, который как раз возвращает вектор вдоль поверхности, который принимает вектор направления и вектор нормали поверхности?
Я кстати этого вообще не понял. Вектор нормали плоскости по идее - это вектор up обьекта. Соответственно, вектор forward обьекта и будет единичным вектором скольжения по плоскости. Зачем тогда все эти расчеты? Или в юнити нет возможности получить локальные оси обьекта, как в анриле?
Помогите разобраться плз. Искомый вектор "projected forward fp" мы находим как разность двух векторов "Player Forward f" и вектора, который является проекцией вектора "Player Forward f" на вектор нормали, тобишь "component parallel to n" "Player Forward f" у нас есть (в коде forward) а вектор проекции мы находим как Vector3.Dot(forward, _normal)*_normal. Такая формула из-за того что вектора уже нормализованные, иначе пришлось бы делить скалярное произведение векторов Vector3.Dot(forward, _normal) на длинну вектора _normal еще (потому что длинна проекции равна forward * cos(угол между forward и normal)). Всё так? Когда дописал сообщение, уже потратил 2ч. на то чтобы разобраться, мб кому то поможет *facepalm*
Очень крутое видео получилось! Хотелось-бы побольше подобного контента, где показывается как не надо делать и твоё решение этой проблемы. Это реально, очень полезно!
Axis - это просто статический класс с константными строками public static class Axis { public static const string Horizontal = nameof(Horizontal); public static const string Vertical = nameof(Vertical); }
А еще если угол больше 90 градусов, то ты проваливаешься под землю) попробовал исправить это через ограничения максимального угла наклона поверхности при получении нормали при столкновении, но получил проблему что ты начинаешь проходить сквозь поверхности их-за того что используется _rb.position =\ Если будет вариант решения проблемы пните пожалуйста. Метод перемещения через нормали мне нравится в результате больше чем обычное физическое, но с такими нюансами придется думать и искать другой метод.
вы как 2 электрика, те тоже хейтят работу друг друга, ну я думаю кто постарше, имел дело с электриками, знает о чем я пишу ) А терь немного запоздалого на 2 года монолога. Хз на кой я это вообще пишу, делать нехрен. Не спорю, да, хреновый код, на тот момент, однако, если чуток посматривать за творчеством хауди, то в то время как раз он только начал изучать unity как место для разработки каких-то идей. Возможно было лишним так рано записывать урок, однако же, он так или иначе сам разобрался позднее и написал так кили иначе много годного. Взять того же 3д дино или что он там ещё делал. Ютуберы ведут свое шоу (общая масса), это их работа. Хоть ролик не про профессиональное программирование, но будем честны, даже он полезен. Есть "кодеры" куда хуже, ну да ладно. И да, вероятно этот комментарий никто даже не прочитает, но почему бы нет. ))
слыш тебе какая разница что там у хауди хо вообще даже если ты считаешь то что у него неправильно то тогда почему у него больше подписчиков и вообще не лезь к другим...
Сложно говорить что то о хауди, начинал давным давно с него, но понимаю что благодаря той простате я сам начал интересоваться программированием, и соответственно разбираться тоже сам. Поэтому вряд ли стоит так критично относится к нему, все же это не платные годовые курсы "отскиллбокса", а бесплатное видео в общедоступном формате, и если говорить о грамотности написания кода-у каждого своя колокольня, и если уж хочешь разобраться в Unity-вперед читать литературу) а видео неплохое очень даже, видно что человек в курсе своих действий, и, как говорит мой хороший друг, "умеет читать то что пишет")
В последнем примере (14:41 или в этом роде) подход неправильный же. Судя по тому, что нормаль (0.5, 0.5), угол между склоном и поверхностью 135 градусов (3 пи / 4). Соответственно, звездочка должна двигаться в том же направлении (вдоль поверхности же). Но результат этой сверх математики (итоговое направление движения (F - N)) не соответствует этому углу. Или я чего-то не понимаю? Я просто под пивом
@@rsakutin ну да, вектор нормали нормированный же должен быть, не сразу вспомнил. Не (0.5, 0.5), а (1 / sqrt(2), 1 / sqrt(2)). Тогда всё сходится Спасибо, что обратил внимание!)
@@rsakutin кстати ты кажется удаляешь комментарий число комментариев ошибочное от оригинала то есть если посчитать вообщем сколько комментариев то их больше чем на счётчике комментариев
Ради господа бога перестань читать английские слова, имитируя английское произношение. Ты мало того, что неправильно произносишь некоторые слова, так еще и жуешь их так, что вообще непонятно, что ты прочитал, видимо, чтобы никто и не услышал ошибок. Читай ты их с обычным рязанским акцентом, будет проще и тебе, и людям
@@EugeniiShernovitskiu нет, конечно, не понять. Я же не общаюсь на работе только на английском вот уже 10 лет как. Так жуют только коренные англичане, хочется сказать: выплюнь каку и разговаривай нормально!
Извиняюсь за возможно гупую просьбу, но можете мне помочь, что означает ошибка "Axis does not containt a definition for Horizontal", то же самое с вертикал. Я переписал код точь в точь, точно нет никаких ошибок в словах и эта ошибка. Прошу помочь, пожалуйста!
Там есть отдельный скрипт Axis.cs В нём пишешь: public class Axis : MonoBehaviour { public static string Horizontal = "Horizontal"; public static string Vertical = "Vertical"; }
Как вектора D(-0,75;0,25) и N(-0,25;-0,25) перпендикулярны? Если скалярное произвидение не равняется нулю? А это у нас получается истинный вектор движения игрока который поидеи должен быть паралелен плоскости и перпендикулярен нормали, но как не крути не получается, чтобы он был перпендикулярен по этой формуле.
А что если пишет ошибку "The class script cannot be found"? (p.s. раньше у меня такого не было а в инете не понятно как это исправить ведь показывают как исправить в старых версиях а мне надо в версии 2019)
Про вставку с математикой - вообще-то в школе вектором единичной длины был (1/sqrt(2);1/sqrt(2)), тк там метрика это корень из сумм квадратов (евклидовая). У тебя же метрика - сумма модулей. Ну и косинус очевидно у тебя неевликлидовым будет. В курсе было бы неплохо это разъяснить, а то челы будут каждый раз в квадраты возводить да корни извлекать
а почему нельзя силу просто применить к локальным координатам куба? На официальном сайте Unity learn перемещения делают точно также, неужели это ошибка?
ничего не понятно - замечательный код! Замечательное обьяснение... А нет - отвратительный код, ничего не понятно из обьяснений. В общем то китайский гораздо понятнее, чем все что сделал автор. В итоге, Хауди Хо сделал видео действительно для новичков, которое является и понятным, и мотивирующим. Данный же критик сделал полную тарабарщину с точки зрения новичков. О чем он говорит, что он пишет? А х-р знает. Пропускаем видео мимо.
если перемещение без физики, то можно, а если с физикой, то могут возникать проблемы при коллизиях, типа застревания в объекте или проходе через стены, по сути это не движение а телепорт в координату
Конкретно по твоему вопросу, transform.Translate меняет положение объекта не учитывая возможных столкновений с твердыми объектами, т.е. аналогично телепортации. Для определения столкновений необязательно использовать полную физическую симуляцию, можно предварительно вызывать Physics.Boxcast (или любая другая форма) или Rigidbody.SweepTest (учитывает активную модель столкновений)
Это можно сделать используя кватернионы юнити. Мне вот, к примеру, он понадобились, когда я делал ходьбу персонажа по сферической планете, и его нужно было поворачивать.
@@NickProkhorenko я знаю, что можно.. вопрос - почему здесь не сделано, но преподносится как верное решение! Получается - обосрался не только ХаудиХо но и Роман Сакутин
В примере со звездочкой расчеты странные, что это за вектор получился -0.75, 0.25 ? Вычитать не нормализованный вектор -0.25, -0.25 из нормализованного? Возможно результат операции * нормализованный вектор?
Все скрипты нужно привязывать к Player или нет? У меня ошибку выдает NullReferenceException: Object reference not set to an instance of an object KeyboardInput.Update () (at Assets/Scripts/KeyboardInput.cs:14). Вроде как переписал точь в точь, но почему то мой объект не хочет двигаться
было бы отличный идея сделать гавнокод для симулятора гавно и срать на адекватный расширения и настраивность и на конце игры рейд босс сам Роман Саукутин. ради развличению наверно )) Челлендж началось! ПС: видос норм, один лайк от меня!
То, что было в его видео, показывают не то, что он не умеет писать на c#, а то, что он впринципе в школе не учился, т.к он при взаимодействии с физическими объектами, где все работает по строгим законам и формулам, говорит давайте по-экспериментируем, и просто начинает вбивать рандомные значения, даже не понимая зачем они, и на что влияет их изменение.
А смысл? Не понятно что все нужно на игрока вешать? И Axis.cs тоже из-за двух строк показывать смысла нет. Но если все же не понял, то вот: public class Axis { public static string Horizontal = "Horizontal"; public static string Vertical = "Vertical"; } Это весь код :/