Это копия, сохраненная 4 февраля 2016 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
УРОКИ: http://unity3d.com/ru/learn >>186697 (OP) (OP)
тонуший тред >>188549 (OP)
Не проще генерировать меш где на "клеточки"-полигоны будут вешатся текстурные координаты нужных тайлов? А потом все говорят мол Юнити тормозит, понимаете ли. Спрайтиками он тайлит, вообще охуеть.
Я подозреваю, что перегенерировать меш неправильной формы при каждом действии просто заебусь. Спрайтиками для начала сойдёт, просто странно же, что не сбатчилось. А вообще да, надо оптимизировать всю эту хуйню.
Что тебе не нравится? Я все 2д игоры называю простенькими.
Это же не ААААААААА проекты. 3 года на изучение языка программирования норм. Идея у меня есть действительно годная, но спизженная у некоторых проектов. Взлетит 100%. Осталось только обуздать юнити и с#.
Неплохо.
Как-то по привычке начал юзать стандартные шарповские ивенты, но почитав доки подумал, что меседжи могут знатно облегчить мне жизнь.
Предвещаю что они работают каким-нибудь непредсказуемым образом или отрицательно влияют на производительность.
В общем отговорите меня юзать меседжи или погладьте по головке и пообещайте что всё будет ОК.
Пока ушел не далеко, так что перепиливание ивентов на меседжи, думаю, займет пару-тройку часов.
И еще я не понял можно ли посылать меседжи по своему уровню иерархии. Ибо из имеющихся методов я нашел только послать вверх и послать вниз, в обоих случаях, как я понимаю, по "соседям" сообщение не разлетается.
воопше с новым гуем запилили и новые сообщения.
http://docs.unity3d.com/ru/current/Manual/MessagingSystem.html
Они работают на рефлексии и при активном использовании будут тормозить как говно.
Можешь пояснить, правильно ли я понял. Теперь дергается инфа не каждого объекта, а только тех, которые наследуют интерфейс этот, но если таких объектов слишком много будет - производительность всё равно похерится, так?
родные эвенты/делегаты в любом случае быстрее,
но тут вместо медленного поиска нужных обьектов через рефлексию идет быстрый каст интерфейса, что делает скорость вполне себе приемлемой
Sendmessageupwards посылает сообщение на все чайлды вообще.
Там всего лишь несколько простеньких простых проектов показывают, есть что нибудь ещё?
Уроков по 2Д юнити ОЧЕНЬ мало
Если более менее шаришь в C#, то пройди этот тутор http://unity3d.com/ru/learn/tutorials/projects/2d-roguelike-tutorial
Но именно ПРОЙДИ, а не посмотри, т.е. повторяй всё тоже что делает этот чувак. Очень много полезных нуюансов для юнити-новичков.
А там, когда уже чуток разберешься начнешь сам понимать по какому нюансу искать информацию. Всеобъемлющих уроков по юнитям, особенно в 2d ты не найдешь. Я с момента выхода 4.6 ждал таких уроков, в итоге пришлось самому ковыряться.
ну там создаётся в 2,5D как я это называю, вообще я учусь на кодера и С++ 2 года учу
поясни почему? или ты тупая пидорашка
Ты мне скажи, ты всегда такой ебанутый, или у тебя сегодня неудачный день?
Где ты там 2.5Д увидел?
Там как раз чистейший 2д.
>вообще я учусь на кодера и С++ 2 года учу
Блять, если ты 2 года учишь плюсы и до сих пор задумываешься над тем чтобы писать игры на юнитях, то ты точно поехавший.
Скорее всего за эти 2 года ты ПОСМОТРЕЛ пару десятков уроков от васи с ютубов и в лучшем случае написал какой-нибудь хеловорлд.
Т.е. опыт программирования у тебя на уровне 5-8 лаб по плюсам, из которых ты самостоятельно сделал первые 2-3, а остальные скатал у одногруппника нерда, который с 1 курса ебашит кодером где-нибудь в конторке.
Пока ты не почитаешь каких-нибудь умных книжек, не научишься писать нормальный код и строить архитектуру, не выучишь матан, линал, теорвер и матстат, не вызубришь все структуры данных и алгоритмы - хуй тебе а не геймдев.
Ты сейчас начнешь писать, запилишь 2-3 фичи и дальше встанешь в ступор потому, что окажется что твоя архитектура полное говно и чтобы запилить 4ю фичу придется всё переписывать сначала.
Ты говоришь есть 3 года? Вот пойди, сделай всё выше перечисленное и найди работу в какой-нибудь конторке, чтобы там выбили из тебя эту дурь. А потом уже думай пилить тебе игры или не пилить.
Два чая этому господину >>192966
ну там реализуется немножко не то что я хочу, я хочу ПЛАТФОРМЕР, и да
матан, линал, теорвер и матстат
структуры данных и алгоритмы
я знаю.
> Пока ты не почитаешь каких-нибудь умных книжек, не научишься писать нормальный код и строить архитектуру, не выучишь матан, линал, теорвер и матстат, не вызубришь все структуры данных и алгоритмы - хуй тебе а не геймдев.
Тиречую. Даже я, гуманитарий, пошёл параллельно с изучением юнити читать книжки и смотреть уроки по C#. Не вижу смысла тупо повторять за туторами, не понимая ничего о классах и функциях.
Кто и как встраивал IAP (покупки) в Юнити?
Кто нить пользовался soomla?
Я пздц заепался, думаю попробую свой плагин пилит. Хочу зафигачить кнопку "remove ads"
>Пока ты не почитаешь каких-нибудь умных книжек, не научишься писать нормальный код и строить архитектуру, не выучишь матан, линал, теорвер и матстат, не вызубришь все структуры данных и алгоритмы - хуй тебе а не геймдев.
На самом деле есть один хитрый способ: берешь одну из игровых библиотек для с++ (SDL, SFML), смотришь туториал, как с помощью нее рисовать и обрабатывать инпут и садишься писать свой 2д движок. Если возникают проблемы — гуглишь. Ближе к середине-концу процесса обычно приходит осознание того, какое же лютое говно твой движок. Стираешь все нахуй и переписываешь с нуля. Повторять до тех пор, пока движок тебя не устроит.
Если есть голова на плечах, то это самый быстрый способ превратиться из червя-пидора в более-менее приличного разработчика. А дальше хоть юнити, хоть анрыл, хоть велосипед, все потянешь.
>не научишься писать нормальный код
Геймдев и Юнити не имеет ничего общего с нормальным кодом, особенно когда речь идёт про инди команду из 2.5 человек.
Как будто кто-то будет юзать там юнит-тестирование, всякие контейнеры зависимостей. В Юнити даже интерфейсы нормально не заюзаешь, приходиться через костыли делать. О каком "нормальном коде" и "архитектуре" ты говоришь.
Вангую, всё остальное ты там так же гипертрофировал, что средней ведроид игры глубокие знания не нужны.
мимодил
>О каком "нормальном коде" и "архитектуре" ты говоришь.
Ты меня правильно понял, но видимо плохо читал/понял Мартина.
Адекватную архитектуру можно строить в условиях любых ограничений, особенно если весь механизм ооп у тебя при этом доступен. А уж на сам код вообще никакие юнити не влияют.
42
сразу бы и сказал что платформер хочешь.
по платформерам уроков в интернерах вообще уссаться сколько.
И где хоть 1? Видел только примитивную хуйню и её подобие
Посоветуй универсальное решение на такие случаи.
void OnAnimatorMove()
{
velocity = animator.deltaPosition / Time.deltaTime;
velocity.y = rigidbody.velocity.y;
transform.rotation = Quaternion.Euler(0, camera1.GetComponent<MouseLook>().currentYRotation, 0);
rigidbody.velocity = velocity moveSpeed;
}
При любой коллизии его дико пидорасит и выскакивает ошибка screen position out of view frustum*.
Хуле я не так делаю?
Можешь ареакаст, в котором будешь проверять, есть ли что-то в той стороне, куда должно быть направлено движение персонажа. Дальше прикладываешь движущую силу только в том случае, если в области ареакаста ничего нет.
Используй только SendMessage. Если что упрощай архитектуру.
Алсо, наверняка он оптимизирован же. Внутри Monobehaviour что-то вроде словаря строка-метод. По крайней мере я бы делал как-то так.
Ой, иди-ка ты на член.
Я решил на инпут еакрутить обсервер -- в результате после каждого нажатия получал +7 мс в апдейте.
>наверняка он оптимизирован же
нет. кешируются только стандартные методы мб(старт, апдейт и т.д.).
собственно в новой системе - таки оптимизируется, создается и кешируется хендлер, его можно получить отдельно(для стандартных эвентов - под него свойства выделены) поиск идет только по первому вызову.
сендмесседж - максимально убог, его блядь в официальных доках советую не использовать.
>нет
Откуда ты знаешь что нет? Потому сделать это супер просто и я не вижу причин почему это не сделано.
>в официальных доках советую не использовать
ссылку
в новой "системе" ничего не кешируется, потому что там нечего кешировать. Это имплементация observer-паттерна черз интерфейсы. В java это очень популярный способ для событий, но в .net нахуй не надо потому что есть нативные делегаты
А что там сложного? Тупо прописываешь в апдейте постоянное смещение объекта вниз по игреку, когда изграундед !=0.
>Это имплементация observer-паттерна черз интерфейсы.
не совсем, точнее новый гуй пришел с двумя раздельными системами
обсервер с ручной подпиской через юнити эвенты(хотя зачем он, если есть стандартные эвенты и делегаты - тот исчо вопрос)
https://unity3d.com/ru/learn/tutorials/modules/intermediate/live-training-archive/events-creating-simple-messaging-system
и прямая замена SendMessage с кешем и интерфейсами
http://docs.unity3d.com/ScriptReference/EventSystems.ExecuteEvents.html
Использовать 3D-физику даже для платформера - вот универсальное решение. А ты даун.
>>193114
Ты понял? Используешь трехмерную физику и всё тут. Еще до появления 2D физики в юнити использовали трехмерную физику для флатформеров. И до сих пор это лучший вариант. Ставишь для ВСЕХ МОБОВ CharacterController и будет тебе счастье без всяких запинаний. Ты понял? Не слушай этих дебилов. Я года полтора назад сам этим себе мозги ебал. Рецепта ни у кого нет, а повернуть язык что лучше использовать 3D физику ни у одной мрази язык не повернулся.
Да что не так? Опять!
>Использовать 3D-физику даже для платформера - вот универсальное решение.
Нормальный платформер не сделаешь на box2d, потому что физика в платформерах особенная, аркадная.
2D физика аналогична трехмерной. А CharacterController проще использовать именно для АРКАДНОЙ ФИЗИКИ. Как минимум потому, что:
- имеет форму капсулы, из-за чего исключены любые невидимые спотыкания
- для него используются упрощенные коллизии
- есть Controller.move, который и позволит тебе сделать аркадную физику, какая тебе и нужна. У rigidbody тоже есть аналогичная команда (MovePosition), но её использование сопряжено с внезапно возникающими проблемами из-за незнания тонкостей этого дерьма.
И, в отличие от тех же rigidbody, он касается поверхностей почти идеально. А rigidbody для этого надо увеличивать точность вычислений в настройках физики (если у тебя масштаб спрайтов 1 к 100, например).
>с кешем и интерфейсами
это какая-то ебанутая хуита. я не вижу никаких преимуществ перед простым SendMessage, к тому-же добавляет сложности в коди и требует написание лишнего кода, что само по себе минус.
и что там кешируется? наверняка там что-то вроде
foreach (var t in this.transform)
if (t is IEvent) functor(handler, eventData);
Короче, пользуйся SendMessage
ExecuteEvents.Execute<ICustomMessageTarget>(target, null, (x,y)=>x.Message1());
в икс мы передаем ссылку на интерфейс, а в игрик параметры, и мы еще должны сами написать в функции вызов нашего метода из интерфейса! Пиздец, это вообще для людей писалось? Какой даун это придумал?
>>193256
Хуйню он сказал. Хотя вся зависит от платформера. Если это ПАЗЛ-ПЛАТФОРМЕР можно делать на чем угодно, а если это аркадный платформер типа марио, митбоя - то только своя физика
Ну а в чём проблема задать скорости, в том числе, падения, в CharacterController? Вот тебе и будет своя физика.
На Гамаке, по крайней мере, так оно и делается.
>Пиздец, это вообще для людей писалось? Какой даун это придумал?
да да, канешна. куда проще юзать SendMessage и не думать о том что она каждый раз тянет метаинфу каждого компонента, ищет по строке метод, заворачивает в делегат и только потом вызывает. или не вызывает но все равно ищет.
Да ничего он не тянет. Если бы использовалась рефлексия, фпс проседал бы уже при десятке сообщений. Ну и к тому-же, ты что, сообщения вызываешь в Update? Сообщения в принципе вызываются редко. Какая разница как они сделаны если ты вызываешь несколько сообщений за пару секунд-минут
То, что наговнокодили юнипитеки - это реальное говно с кучей оверхеда. SendMessage же красивое и изящное решение.
>хотя зачем он, если есть стандартные эвенты и делегаты - тот исчо вопрос
http://forum.unity3d.com/threads/unityevent-where-have-you-been-all-my-life.321103/
если коротко, потому что так поддерживается менюшка в редакторе. Следующая ступень ассетотаскателя - делегатотаскатель.
http://pastebin.com/2vUU9rEg
тупо порезаный стандартный прожекшен шейдер. рисует текстуру с альфой указаным цветом.
О, спасибо, вечером попробую, а то у меня на стандартном артефакты были от текстуры - кружка
Да он просто долбоеб. Не обращай внимания. Думаю, он просто путает СВОЮ ФИЗИКУ (написание физики с нуля) с тем, что я и имею ввиду - с написанием своих точных настроек, а не стандртной физики из rigidbody.
Долбоеб тут только ты. Настроишь и получишь ты только хуиту. Если тебя это устраивает - это твое дело. Но для нормального платформера физика - это 90% успеха игры, поэтому ее нужно запиливать конкретно под твои идеи, а не брать готовые ассеты.
Тебе кто-то говорил про готовые ассеты? Тебе сказали "берём Характерконтроллер и херачим в сишарп в него характеристики движения, торможения и разгона". Всё!
Долбоеб, ты, кажется, не заходил дальше ютьюбовских мануалов по созданию стрелялок. CharacterController - это не АССЕТИК КОТОРЫЙ МОЖНО ИМПОРТИРОВАТЬ ИЗ СТАНДАРТНЫХ АССЕТОВ. Хватит позориться.
1. Речь шла изначально об АРКАДНОМ геймплее, типа как в марио. Поэтому речь и зашла о CharacterController.
2. Нужно скольжение и прочая хуйня - используй Rigidbody. Только с кругом или капсулой в качестве тела, иначе будет спотыкаться к шлюха даже на полу из тайлов.
Вопрос закрываю.
Хочу перекатиться в линукс и использовать это ваше Объединение через Wine. У него там золотой статус, все должно работать. Отговорите меня, пожалуйста.
Нахуя, если скоро выйдет нативный юнити для линукса?
>Отговорите меня
Нет.
Посоны, если вешаю скрипт камера моушн блюр - то билд крашится. В эдиторе ошибок нет. Чё за хуйня вообще?
Попробуй list.add((GameObject)Instantiate(test));
Но тут добавляется его копия
Instantiate возвращает инстанс префаба в сцене потому что. Если хочешь обращаться к префабам то лучше сделай себе библиотеку префабов.
Оно работает через сериализацию. Инфа 100%. Я это где-то читал на их сайте.
Ну а как-ты по другому клонируешь объект? Это самый лучший способ
Хуйня какая, из-за dx11 шойдера крашилось.
сохранятся перед каждым запуском.
не делать бесконечных циклов.
если таки сделал - подрубиться вс/мд в дебуге и попытаться поломать цикл
если ничего не помогло - убить через диспетчер задач.
восстановить не сохраненную сцену из папочки Temp
бедняга, сидишь небось на говне мамонта каком-то. у нормальных людей повисает процесс, а не пека. и достаточно открыть диспетчер и завершить его.
ну если одноядерный проц - то будет малоотличимо от полного зависвания. но блжад одноядерный проц в 2015?
Имел ввиду контрол+альт+дел не работает, но попробую.
Есть баг, который должны были поправить. Я не говорю, что юнитеки мудаки, наоборот. Но мне нужны обновления в любом случае. Да и после переката с 4.х на 5.х на живом проекте - уже всё похуй, лол.
И да, чтобы пофиксить анимации из кода просто чек-анчек галочку мало, убрал рантайм контроллер и устанавливаю его кодом - работает.
а зачем их выпускают?
foreach(Animator childAnimator in GetComponentInChildren<Animator>())
и
return (((RaycastHit)x).distance.CompareTo((RaycastHit)y).distance);
а моно компилит без проблем.
конкретнее говори на что ругается.
Жду, когда пофиксят баг "Invalid AABB *this", представитель юнитеков сказал, что про баг в курсе, но что его вызывает точно понять не могут. У меня тоже рандомно возникает. Причём у всех возникает из-за гуя, а у меня из-за загрузки сцен, которую начали ковырять, чтобы запилить одновременное редактирование нескольких сцен. Так и живём.
Пытаюсь запилить 2д тактическую игру с движением по клеточкам(очень не рогалик). Предполагаются объекты игрового поля занимающие больше 1й клетки (как юниты, так и всякие объекты окружения).
Пробовал уже пилить несколько вариантов, и всё время напарываюсь на всякие "тонкие" места конструкции.
Проблема такая:
По логике, должен быть некий BoardManager, который будет следить за тем, какой из юнитов выбран в данный момент, какие команды ему отдавать, да и в целом управлять перемещениями по игровому полю. Очень хотелось бы иметь объект клеточки, чтобы отслеживать клики по конкретным клеткам и подсвечивать клетки доступные для перемещения/юзания скилов/других взаимодействий.
Но непонятно как реализовать структуру хранения юнитов. Если бы они занимали 1 клетку, логично было бы запилить двумерный массив, в котором хранились бы объекты клеточек, у каждой из которых есть список находящихся в ней юнитов/объектов окружения/etc. Это тоже не идеальный вариант, т.к. перемещать юнита из клетки в клетку пришлось бы с верхнего уровня иерархии(из BoardManager).
Сейчас же я вообще не знаю как это реализовывать.
Т.е. я предполагаю сделать в BoardManager двумерный массив клеточек и список юнитов, а у каждого из юнитов список ссылок на занимаемые клетки, но уже чувствую что это породит кучу гемороя.
В общем если кто понял о чем я и реализовывал нечто похожее или имеет годные идеи подскажите как организовать всю эту хуету?
>логично было бы запилить двумерный массив, в котором хранились бы объекты клеточек, у каждой из которых есть список находящихся в ней юнитов/объектов окружения/etc.
Так и делай. Юнит будет стоять на базовой одной клетке и если надо расширяться от неё в стороны.
Почему бы и нет?
Интересный вопрос. Я бы сделал так:
- Для статических объектов создал бы двухмерный массив. Если клетка занята, помечаем её 1, иначе 0. Статические объекты: горы, вода, постройки.
- Динамические же объекты свободно бы перемещались по карте. Не вижу смысла ебаться с какими-то там привязками/отвязками.
Теперь о решение задач:
Передвижение юнити из одной клетки в другую клетку: для начала используем алгоритм A, который найдёт путь на статичной карте (двухмерный массив). Путь найден. Начинаем двигать туда нашего персонажа.
Столкновение юнитов: для обработки столкновений я бы использовал steering behaviors (obstacle avoidance). Эта система работает очень быстро, так как там в основе лежит простая работа с векторами. И выглядит очень круто.
Установка построек на место, где юниты*: тут никакие особые проверки не нужны. Просто чекаем статичную карту, если есть место, ставим постройку, а юниты пускай разбегаются, тут опять же можно использовать steering behaviors.
Если карты будут большими, то можно разбить их на зоны. Каждые n-сек проходить по юнитам, чекать их позицию и далее заносить их в определённую зону. Самый простой способ, это разбить карту на четыре зоны. Но заранее не нужно этим заниматься. Преждевременная оптимизация - зло.
>пофиксил разметку
Интересный вопрос. Я бы сделал так:
- Для статических объектов создал бы двухмерный массив. Если клетка занята, помечаем её 1, иначе 0. Статические объекты: горы, вода, постройки.
- Динамические же объекты свободно бы перемещались по карте. Не вижу смысла ебаться с какими-то там привязками/отвязками.
Теперь о решение задач:
Передвижение юнити из одной клетки в другую клетку: для начала используем алгоритм A-звёздочка, который найдёт путь на статичной карте (двухмерный массив). Путь найден. Начинаем двигать туда нашего персонажа.
Столкновение юнитов: для обработки столкновений я бы использовал steering behaviors (obstacle avoidance). Эта система работает очень быстро, так как там в основе лежит простая работа с векторами. И выглядит очень круто.
Установка построек на место, где юниты: тут никакие особые проверки не нужны. Просто чекаем статичную карту, если есть место, ставим постройку, а юниты пускай разбегаются, тут опять же можно использовать steering behaviors.
Если карты будут большими, то можно разбить их на зоны. Каждые n-сек проходить по юнитам, чекать их позицию и далее заносить их в определённую зону. Самый простой способ, это разбить карту на четыре зоны. Но заранее не нужно этим заниматься. Преждевременная оптимизация - зло.
а я не параноик, я сделал бэкап, кнопку нажал и стало заебись.
>>193873
Я вот подумал, может запилить слой абстрации над трансформом? Точнее допилить методов расширения чтобы он мог пересчитывать позицию в клеточные координаты. Тогда объекты можно не запариваясь хранить как есть на сцене и не запариваться с ссылками на тайлы. Только не приложу ума как мне в таком случае определять в какую клетку тыкают. Да и опять же. Учитывая что геймобъекты клеток все-таки будут, получится что одни клетки там, другие тут. Хуйпиздаджигурда какая-то.
Или сделать какой-нибудь статический класс FieldManager, который будет доступен и из объектов-юнитов и из BoardManager без всяких пробросов и вездесущих ссылок.
Локал трансформ тебе в помощь, дебил.
невидимая плоскость под терейном. рейкаст до неё. точку соприкосновения переводишь из мировых координат в игровые
так себе мысль. пересчитать любую позицию в клеточные координаты то как нехуй сделать, у тебя же нулевые координаты есть и в мировых и клеточных координатах.
я бы на твоем месте не ебал мозги и хранил все в 2д-массивах, (поделенных на области, если хочется бесконечный мир). а элементы массива уже пусть хранят ссылки на всякую хуйню. если юнит занимает 2х2 клеточки то 4 элемента массива нужных имеют ссылку на один и тот-же объект. ну и сориентируй их там как-нибудь поудобней, чтобы если ты спросишь у юнита какие координаты он занимает то он говорит что занимает вот эту кординату, которая всегда, например, левая нижняя.
если хочется хранить много юнитов в одной клетке то лучше уж сделай временный "вот тут много юнитов" юнит, который хранит в себе список всех юнитов.
если будешь искать путь в месиве из юнитов то все равно будешь собирать ту-же самую карту, чтобы знать расположение препятствий. не будешь же ты при попытке переидти на новую клеточку каждый раз проверять не стоит ли там кто-то из вон той всей толпы?
>Очень хотелось бы иметь объект клеточки, чтобы отслеживать клики по конкретным клеткам и подсвечивать клетки доступные для перемещения/юзания скилов/других взаимодействий.
для того чтобы определять куда игрун кликает есть методы и попроще. а для подсветки просто перемещай одни и те-же клеточки по полю.
вообще, где-то у меня клевая ссылка была. http://catlikecoding.com/unity/tutorials/
пролистай про Marching Squares, наверно много чего интересного увидишь.
Предстоит подобная задача, но подсказать мало что могу, ибо ньюфаня. Пока для тестов поле боя генерил в массив ячеек, которые содержат в себе необходимые статы вроде высоты ландшафта, проходимости, ссылку на юнит или препятствие на клетке. Плюс пара методов для поиска пути, типа возможности перейти на текущую клетку.
Спасибо, но уже читал. А нет чего нить поглубже?
Нет, майнкрафт это не цель, цель это научиться делать майнкрафт. Ну то есть я хочу запелить игру со строительством как в майнкрафте.
Выкинуть юнити и делать его на чем-нибудь нормальном. Иначе не научишься вообще ничему.
Если подробнее, то это как твой скрипт на префабе, только без GameObject'а. Больше никакой разницы. Только ScriptableObject'ы неудобно создавать (нужно писать скрипт редактора для их создания).
Суть в том, что ты создаешь ассет, задаешь в нем данные в инспекторе, пишешь public MyScriptable Object obj и перетаскиваешь свой ассет в инспекторе. Ближайший пример физический материал. Точно так-же можно перетащить и префаб со скриптом, разница только в том, что при нажатии на поле со ScriptableObject в окошке выбора появятся все ассеты этого типа.
Суть в том, что тоже самое можно сделать сохранив твой скрипт с данными как префаб, и настроив все параметры. Не совсем понятно зачем нужен ещё этот уровень абстракции. Он только делает вещи сложнее без какого-то преимущества.
так и представляю как какой-то ретард сохраняет в виде префаба что-то абстрактное, вроде базы предметов, или параметров для генерации карты. вот, например, ты хочешь сохранить что-то что является информацией. ну например вот в 2д игре тебе надо сохранить паттерн атаки. вот дракон например жорит огнем и ты хочешь сказать глупой машине "если дракон жорит то первая клеточка получает 2 дамага, а вторая клеточка 1 дамаг", чтобы потом этот паттерн давать своим драконам как опцию для атаки. как ты это через префабы собрался делать?
Префабом неудобно на самом деле. Тебе как то надо будет сочетать пару префабов например, если захочешь дать паре разных монстров одинаковые паттерны атаки или вариации одного монстра с разными свойствами. Потом попробуешь и сравнить.
Забыли самое главное упомянуть. При десереализации все ссылки на один скриптбл обжект будут так же указывать на один скриптбл обжект. То есть если я напишу
MyObject obj = new MyObject();
GetComponent<FirstComponent>().obj = obj;
GetComponent<SecondComponent>().obj = obj;
то (если MyObject не есть скриптбл обжект) после сохранения и загрузки проекта получится, что в компоненте FirstComponent и SecondComponent будут ссылки на разные объекты MyObject. Это важно при расширении редактора своими фичами.
В случае с префабом сохранится ссылка на префаб
[Serializable]
public class A { public int a; }
[Serializable]
public class B : A { public int b;}
public class test : MonoBehavior
{
public A pram= new B { a = 1, b = 1 }
}
если сохранить в префаб - pram станет A, проебав относящиеся к потомкам поля
В юнити не шарю. Скилл рисования есть. И можно ли объемную анимацию с подобным качеством сделать? Т.е. совмещение с 3д и как? Базовые знания 3д есть.
подобные анимации - покадрово отрисованный ролик.
Посмотри как он сделал https://www.assetstore.unity3d.com/en/#!/content/8933
В интернете можно найти сам ассет.
Создавай каждый n-сек смещение и двигайся к нему плавно.
посмотрел часть, где показывают скрипт движения, переделал у себя (запрет прыжка в прыжке так же сделал), персонаж все так же спотыкается на наклонной поверхности. В примере есть два ската у платформы, значит, должны были решить этот вопрос.
https://unity3d.com/ru/learn/tutorials/modules/beginner/2d/2d-overview
под видео есть подробный транскрипт, в каком временном отрезке проблема решается?
А можно еще сделать эффект расфокусировки изображения? Это наверное пост-эффект для камеры нужно писать
в юнити же вроде материал должен быть без альфа-бленда чтобы тени отбрасывал как партикл.
Спасибо. Разобрался. Только с стандартным шейдером не оч:(
Сука, ну ты тупой.
Объясните пожалуйста, зачем нужне Generic? https://unity3d.com/ru/learn/tutorials/modules/intermediate/scripting/generics?playlist=17117 Не пойму в каких случаях это может понадобиться
для каких-то общих структур данных, когда типы, используемые в них не известны, или для "общих" структур данных в которых тип собственно данных не имеет особого значения для алгоритмов, из обрабатывающих
например встроенные списки
System.Collections.Generic.List<T> - афтар не знает что изначально будет в списке, но он делает "общий" класс списков а ты далее уже юзая List<int> или List<GameObject> получаешь полностью готовый список чего-угодно, без генерика пришлось бы или писать свой список для каждого типа или юзать Object с постоянными кастами туда-сюда если что такие старые списки есть в System.Collections, так как генерики появились только в C#2.0, могешь попробовать как "удобно" их использовать
или вот для примера GetComponent<T>();
возвращает компонент уже нужного типа без лишних кастов.
"приблизительная" реализация с генериком
public T GetComponent<T>() where T : MonoBehavior
{
foreach(var component in Components)
if(component is T) return component as T;
}
без генериков потребует доставать метаинфу
public MonoBegaviour GetComponent(Type T)
{
foreach(var c in Components)
if(c.GetType == T) return c;
}
и вызов соотвественно
var c1 = GetComponent<MyType>();
var c2 = GetComponent(typeof(MyType)) as MyType;
технически компилятор создаст свой класс на каждую специализацию генерика, избавив тебя от необходимости писать код под каждый вариант.
перегрузки. так как поле типа А то его сериализует как А и соответственно десериализует как А. а если А абстрактный класс то воопше получится null
скорее всего, но это было для примера
а воопше врядли. учитывая что оно учитывает исчо и наследование - то скорее всего там словарь + перебор если не найдено
Словарь ужасная оптимизация из за кэшмиссов. Правильно это хэши от типов (чтобы были value-типы) в массиве с линейным или бинарным поиском.
Вот кусок кода с движением, все вроде как в видео, только в видео герой скат преодолевает, а у меня утыкается в скат.
void Update(){
\t\tmove = Input.GetAxis ("Horizontal");
\t\tif (move GetComponent<Rigidbody2D>().velocity.x < maxSpeed)
\t\t\tGetComponent<Rigidbody2D>().AddForce (Vector2.right move MoveForce);
\t\tif (Mathf.Abs (GetComponent<Rigidbody2D>().velocity.x) > maxSpeed)
\t\t\tGetComponent<Rigidbody2D>().velocity = new Vector2 (Mathf.Sign (GetComponent<Rigidbody2D>().velocity.x) maxSpeed, GetComponent<Rigidbody2D>().velocity.y);
\t\t
У rigidbody есть ограничители позволяющие запретить вращение или движение по определенным осям. Не в курсе 2Д однако. Но тоже должно быть.
Дополнительно прилагаю скрин кода из видео
и правда, надо было запретить вращение по одной из осей, теперь получилось, спасибо
Как перестать быть дауном и начать кодировать на сишарпе?
Хоть какой-нибудь версии, а то заебало с этим черным ящиком работать.
>>194757
какая ирония. это была одна из причин из-за которой я решил написать свой навмеш.
забей, у юнити говённый навмеш который может похвастатся только тем что учитывает нормаль вокселя. если хочется просто навмеш, то лучше рейн возьми.
Ах, если бы я только не был макакой.
Спасибо бро, то что надо.
В чем разница использования между hiding способом и полиморфизмом?
Когда в наследованном классе мы пишем "public new void testClass()" в случае полиморфизма и "new public void testClass()" в случае хайдинга.?
new явно указывает переопределение метода/свойства/обьявление в потомке
для полифоризма используется virtual/override
воопше new только подавляет предупреждение, без него тоже работает но так, как случайно ошибиться и перекрыть метод довольно просто - студия ругается, мол проверь все ли у тебя правильно.
суть в том что new(без модификатора) вызывается в зависимости от того как объявлена переменная а virtual/override от того, что реально находится в переменной
public class A {
public void test1() { Debug.Log("A.test1");}
public virtual void test2() { Debug.Log("A.test2");}
public class B : A {
public new void test1() { Debug.Log("B.test1");}
public virtual void test2() { Debug.Log("B.test2");}
A a = new A();
A ba = new B();
B bb = new B();
a.test1();
a.test2();
ba.test1();
ba.test2();
bb.test1();
bb.test2();
получим
a.test1 //чистое А - все вызванное относится к А
a.test2
a.test1 // B объявлена как A соответственно вызовется базовый тест1
b.test2 // но так как тест2 виртуальный - вызовется переопределенный тест2
b.test1 // чистое В - вызовется переопределенный тест1 и тест2
b.test2
new явно указывает переопределение метода/свойства/обьявление в потомке
для полифоризма используется virtual/override
воопше new только подавляет предупреждение, без него тоже работает но так, как случайно ошибиться и перекрыть метод довольно просто - студия ругается, мол проверь все ли у тебя правильно.
суть в том что new(без модификатора) вызывается в зависимости от того как объявлена переменная а virtual/override от того, что реально находится в переменной
public class A {
public void test1() { Debug.Log("A.test1");}
public virtual void test2() { Debug.Log("A.test2");}
public class B : A {
public new void test1() { Debug.Log("B.test1");}
public virtual void test2() { Debug.Log("B.test2");}
A a = new A();
A ba = new B();
B bb = new B();
a.test1();
a.test2();
ba.test1();
ba.test2();
bb.test1();
bb.test2();
получим
a.test1 //чистое А - все вызванное относится к А
a.test2
a.test1 // B объявлена как A соответственно вызовется базовый тест1
b.test2 // но так как тест2 виртуальный - вызовется переопределенный тест2
b.test1 // чистое В - вызовется переопределенный тест1 и тест2
b.test2
Крут, а где ты такой уровень ознакомления приобрел? Т.к. примеры на офсайте не очень
воопше это довольно базовые знания шарпа. в туторах юнити правда довольно убогие уроки по шарпу, но они скорее заточены под применение его в юнити а не изучение с нуля.
мсдн
https://msdn.microsoft.com/ru-ru/library/ms173153.aspx лол, практически тот же пример что я накатал
книги - троэлсен, рихтер
Каким образом лучше реализовать смену уровней? скажем на примере платформера.
А если это совсем небольшая логическая игра по типу паззла, вроде такого http://www.chiark.greenend.org.uk/~sgtatham/puzzles/js/singles.html
Очищаешь экран и рисуешь новый уровень.
А как они могут быть по пикселям, если у тебя камера 3d? Если хочешь 1point=1px, натягивай тайл 3232, делай ortographic камеру, размер камеры выставляй по формуле высота экрана/2/пикселей_в_point. Например при 1280720 и 1point=1px, size камеры будет 320. Т.е. нужны разные разрешения - пили скрипт в пару строк, чтобы размер камеры пересчитывался при запуске. Просто же всё.
У камеры projection должен быть ortographic, а size=вертикальное_разрешение/2
Разрешение написано в левом верхнем углу при запуске - под "game"
Что за хуйня с этими массивами в шарпе? Никак не могу представить как на них составить мапу объектов, зачем столько костылей?
Чем их не устроила стандартная реализация вроде [][] = элемент, вместо этого какая то хуйнся [,] = ?!?!?!/
Ну если ты уж так вот прям хочешь 1024x768, то size должен быть 384. Pixels per unit ты определяешь в importer settings (нажми тупо на превьюшку текстуры в project)
воопше есть обе реализации
но [][] - массив массивов, при этом эти вложенные массивы могут быть разного размера, типа
int[][] a = new int[2][];
a[0] = new int[2];
a[1] = new int[3];
а [,] - обычный двумерный массив
int [,] a = new int[2,3];
который обычно проще использовать
В чем удобность? Я что не пытаюст писать, то сталкиваюсь с проблемами. Например :
for (var i = 0; i <= lvl.array.Length; i++)
{
for (var j = 0; j <= lvl.array.Length; j++)
{
if(lvl.array[i,j] == 1)
{
Debug.Log("Player init");
GameObject newPl = Player as GameObject;
Instantiate(newPl, new Vector3(j / 1.565f, i / 1.565f, 0f), Quaternion.identity);
}
}
}
Выдаст ошибку, поскольку хз как узнать Длину массива "по строкам" отдельно
зы для [][]
соответственно
for (var i = 0; i <= lvl.array.Length; i++)
for (var j = 0; j <= lvl.array.Length; j++)
блжад сьело
for (var i = 0; i <= lvl.array.Length; i++)
for (var j = 0; j <= lvl.array[ i ].Length; j++)
Спасибо. Какой же пиздец этот ваш шарп и юнити. При обилии туториалов не получается делать элементарные игры. В отличии скажем от того же хакса и гамакера, где почитал синтаксис и через день делаешь рогалики.
Может я что то не так делаю? откуда начать надо? Отдельно учить си шарп али уроки не на видосах с офа смотреть?
Если у тебя в качестве фона статическая текстура, то это самый лучший вариант с точки зрения производительности
Лучше сначала изучи C#, хотябы на быдлоуровне, а потом пройдись по туторам.
В итоге всё равно во всем самому придется разбираться(имеется в виду в юнитях).
делал игры пока ты еще был спермой, бака.
Если у тебя фон один и тот же на весь уровень, создай столько объектов, чтобы 1,5-2 экрана заполнить и перемещай их при движении камеры.
Вообще, если фон статический (один на весь уровень), то юзать объект со спрайтом единственный вариант.
Если фона N вариантов, то создай по 1 варианту каждого и когда камера приближается к позиции где должен быть этот фон-перемещай его в соответствующую позицию.
коккококок юнити более удобная разработка окококококо.
А вообще впечатлила скорость развития и поддержки различных платформ, обусловленно популярностью движка конечно, да и разработчик на которого я всегда ориентируюсь ( см Intrusor ), пересел с со старых технологий на юнити, решил последовать примеру.
Ладно, спасибо
У меня перспективная камера и разная глубина
Используй ScriptableIObject.
Пишешь класс, с полями, которые будут хранить данные. В твоем случае тупо двумерный массив. А потом пишешь загрузчик из скриптаблобджекта.
Проскролль тред повыше, я кидал ссылку на ютаб, где баба объясняет как ими пользоваться.
Делать начинаю одноэкранную стратегию. Будет по крайней мере две воюющие стороны. Как я понимаю, сначала выбираем сторону, а потом будет загружаться сцена? Отдельная (хоть и карта одна и та же) для каждого пункта меню7
нет, просто в сцене "меню" сохраняй выбор и при загрузке сцены "игры" смотри что выбрал пользователь и давай ему контроль над соответствующей стороной
Спасибо. Так и сделаю. Через пару недель допилю прототип, месяц на фичи, месяц на арт, звук и допиливание.
И возник вопрос: почему юнити определяет движение через стрелочки? Как понял за считывание ввода инфы о движении отвечает строка float moveHorizontal = Input.GetAxis("Horizontal"); по горизонтали, но нигде не написано, что это именно стрелочки (да, мануал читал, там написано просто, что значение с клавы берётся от -1 до 1, но не написано, что берётся стрелочками). сюда вообще нормально такие вопросы задавать?
project settings -> input
там создавай какие хочешь оси/"кнопки" и привязывай их к чему угодно
Девочка с пика в этой серии смотрит на тетку, читающую по слогам
Я не аутист, просто у меня БОМБИТ уже!!
http://unity3d.com/ru/get-unity/download?ref=personal
Жмакаешь ЗАГРУЗИТЬ УСТАНОВЩИК
>>195040
Мм, спасибо большое.
>Спасибо за загрузку Unity Personal Edition!
Но ничего не загружается.. Я же не настолько аутист
Может у них сервак упал?
Короче скачаю с рутрекера.
Пизданулся что ли. Весь движок доступен простым смертным. Че несешь?
Извини, я в глаза ебался, не знаю зачем написал то сообщение.
Есть новые инструменты, тайловая карта точно, и ещё много чего. Но они в альфа версии уже около года и доступны только для про версии
Наверное еще вариант - это передвигать одну из точек проверки расстояния вместе с выпадом меча, но я не представляю, как это можно сделать.
unity coroutines
Своя тайловая карта с нуля пишется за 2-3 дня. Кроме этой карты там ничего интересного в раннем доступе нету
Корутины, wayforseconds
Я бы не сидел в этом треде если бы все с нуля писал. Нет, я люблю конечно движкописательство, но отлично понимаю, что делая движок игры не сделать.
Что ты несешь. Там в первую очередь продвинутый редактор карт.
Могу только догадываться какое говно ты сделал за 2 дня
И что же "продвинутого" тебе нужно, чтобы наконец перестать ныть и начать делать игры?
> удали свой некро браузер.
Пробовал же
У них видимо тех.работы были или сервак отвалился. Сейчас пошла загрузка.
Иии... тебе насоветовали хуйни. Проверяй кадр, иначе при просадках фпс получится неиграбельная хуйня.
Вообще-то надо сделать событие анимации
Какие просадки, что ты несешь?
Много чего пишит. Риджид боди в героя добавил, если что. Я так понял, что теперь через риджид боди нельзя работать.
Долбоеб, гугли роудмап. 8 декабря завезут 5.3 версию, где будет все, что тебе нужно.
тебе же пишут прямым текстом - ригидбоди свойство устарело и не исаользуется
юзай что-то вроде
RigidBody2D rb2d;
void Start()
{rb2d = GetComponent<RigidBody2D>();}
void Update()
{rb2d.AddForce(...) }
и т.д.
вроде подходит для этих целей, может кто по-человечески объяснить его действие?
Пошел нахуй, даун
Да, именно это я и хотел узнать. Просто думал испугался страшных крестиков и не стал ничего читать, хотя подозревал. Спасибо, что ответили, сейчас ещё найду идиотских вопросов.
enemy.GetComponent<IDamageable>().TakeDamage(100);
https://unity3d.com/ru/learn/tutorials/modules/intermediate/scripting/interfaces
enemy.SendMessage(Messages.TakeDamage, new DamageInfoStruct(100, DamageType.Physical));
Хорошо что мы в гд, то бишь я уверен что ты никогда не сделаешь ни одной игры, где дамаг будет передаваться мессагами. Есть справедливость.
У меня все передается сообщениями, потому что у этого способа много преимуществ и нет недостатков.
class GameMenedger
...
void Update(){
GameObject[] objekti = FindObjectsOfType<GameObject>();
foreach(GameObject objekt in objekti){
objekt.SendMessage("Update");
}
}
У меня пекарня не сгорит, если я это запущу?
лол
Самый годный вариант из всех
Напиши вариант на Boo плиз
>КОКОКО SendMessage непроизводительно! На целую миллисекунду больше! Это недопустимо!!!
if (IsGrounded())
{
Vector3 newPosition = transform.position;
newPosition.z += animator.GetFloat("Horizontal") walkSpeed Time.deltaTime;
newPosition.x += animator.GetFloat("Vertical") walkSpeed Time.deltaTime;
transform.position = newPosition;
transform.rotation = Quaternion.Euler(0, camera1.GetComponent<MouseLook>().currentYRotation, 0);
}
>На целую миллисекунду больше! Это недопустимо!!!
Учитывая то, что у тебя их всего 16.666 и юнити вместо движка, то да.
мимо
С чего-ты это взял? Разве рендер не выполняется в отдельном треде?
Алсо, событие вызывается раз в несколько секунд/минут, поэтому у меня немного больше времени
Отбой, разобрался.
Они в разных тредах, да, но они не работают полностью асинхронно. В начале кадра рендер и апдейт стартуют одновременно и работают параллельно, а потом тот тред, что закончил раньше, ждет другого.
Я не в курсе, какая там у юнити архитектура, но обычно так.
>событие вызывается раз в несколько секунд/минут, поэтому у меня немного больше времени
Зависит от ситуации. Вдруг, например твое событие произойдет сразу несколько раз за кадр?
Ну и очевидно, что SendMessage никак не может исполняться аж целую миллисекунду, так что по сути я это просто к словам приебался.
Сам я шарю в юнити немного больше, чем в нихуя (знаний хватило только запилить эту игрулину повторяя точно телодвижения по видеоурокам) как и в си шарпе, соответственно
Помогите сделать меню (черный экран с 2 кнопками - Новая игра и Выход) и паузу (чтоб при нажатии Еск игра останавливалась и появлялось меню)
Буду очень благодарен.
1.Time.timeScale = 0.0;
2. http://docs.unity3d.com/ScriptReference/MonoBehaviour.OnApplicationPause.html
>2.
Не в тему, это функция обработчик состояния приложения. Свернул игру на пека или мобилке - функция сработала, как ты обрабатываешь paused это уже другой разговор.
Ну есть таки вполне обоснованный аргумент почему не стоит использовать SendMessage не касаясь производительности и прочей рефлксии.
Запилили новую систему месседжей, а следовательно вскоре SendMessage будет помечен как устаревший и выпилен нафик.
Я ж не шизик чтобы беспокоиться о производительности ради производительности в ущерб кода там, где никакого влияния на производительность нет
Блять, тут в каждом треде ньюфагов надо отправлять читать про EventSystem что ли?
другой анон
Если бы О ЭЛ ДЭ фаги запилили нормальную шапку с ФАКом, то количество бы сократилось.
switch(message)
case Damage:
case ...
}
Схема работы мммаксимум прозрачна, никакого оверхеда.
Зачем для каждого события заводить отдельный метод и тратить время на рефлексию?
>Зачем для каждого события заводить отдельный метод и тратить время на рефлексию?
Решишь зарелизить что-то сложнее раннера - поймешь.
http://docs.unity3d.com/ru/current/Manual/MessagingSystem.html
того шизика не слушай. и рефликсия у него быстрее интерфейсов и оверхеда нет, и сендмесседж максимум прозрачен(удачи найти случайную большую букву в невызываемом месседже или в переименовании методов) да и новой мессаджсистемы нет
Боже мой, унеси этот говнокод и не позорься
>сендмесседж максимум прозрачен
Мой вариант полностью прозрачен. Чистый C#, никакой магии. Что ты пишешь, то ты и получаешь. фукнции рассылки сообщений это максимально простые методы расширения
У интерфейсщика попа бо-бо
>Хуй поймёшь, кто это должен вызывать, зачем должен вызывать и вызывает ли вообще
Вообще-то в этом и суть сообщений в компонентной системе. Они обеспечивают прозрачную связь между компонентами без каких-либо зависимостей, что обеспечивает функционирование компонента при любой организации геймобжектов.
>>195908
И в чем разница? Плохо представляю себе ситуацию когда у компонента больше 3-5 обработчиков событий.
>Плохо представляю
Ну так бы сразу и писал, мол, "я чушок-гуманитарий, юзаю месседжи, не обоссывайте плиз", и никаких вопросов бы к тебе не было. Пытаться что-то доказать гуманитарию или артистоблядку - это тоже самое что с голубем в шахматы играть
>Пытаться что-то доказать гуманитарию или артистоблядку - это тоже самое что с голубем в шахматы играть
А вот это обидно было
Мимохудожник
Разбираюсь с анимацией 3D-моделей в юнити. Есть анимации всех костей персонажа. Не могу разобраться со смешиванием. Можно ли сделать так, чтобы основная анимация (ходьба) работала всегда, но когда надо, активировалась анимация, действующая только на часть скелета?
То есть:
- Персонаж бежит. В этот момент двигаются ВСЕ кости.
- Мы нажимем "удар". Все кости, которые не задействованы в анимации удара, продолжают выполнять анимацию "бег", а те что есть в анимации удара, проигрывают свой сценарий.
Это невозможно сделать в юнити. Перекатывайся на unreal engine 4
В таких случаях модель разрезают пополам и делают для бега две анимации (туловища и ног). Соответственно анимацию туловища можно переключать на анимацию удара когда надо.
Это безумие...
Вот такое нашел. Впринципе, мне не сложно написать замену тому же animator.setInteger. Конечно, не самые простые средства, но всё же пойдет...
https://www.youtube.com/watch?v=65ns7uikvzc
Я бы сейчас разродился очередной пламенной тирадой какие все кругом мудаки и не лечатся, но вовремя вспомнил что решил больше не нервничать по пустякам и из-за чужой глупости
Курсор скрыт и заблокирован, чтобы игрок мог нормально управлять камерой. Так вот, когда отображается какая-нибудь панелька или окно, мне нужно снова отображать курсор и блокировать ввод, но иногда не весь ввод - для небольших панелек нужно блокировать только мышку. Как это сделать?
Сейчас план такой. Добавлю специальный компонент OverlayPanel, который будет чекать OnEnable и OnDisable у панелек и окон, вызывая у статического класса GameInput что-нибудь типа LockCursor/UnlockCursor (он будет запоминать, сколько раз вызывали данные методы, а то вдруг открылось две/три панельки). А внутри скрипта камеры/игрока буду проверять специальное поле:
if (!GameInput.mouseLocked && Input.GetButton("Fire")
Fire();
>2015
>нельзя сменить директорию загрузки ассетов из стора
Эти мудаки вообще работать собираются? Пусть исходники тогда всем расшаривают, ебена мать, раз сами элементарных вещей сделать нихуя не в состоянии
Да. Это то что надо. Можно делать.
И как запустить то, что я скачал из ассет стора?
сука, дристанул
http://habrahabr.ru/company/microsoft/blog/236125/
Вот, но это для старого. Там вместо просто рджидбоди2д надо создать переменную myRigidBody = GetComponent<Rigidbody2D>(); и float horizontal = Input.GetAxis("Horizontal");
А потом ускорять через myRigidBody.velocity = new Vector2(horizontal, myRigidBody.velocity.y); например.
Ещё есть куча всяких кириллов, но они таки на старой версии юнити работаю- не всё будет правильно делаться на новых версиях. КРАЙНЕ рекомендую выучить английский на разговорном уровне и юзать либо новые гайды, либо курить документацию.
>И как запустить то, что я скачал из ассет стора?
Файл открыть сцену/открыть проект.
имя проперти, которое может не совпадать с переменной-членом класса
всплывающая подсказка
флаг, определяющий, является ли проперти конструктором (то есть проперти, которое можно задать при создании скрипта, после чего его нельзя изменить)
минимальное и максимальное значение для числовых пропертей.
Любые из параметров аттрибута можно пропустить или указать в любом порядке.
Пример кода выглядит вот так:
\t\t[SerializeField]
\t\t[FloatRangeEditor(
\t\t\tLabel = "Mass",
\t\t\tTooltip = "Mass of softbody",
\t\t\tMin = 0.1f,
\t\t\tMax = 10.0f
\t\t)]
\t\tprivate float mass = 0.1f;
\t
\t\t[SerializeField]\t
\t\t[IntegerRangeEditor(
\t\t\tLabel = "Control points",
\t\t\tTooltip = "Amount of control points",
\t\t\tConstructor = true,
\t\t\tMin = 4,
\t\t\tMax = 128
\t\t)]
\t\tprivate int numControlPoints = 4;
Инспектор скрипта с этими пропертями на пикрилейтед, скрипт Softbody2D.
Следующая фича в этом фреймворке будет механизм оповещений скрипта в дизайн-тайме об изменении значений пропертей.
имя проперти, которое может не совпадать с переменной-членом класса
всплывающая подсказка
флаг, определяющий, является ли проперти конструктором (то есть проперти, которое можно задать при создании скрипта, после чего его нельзя изменить)
минимальное и максимальное значение для числовых пропертей.
Любые из параметров аттрибута можно пропустить или указать в любом порядке.
Пример кода выглядит вот так:
\t\t[SerializeField]
\t\t[FloatRangeEditor(
\t\t\tLabel = "Mass",
\t\t\tTooltip = "Mass of softbody",
\t\t\tMin = 0.1f,
\t\t\tMax = 10.0f
\t\t)]
\t\tprivate float mass = 0.1f;
\t
\t\t[SerializeField]\t
\t\t[IntegerRangeEditor(
\t\t\tLabel = "Control points",
\t\t\tTooltip = "Amount of control points",
\t\t\tConstructor = true,
\t\t\tMin = 4,
\t\t\tMax = 128
\t\t)]
\t\tprivate int numControlPoints = 4;
Инспектор скрипта с этими пропертями на пикрилейтед, скрипт Softbody2D.
Следующая фича в этом фреймворке будет механизм оповещений скрипта в дизайн-тайме об изменении значений пропертей.
[SerializeField]
[FloatRangeEditor(
Label = "Mass",
Tooltip = "Mass of softbody",
Min = 0.1f,
Max = 10.0f
)]
private float mass = 0.1f;
[SerializeField]
[IntegerRangeEditor(
Label = "Control points",
Tooltip = "Amount of control points",
Constructor = true,
Min = 4,
Max = 128
)]
private int numControlPoints = 4;
Ну йопте, а как еще их называть? Свойства? Проперти и проперти.
>>196440
Не так поняли меня. Ангельский я худо-бедно знаю и понимаю, я о том, что глаза разбегаются, и без опыта работы с движком просто не понимаешь, что делать.
Сразу вопрос: вот делаю я всё по гайду про рогалик 2д, там во втором уроке прикручивают анимацию, урок писался на предыдущей версии, сейчас всё не так, и я ниибу, как её прикрутить, и как отдельные группы кадров назначить на разные события (ходьба, удар и пр.)
>без опыта работы с движком просто не понимаешь, что делать.
А что ты хочешь сделать? Или предлагаешь нам за тебя придумать?
А вот как заставить двигаться один объект, нажатием на другой объект, так и не понял.
Скайп, утокс, вк
он не сектор удаляет, а теги объектов
смотри https://unity3d.com/ru/learn/tutorials/projects/2d-roguelike/boardmanager?playlist=17150
Спасибо. Хм, какой тогда профит от сетки?
Просто мне нужно на поле разложить кучу объектов, как в играх типа "три в ряд". С таким же успехом можно ведь с помощью двух for наплодить префабов. Как реализовано в рогалике видел, интересно было, как подписать эти сектора еще.
профит чисто в равномерном расположении и поклеточном перемещении
Я хочу запилить простенький 2д данжн кравлер с рандомной генерацией уровней. И пока всё, что я могу наверняка - это рисовать спрайты.
Понимаю, что придется учить плюсы, и я не против, но ориентироваться в интерфейсе и элементах движка тоже не помешает.
в юнити пишут на шарпе, да, тебе придется его учить (без знания шарпа или джс ты сможешь делать только дефолт)
Может он ради быстродействия хочет вынести генерацию всей хуйни в отдельную длл на крестах?
т.е. ты считаешь, что человек не знающий с++(а соответственно и организации длл на крестах и интерфейсы между дотнетом(с немаленькой поправкой на моно) и дллками) хочет вынести логику в отдельную дллку?
https://www.youtube.com/channel/UCyVsCcTte38YC9CxJtw3hBQ
Абалденный гайдер для новичков. Всё расписано и актуально для 5.х версий.
О! Спасибо огромное. Увидел, как там создаётся система инвентаря. Многое почерпну для себя.
Ещё одно доказательство, что в геймдеве без знания английского делать нечего. Разве что говнокодить на гейм мейкере и то лишь благодаря большому ру-комьюнити.
На 5:05 парень затирает про то, что this.myAnimator.GetCurrentAnimatorStateInfo(0).IsName("Slide") чекает, играется ли анимация State и, если написать её с маленькой буквы, то ничего работать не будет. А потом пишет тоже самое для выхода из анимации и пишет не Slide, а slide, который работать не должен. Но всё наоборот и его версия со строчной s работает, а если заменить на заглавную, то нет. Что я понял не так, подскажете?
IsName("Slide") - проверяет имя, которое у него с большой
SetBool("slide", true) - меняет булевую переменную slide в аниматоре
Он же вроде проговаривает и указывает всё это
не не.
Там есть строчка
if(slide && !this.myAnimator.GetCurrentAnimatorStateInfo(0).IsName("Slide"))
А ниже он ещё приписывает
else if (!this.myAnimator.GetCurrentAnimatorStateInfo(0).IsName("slide"))
и говорит, что там будет slide=false.
На 8:22,например, показан весь этот код.
Но у меня всё норм работает и так. Ладно, спасибо, пойду разбираться.
И хуле гиф не ест? Мне в пнг каждый кадр сохранять чтоль?
И почему в редакторе спрайтов нельзя прозрачность фона сделать?
|<----------------------------------------------------------------------------->|
вооооот такие тащит
А у других что, одна и та же машина?
Сильно.
Ты наверное хотел скзать "Physics, который используется в том числе и в unity"
Есть аниматор, есть стэйты аниматора. Как через код указать стэйту нужную анимацию?
я не это имел ввиду, но надеюсь ты понял
он должен тело вверх поднимать, а он ноги ниже опускает
То есть сначала центр сместить вверх, потом разгибать?
У меня слайс не тыкается.
Можешь поэтапно описать, как правильно заливать и делать анимацию в юнити?
бамп вопросу, гданы
У меня нарезанные кадры не объединяются. Аниматор не появляется.
Всё как он делаю - залил файл, нарезал. И всё.
https://www.assetstore.unity3d.com/en/#!/content/25706
Я знаю, у тебя есть всё.
Разобрался. Но теперь меня ебет сама анимация. Вот я нарисовал, допустим, юнита, и он шатается - голова и плечи ходят влево и вправо, ноги не двигаются. А в юнити наоборот - ноги и корпус ходят в стороны, а голова с плечами закреплены на месте.
Похуй, тоже разобрался. Нарезать нормально надо было.
можно сделать чтобы 64 объекта создавалось и в инспекторе не показывалось
Так можно, но это уже пиздец. Дебри.
Ты сам не можешь создать вторую камеру и посмотреть?
inb4:setParent(myGameObject.transform.position). nyet, я хотел бы ещё у этих компонентов в скрипте изменять некоторые доступные поля.
Пилю свою имба игруху по гайдуhttps://www.youtube.com/watch?v=nH8wlww7gAs
Запилил ВСЁ точно как там. Укрип 1 в 1. Все заглавные строчные проверил. Все переменные, которые должны называться одинаково называются одинаково. Но в конце, когда у него всё работает у меня не выходит из анимации слайда. Сама анимация незалуплена, как и написано в гайде. Могу сделать так, что бы выходил из неё, но тогда можно будет двигаться, т. е. до финальной правки при добавлении в мувенмент дополнительного условия всё работает как часы. Код уже достаточно большой, не уверен, что его стоит сюда выкладывать.
В HandleMovenment третий if обнуляет переменную slide в аниматоре, а переменная slide в объекте остается такой же и в следующем кадре в аниматоре опять ставится slide=true
slide обновляется в FixUpdate в функции ResetValues(). В коде ошибок не должно быть. (но я всё, что ты написал сделал и снова отсосал).Если хоитете, я могу весь скрипт скинуть. Я понимаю, что похож на долбаёба, который не может сделать то, что ему сказали, но это не так. Вот весь проект. Сори что раньше не залил. http://rghost.ru/8Gr4jkbxT
пик забыл.
Ну сорян, чувак. Тут сидят бомжи, которые не могут в экономию на обедах.
Нет, именно что компонент. Допустим, есть один игровой объект, у него есть компонент <Light>. Mогу ли я перенести компонент <Light> первого игрового объекта на другой игровой объект с теми же настройками?
http://answers.unity3d.com/questions/12653/editor-wizard-copy-existing-components-to-another.html
То есть вот так хочешь сделать? Как я понял встроенного прямого скрипта для этого нет, надо писать свой.
>>197340
Можно задать аргумент функции траектории не через Time.deltaTime, но тогда всё равно придётся использовать какое-нибудь время или позицию другого игрока. ИМХО можешь поебаться с AddForce, но придётся в каждой точке изменения направления добавлять новую силу. Если их 2-3, то можно, иначе замучаешься.
>можешь поебаться с AddForce, но придётся в каждой точке изменения направления добавлять новую силу.
Но ведь тогда у меня каждый кадр будут создаваться новые силы, а мне нужно, чтобы просто менялся вектор направления силы. Или как раз Time.DeltatTime эту проблему решает?
A когда по твоему имеет смысл использовать AddForce?
Представим, что хочу сделать 3д игру, где игрок от первого лица стоит в комнате и в этой комнате ему надо найти всякие вещи. При этом он может вращать эти вещи, допустим, шкатулку какую, и может приближать эти вещи, допустим, чтоб найти маленькую замочную скважину в ней.
Так вот, юнити подойдёт для этих целей или лучше другую программу искать?
Дак двигать тело можно через AddForce, Torque и т.д. Я имел ввиду, что не каждый кадр к tranform.position к координатам какой нибудь эпсилон прибавлять, а может быть есть какая нибудь функция, которая двигает тело по заданной траектории, и я о ней не знаю?
Никогда еще с ними не работал. Не подскажешь, где есть хороший мануал? Или на юнити докс самый лучший будет?
Никак. Делай формулы.
http://pastebin.com/K1rXg2ji
Использование
void Start()
{ gameObject.AddComponent(go.GetComponent<KotoriiKopiruemComponent>());
}
Вот пик. Спрайт нижнего синего объекта находится не по центру ячейки, и заходит на спрайт вышестоящего объекта стены, но сам объект со стеной не соприкасается. Как это реализовать?
Спрайт вышестояшего синего объекта частично скрыт спрайтом стены, не соприкасаясь с ней. Как это реализовать?
Спрайт стены частично выходит за границы ячейки, на которой он находится, и при этом не мешает передвижению по той ячейке, на которую от частично заходит. Как это реализовать?
Ячейки - одно, картинки объектов - другое. Картинка не будет мешать передвижению на той ячейке где она стоит, инфа о проходимости будет храниться в представлении этой ячейки, а не картинки.
>Спрайт нижнего синего объекта находится не по центру ячейки, и заходит на спрайт вышестоящего объекта стены, но сам объект со стеной не соприкасается
Нихуя не понял, но если у тебя верхний спрайт перекрывает нижний то в настройках компонента спрайта есть параметр слоя отрисовки.
>Спрайт нижнего синего объекта находится не по центру ячейки, и заходит на спрайт вышестоящего объекта стены, но сам объект со стеной не соприкасается. Как это реализовать?
Я так понял это 2д. Всё просто. По оси Z делаешь положение стены дальше от камеры, а положение объекта ближе к камере. Как слои в фотошопе.
>Спрайт вышестояшего синего объекта частично скрыт спрайтом стены, не соприкасаясь с ней. Как это реализовать?
Делаешь коллайд бокс чуть меньше спрайта стены. получается, что чиний сможет зайти В спрайт стены, но остановится, когда дойдёт до колайдбокса.
>Спрайт стены частично выходит за границы ячейки, на которой он находится, и при этом не мешает передвижению по той ячейке, на которую от частично заходит. Как это реализовать?
Всё тот же колайд бокс сделать правильного размера.
Спасибо, помогло.
http://forum.cgpersia.com/f97/u3d-movement-animset-pro-1-5-character-apocalypse-pack-116401/
Да, но версия.
О господи, анон, закрыта там регистрация. Если бы я мог просто взять, зарегаться и скачать, я бы так и сделел.
Там нет ссылки на версию 1.5. Под спойлером там тупо ссылки на ассетстор.
Как вы вообще на этом говне проссаном пишете, блядь? Там, блядь, даже консоль уебанская, нахуй блядь. Пиздец.
Переходи на UE4.
Или может есть возможность в lateUpdate сбрасывать действие сил на объект?
Меняй непосредственно вектор действующей на объект силы rigidbody.velocity. Это Vector3.
Я уже так делаю, но ведь это не сила прикладывается, а просто сообщается скорость? Я к тому, что от силы я могу получить ускорение, а от скорости - нет.
И в чем по твоему разница между постоянной силой и появлением каждый раз новой?
А если я скажу, что не остаются?
Если ты не будешь делать ничего. что сложнее игрушек,описанных в туториалах- хватит. Если сложнее- нет.
А как потом изучать? Мои навыки пока ограничиваются низкоуровневыми школьными олимпиадками по паскалю и пройденным курсом питона на codecademy. По шарпу посмотрел первую секцию в туториалах по скриптингу юнити и начал читать C# 5.0 Unleashed Bart De Smet'а, но он у меня плохо усваивается. Уровень знания англа довольно высокий, сам язык у него я весь понимаю.
>2015
>Physics.Raycast возвращает коллайдер
>бегаем по всем компонентам collider.gameObject, чтобы понять, во что же мы уткнулись
Оправдывайтесь, юнитимрази.
Ёбан штоле? Достаточно узнать тег или имя объекта чтоб знать что это за хуйня. Или если у объекта должна быть реакция на рейкаст пили интерфейс IRaycastable и вешай класс с этим интерфейсом на объект. Долбоеб ты тупой.
Читать другие туториалы и документацию, очевидно. Можешь покупать особо выкрученные и заумные ассеты, разбираться как они работают, общаться в геймекерами более высокого уровны, перейти на другой движок, завести собственную команду разработчиков, каждый год выпускать новый колоф дути В общем путей для развития море. Но если развиваться не будешь, то ничего лучше, чем сейчас не сделаешь. Олсо на твиче есть игра creative и в ней хэштег #gamedev вроде. Так там онлайн игры разрабатывают и иногда комментируют всё это или на вопросы отвечают. Конечно на буржуйском. Можешь ещё их посматривать.
Спасибо, но я имел ввиду именно програмиирование на шарпе.
> Достаточно узнать тег или имя объекта чтоб знать что это за хуйня.
>сравнивать строки при рейкасте
Просто эталонная юнитимразь. Надеюсь, тебя машина переедет, лол.
>Или если у объекта должна быть реакция на рейкаст пили интерфейс IRaycastable и вешай класс с этим интерфейсом на объект.
>>бегаем по всем компонентам collider.gameObject, чтобы понять, во что же мы уткнулись
Юнитимразь настолько ущербна что даже не может внимательно прочитать и осмыслить сообщение, на которое отвечает. Хочешь, я заплачу за твою стерелизацию, гнида?
По делу есть что сказать, скриптер? Иди теги развешивай, и сравнивай их в рантаиме, имбецил.
Насоветуйте годных туториалов для создания анимаций персонажа в 3д максе для юнити.
Всё что сам нашел - 2.5 школьника, рассказывающих про пресс_x_ту_спиздить_ассеты.
>сравнивать строки при рейкасте
>делать рейкасты
>применять числа с плавающей точкой а не фиксированной
>использовать условные переходы
>делить на 2 вместо умножения на 0.5
>юзать MOV AX, 00h вместо XOR AX, AX
Я хз что я сделал, но путём перестановок функций местами у меня наконец всё заработало. Если кому надо могу скинуть.
Создай отдельную переменную (не локальную) для этого вектора и меняй в нем значения Setом.
Я так и делаю, меня просто интересует, прав ли я насчёт бесконечного потока мусора от каждого кадра и насчёт того, что метод Set не делает то же, что и я, а как нибудь через скрытые поля или типа того?
Тогда получается вызовом конструктора я не создаю каждый кадр новый вектор, а просто по адресу переменной перезаписываю информацию новым вектором?
что-то в этом роде. Даже записав
Vector3 a = new Vector3(1,1,1);
Vector3 b = a;
у тебя в b будет совершенно другой вектор (считай b = new Vector3(a.x, a.y, a.z))
ну хз даже
Когда кажется что юнитимразь пробила днище, она начинает удивлять новыми рекордами. Просто пиздец.
Вот тут ликбез на джве страницы:
https://msdn.microsoft.com/ru-ru/library/4d43ts61(v=vs.90).aspx
Стуктура мало того, что value type, так еще там есть лулзы навроде отсутствия default initializers. Такие дела.
Как в принципе оформить мои помещения? Как префабы? Или как? И как их впихивать в уровень?
И еще, подскажите годных туториалов по созданию игровых классов (рпг).
Попробуй каждый уровень пильнуть как сцену и используй LoadLevelAdditively.
Вопрос: Можно ли его теперь одним разом отрендерить в одну большую текстуру, причем с приемлемым разрешением. А то делать скриншоты и сшивать их в фотошопе это пиздец геморно.
Может камеру сделать 24000х4096 размером?
Господи как я ненавидел этот ебаный уровень с водопадами.
Ты ебанутый? нахуя в видеокарту пихать растр размером в 300 мегабайт? если только это не атлас мегатекстуры, но это не твой случай
Тайлы для кого пилили? два-три мегабайта растров и несколько килобайт списков координат, в любой момент можно любой кирпичик подвинуть, в процессе по координатам вычисляешь какую часть списка рендерить, заодно работаешь со слоями, эффекты накладываешь, даже делаешь анимацию.
А ты хуй, взял и все в одну кучу слепил. Ты недостоин даже говна из под Кармака поесть.
Вы только посмотрите на этого разгневанного распорядителя говном кермака. Агресивность ему завезли. А понять прочитанное ему не завезли. Еще раз, у меня в юнити из этих твоих спрайтов-тайлов-мочи-говна по кусочкам собран уровень. Он уже готов, из обыкновенных SpriteRenderer. Я просто хочу сделать ОГРОМНЫЙ СУКА СКРИНШОТ всего уровня, чтоб в итоге получилась картинка вроде той.
Зачем? А ТЕБЯ ЕБЕТ ПИДОР БЛЯДЬ ИДИ РЕШАЙ КОМУ ОТВЕСИТЬ ЛОЖКОЙ ГОВНА КЕРМАКА А КТО НЕДОСТОИН. Блядь надо мне. Хоче левелдизайнеру уровень показать, порисоватъ на нем. Но нет, приходится делатъ скриншоты и долго и нудно клеить в фотошопе. Ах да, поскольку ты небось все равно не понял, поясню еще разок, а то вдруг слишком сложно для тебя. Я не собираюсь рисовать в паинте рисунок 16000х16000 и пытаться вставить это в юнити одной текстурой. Я делаю уровень из тайлов-спрайтов как ты и горовишь. Но для левелдизайна мне захотелось сделатъ скриншот всего уровня в целом. Мать твою в кренделя, тебе понатно?
Ты подебил, порвался еще сильнее.
И ты же не сказал, зачем тебе надо хуеву тучу тайлов сшивать в один растр, а учитывая уровень большинства юнитидетей можно было предположить только то что ты хочешь тупо сделать этот растр фоном игры.
Но ведь ты не будешь отрицать тот факт, что ты даун, метающий говно до того как разберется в ситуации?
мимо
Есть функция. В ней делаются 3 действия. Если их поменять местами, то они перестают работать. Почему? Так и должно быть или я что-то упустил?
Всё работает
if (colliders.gameObject != gameObject)
{
myAnimator.ResetTrigger("jump");
myAnimator.SetBool("land", false);
return true;
}
Не работает ресеттригер.
if (colliders.gameObject != gameObject)
{
return true;
myAnimator.ResetTrigger("jump");
myAnimator.SetBool("land", false);
}
Олсо видел, как в аниматоре при проигрывании какой-либо анимации под ней крутилась синяя полоска. Где настраивать, что бы она появлялась/исчезала?
Ты совсем аутист? после return true код не будет выполняться так как это возврат из процедуры. Во втором варианте операции над myAnimator не производятся.
А если написать просто true?
Нет, простоне знаю си шрапа вообще. По гайдикам стараюсь что-то сделать.
Ретурн во всех ЯП делает одно и то же. Для усвоения шарпа Шилдта покури штоле.
Я нихачу учить япы, я хочу делать игорей!!
для моей говноигры сгодится и тупое повторение за туториалом, а кинжку, начинал раз 10, но так и не осилил, всё равно спасибо.
Кстати, насколько хорошо нужно знать шарп, чтоб делать игори в юнити (не особо сложные)? Есть мануалы более краткие, даже скорее тезисные, типа "int это ... , дает это: ... , примеры использования: ...", "bool это ... , дает это: ... , примеры использования: ...", ну и содержащие основные принципы языка?
Настолько же, насколько нужно уметь владеть молотком чтобы построить дом.
В принципе можешь пройти несколько туториалов и узнать как писать то или иное стандартное действие (прыжок, движение, атака и прочее). Для запила игры этого хватит. Потом будешь обрастать другими кусками скриптов, потом научишься в инглишь и вауля=- ты знаешь си шарп. хотя после первого- второго туториала ты забьёшь на всё это дело и полетишь в доточку мидовать
Этот человек расписывает как из 2х боксколайдов и скрипта построить платформу. Но я нашёл Platform Effector 2D, который делает тоже самое без скрипта. В них есть принципиальная разница? Типа платформ эффектор больше грузит систему?
Можно-то можно, но рецепта я тебе подсказать не могу. Это гуглить надо, а мне лень.
играешь в игры -> думаешь как сделать лучше -> делаешь лучше... если не знаешь, что можно улучшить в уже существующей игре - придумываешь свою механику -> делаешь прототип и попутно решаешь встречающиеся проблемы... Если ни на что из перечисленного ты не способен, тогда иди вообще на хуй и не возвращайся блядь.
ты понимаешь что ты поехавший? всё, пиздец
Это копия, сохраненная 4 февраля 2016 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.