Это копия, сохраненная 7 июля 2016 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
И какого разрешения делать картинку для бэкграунда, если камера будет статичной?
Ну так какое сделать-то?
Делай под фуллашди, 1080x1920. От него уж пляши.
Если камера будет статичной, то какая нахрен разница, какой размер у бэкграунда? Просто делай так, чтобы растянутый на весь экран он нормально выглядел.
И что ты имеешь в виду под статичной камерой?
Если у тебя в игре будут 3д меши, то тебе в любом случае придеться менять ей дистанцию, для разных разрешений. А с 2д элементами тебе поможет вот такая хуета, как на скрине.
В таком случае вся графика, что запихана в канвас будет меняться в зависимости от высоты экрана, а в ширину тебе нужно заранее сделать очень длинные бэкгранды, с запасом. Если ты не про уи говоришь, а просто про бэкграунд - делай делай огромного размера, с запасом, чтобы не терять качество на размазывание. Но при этом сохраняй кратность, чтобы можно было пик ужать в настройках спрайтов.
>>255754
А если у меня будет возможность только вертикально играть. То все равно такое же разрешение делать?
При этом некоторые элементы интерфейса типа текста будут в большем разрешении, так что не получится просто все мелкое делать и апскейлить.
Есть какая-то штука для этого в юнити или писать ручками надо?
Size камеры = разрешение по вертикали / (две высоты спрайта). Например 200 / ( 16 х 2 ) = 6,25
Со многими, не знаю как сделать постепенное открывание уровней. Точнее что бы прогресс сохранялся. Я вообще не могу в сохранение и загрузку. Хотя гайдов всяких почитал, в голове нихера не осело. Может и тут подскажешь.
Ой, катись-ка ты с этим говном отседова.
>>255790
Кароч, гугли mvc и сериализацию.
Можешь еще протобуферов гугловских навернуть.
Самый простой пример:
[System.Serializable]
public class PlayerData
{
public List<bool> IsLevelUnlocked = new List<bool>();
}
Вот эту залупу можешь сериализовать в бинарник, либо жсон и сохранить на диск. В идеале еще пошифровать. inb4: и то и то залупа, а не сохранения
А потом кароч в своем монобехе, который рулит игрой, лепишь:
if(File.exist)
десериализуем
else
m_PlayerData = new PlayerData();
for(i = 0;i < levelCount; i++) забиваем список закрытых уровней в false
а потом когда надо почекать открыт ли уровень или нет берешь такой и
if(m_PlayerData.IsLevelUnlocked[номеруровня])
ахуенночоткоуровеньоткрыт;
else
блянухуйсосибратанпобрацки;
мимобухойПРОбыдло
inb4: код хуйня, он не поймет
Ой, катись-ка ты с этим говном отседова.
>>255790
Кароч, гугли mvc и сериализацию.
Можешь еще протобуферов гугловских навернуть.
Самый простой пример:
[System.Serializable]
public class PlayerData
{
public List<bool> IsLevelUnlocked = new List<bool>();
}
Вот эту залупу можешь сериализовать в бинарник, либо жсон и сохранить на диск. В идеале еще пошифровать. inb4: и то и то залупа, а не сохранения
А потом кароч в своем монобехе, который рулит игрой, лепишь:
if(File.exist)
десериализуем
else
m_PlayerData = new PlayerData();
for(i = 0;i < levelCount; i++) забиваем список закрытых уровней в false
а потом когда надо почекать открыт ли уровень или нет берешь такой и
if(m_PlayerData.IsLevelUnlocked[номеруровня])
ахуенночоткоуровеньоткрыт;
else
блянухуйсосибратанпобрацки;
мимобухойПРОбыдло
inb4: код хуйня, он не поймет
Без урока lvlGD не разобраться.
>сериализация для того чтоб сохранить циферку
Съеби нахуй из этого треда к блюпринт-программистам.
Добавлю, что пытался поставить OS X на виртуалку, но натолкнулся на разного рода сложности, которые устал обходить. Наверняка кто-то уже все за меня придумал и есть простой способ сделать то, что мне нужно.
В анус себе съеби, говнокодер.
Хуй знает во что его KILLER GAME вырастет, поэтому пусть учится.
Надо делать так чтобы работало на всех. Потому что ведроид ссаный. У дедушки Ляо обязательно найдётся модель с соотношением сторон 5.555:3.666. Обязательно.
Я за 60 вместе с маковской клавиатурой и мышью покупал в прошлом июле. Но то совсем днищемодель, хотя и по ряду причин сейчас моя основная машина с которой пишу вот прямо сейчас. Средняя без клавиатуры и мыши стоит чуть менее 60 прямо сейчас. Но даже это гоняет Юнити без особых проблем если не делать графоний.
брал мак аир 2013 на авито за 30к
Уебок, за засирание /gd тебе не заплатят, сьеби в свой политач, гнида
Тебе нужен цифровой сертификат который получается только с реального устройства. Плюс стольник в год отстегивать эпплу. Компилять можно и в облаке.
Без хорошо продуманной архитектуры очень болезнено было писать. Костыли подпирали велосипеды.
Я так и не понял, например, как мне в update только 1 раз выполнить какую-то функцию нормальным способом? Я делал флаг типа:
bool started = false
...
if(!started)
{
myFunc();
started = true;
}
...
и потом при выходе из текущего гейм стейта обратно ставил started = false;
Но это же пиздец какой-то.
Существует аналог http://gameprogrammingpatterns.com/contents.html чтобы прямо в unity реализовывали, как для дебилов?
Как реализуют подмен одежды в играх на unity ?
К примеру есть модель игрока, и скажем игрок находит рюкзак и одевает его.
Все изи если рюкзака 2-3 вида. А если их 10-15 ?
Делать сабмеш с атрибутом отображать\не отображать не вариант, сильно ФПС просядет.
переключи проект на андройд, там будут все нужные разрешения.
file->build settings->android->switch platform
Объект рюкзака, меняешь его меш с текстурой на нужные.
На винде под ios собрать будет очень сложно, оно того не стоит.
Какие я вижу варанты:
1. Купить старый мак на авито. Макбук Про 2009 года стоит 10-15 тысяч рублей, на него можно поставить последнюю икс ось и на нем билдить под ios. Понятное дело, что будет подтормаживать, но чтобы собрать проект, самое то.
2. Есть сервис, на котором можно запускать мак ось в облаке. Стоит от 20 баксов в месяц: http://www.macincloud.com/
Да, кстати, ты же в курсе, что тебе нужен девелоперский сертификат эпл, чтобы собирать приложения для ios? Он стоит 100 баксов, дается на год. Если ты нещеброд и проект более-менее комерческий, запускайся в гугл плей и смотри как попрет. Если нихуя качать не будут на андройд, то и на ios будет тоже самое.
Забыл, там еще yield return обязательно нужен. В конце yield return null допиши.
Отдельные слои для отдельных типов хитбоксов. Для мобов свой слой, для героя свой, для оружия свой.
Не могу. Я гайды не смотрел. У тебя есть объект "оружие" с коллайдером - дай ему слой "weaponcolliders". Для персонажа тоже свой слой. Для мобов - слой. Учись работать со слоями, детектить столкновения только по отдельным слоям, и будет тебе счастье.
Слои применяются только для проверки столкновений? Для чего тогда применять теги?
Теги - хуйня. Слои именно для физики должны использоваться. Ты даже в настройках физики (Settings/Physics) можешь указать, чтобы коллайдеры из определенных слоёв не сталкивались друг с другом. Например, если хочешь, чтобы мобы никогда не застревали в оружии (пример говно, но суть ясна). При грамотной работе со слоями и отключением лишних контактов скорость игры заметно возрастает, если ты используешь много коллайдеров.
В идеале можно обходиться без тэгов. Не знаю, как другие, но я ими не пользуюсь. Скорость получения объектов по тегам достаточно медленная, а для реакции на разного типа объекты я обхожусь сравнением слоёв, а не тегов.
Я закидываю апк, а у меня вместо пикселей каша одна. Где еще стоит что указать, чтобы все четко отображалось?
Мип мапы отключи.
в ideone.com если загрузить ipa?
Ты что, издеваешься? Или ты советы раздаешь сам не понимая что ты говоришь?
Хуле ты со своими советами тогда дебильными лезешь, раз не понимаешь? Нужно было именно в Update один раз запускать какую-то функцию не используя булевые флаги, ты мне начал рассказывать, что корутина в апдейте не один раз запускается. Теперь меня аутистом называешь. Из-за таких умников найти нормальное решение своей задачи среди тонн высеров тебе подобных превращается в вылавливание яблока ртом из бочки с говном.
>Нужно было именно в Update один раз запускать какую-то функцию не используя булевые флаги
И как ты себе это представляешь?
да
Я про режим, в котором оно делалось, я знаю, что умеет. Но тут ведь камера перспективная, хоть и дваде.
Да, в юнити много камер, эта самая перспективная.
Пиздец, что ты несешь? Ты можешь использовать 2D-физику и при этом использовать перспективу. Ты не понимаешь сути.
Есть физическая модель. 2D и 3D. Есть камера. Перспективная и ортогональная.
Я понял, спасибо.
Кстати, из вас никто тут нормальную шапку для юнити-треда не пилил? Или её проебали?
А что не так с текущей?
rocketInstance = Instantiate(rocketPrefab, barrelEnd.position, barrelEnd.rotation) as Rigidbody;
Вот первая строка, "Rigidbody" значит что в переменную влазит компонент ригидбади? Или что?
Ведь в нее засовывают целый префаб.
И что значит "as Rigidbody"?
ты создал переменную типа ригидбади
затем ты, скажем грубо, в нее записываешь результат функции инстантиейт. на сколько я помню, базово этот метод выдает просто тип Object(даже когда гейм обжект инстантиейтишь - надо в конце писать ес геймобжект), ибо функция не омжет знать что ты даешь на вход. Ез ригидбади - это типо приведения типов. в общем шо создал - к тому и приведи результат, как-то так
Чтобы на неё этот курсор переключать (и обратно)
if (camera1.gameObject.active == true)
{
var mousePos = Input.mousePosition;
var wantedPos = camera1.ScreenToWorldPoint (Vector3 (mousePos.x, mousePos.y, depth));
transform.position = wantedPos;
}
Не спал, туплю уже.
уже не надо
CS:
GetComponent.<Rigidbody2D>().velocity = new Vector2(movement, GetComponent.<Rigidbody2D>().velocity.y);
> (24,30): error CS1525: Unexpected symbol `<', expecting `identifier'
Ты совсем дурак? Пробовал в переводчик строку вставить?
После GetComponent не надо ставить точки.
GetComponent<Rigidbody2D>().velocity = new Vector2(movement, GetComponent<Rigidbody2D>().velocity.y);
Точка не нужна после GetComponent
Алсо, чо у вас тут так тухло стало?
Раньше же куча народу сидела итт.
> Неосиляторы
> на UE
вот прально
настоящие мужики уже давно на гей мейкер перешли и эрпоге, не то шо эти
Есть юнитинюфани в Котосибирске с каким-никаким опытом? Ну чтобы там алгоритмы знали, шарпы были на уровне, ООП, вот это всё? От 20к до 50к дают в знакомой конторе. Пилить игори на мобилочки. Много и быстро. Не КокодемМедия.
Да, все именно так и происходит.
Да, но скорее всего с 2д физическими обьектами
Это я видел. Оно совместимо с новым api?
Лучше пойду свою пилить с нуля. Нашел такой туториал, где 33 ACK-а в одном пакете передаётся.
Хочу чтобы можно было скриптом создать из префаба объект, но для этого, очевидно, нужен сам префаб как геймобжект.
Конечно, я могу просто перетащить его в инспекторе, но я хочу быть крутым и заставить скрипт самостоятельно найти нужный префаб хотя бы по имени.
Можно кинуть префаб в поле в редакторе.
ГейБаннерНетворк?
Двачую.
Сервер вообще про юнити ничего знать не должен. И ты не можешь например отрисовать тыщщу объектов на минимапе, получится кусок непонятной пиксельной каши.
Да, в нем.
Resources.Load
AssetBundles.Load
Алсо, пацантре, кто-нибудь юзал StateMachineBehaviour для ИИ?
Resources.Load, но твой префаб должен быть в папке Resources. Например, Resources/Prefabs/.../pidor.prefab
Ну ты и дебил.
на youtube
В голове, если полностью сам решился.
мне так и не ответили. :(
гугли юнити3дэ чото там ua
он в поиске встречается если названия ассетов гуглить
>>257259
чувак, это сложный вопрос. Здесь не так уж и много реализуемых вариантов. Самое простое - самому ебашить 3D модели и двигать их. я другого не придумал.
Ну, я догадывался, что это сложный вопрос.
Тогда, друг, что скажешь о том, что бы запилить как в одном видео, т.е сферу вокруг локации? А на нее уже анимацию? Это сильно большой костыль?
Меня сбивала Газель, когда я был в 4м классе. Я отлетел вправо от машины. Удар пришелся на левую ладышку, не спрашивай, как. Пролетел метра два.
Это да, но так я смогу сделать ему несколько уровней и тд. Если юзать дефолтный, я так смогу сделать?
Да, мразь. Могла бы что-то получше принести в больницу, а не сраный тетрис.
>ладышку
>в 4м классе.
Кому ты пиздишь? В 4-м классе уже писать умеют. Тебе ещё минимум два года до него тянуть. Или ты особо одарённый?
До кого, еблан? Что ты несешь вообще? При чем здесь "писать"?
Ладно, щас запилю.
Наверное, можно найти шрифт, который изначально подчеркнут.
В удаленном треде писал же тебе - возьми шрифт с подчеркиванием или сам дорисуй нужному шрифту хоть подчеркивание, хоть что.
lf gj[eq
Чому юнити так редко юзают для девелопа игр под пк?
Потому что юнити часто используют для игр на мобилах, ввиду отсутствия альтернативы. Вот и складывается впечатление, что на пк на юнити не делают, на самом деле делают, просто не так часто, как на мобилы.
Rust был написан на юнити, а потом они перешли на другой движок Точно не уверен насчет перехода. Чому?
У разработчиков спроси.
В какие папки мне это все ложить, и какой путь использовать при записи и чтении?
То есть всякие там "не стоит захламлять фиксдапдейт", только в более широкой форме. Оптимизация, 60 фпс даже для консоли и так далее.
Хотелось бы с самых пелёнок привыкнуть писать код хорошо, а не "как заработает".
google code standards для своего языка.
ТЫСЯЧИ, БЛЕАТЬ, КНИГ НАПИСАНО про это всё. Нет, не хочу учить, не хочу вбить три слова в гугл, не хочу скачать книгу по первой ссылке, хочу на дваче хуйню писать и прокрастинировать.
> туман
> колоргрейдинг
что тебе ещё завести, болезный
господи, ебаный вротельник, а потом они ещё в юичтред заходят посрать
SOLID, Code Smells, Refactoring.guru
по скрину больше ничего не заметно
Шапку-то схоронили?
Не загоняйся на тему как правильно писать код. Юнити – это кувалда, которая решает проблемы в лоб. Все эти паттерны и прочее говно, просто не будут работать из коробки, потому что тебе постоянно нужно наследоваться от монобихейвиор. Если бы это реально было все просто и понятно, нашеся бы уже какой-нибудь умник, который записал бы туотриал как это надо реальзовывать в юнити, где конкретно на понятных примерах объяснил бы что к чему. Но юнити уже 10 лет и за это время нет ни одного нормального туториала и знаешь почему? Потому что ими никто не пользуется.
Да и где их использовать? Чтобы лишний раз повернуть гейм-обджект не нужны паттерны и стандарты. Вообще, пока ты используешь юнити, тебе даже не понадобится 95% си шарпа.
- А что если у меня будет серьезная разработка, например клиент сервер и всякое такое говно? - скажешь ты.
- А что если ты, блять, погушлишь пять минут готовые решения? - отвечу я.
Стандарты были придуманы, для аутсорсинговых контор, чтобы обезьяны выдали хоть что-то рабочее. У тебя такой проблемы нет, потому что ты не обезьяна и у тебя не какая-нибудь ебучая банковская система, а йоба-игруля.
Короче, всегда пиши как удобно тебе, а не как должно нравится каким-то пидарасам, которые ничего кроме asp.net в жизни не видели.
На самом деле все ответы не правильные, это можно понять по вопросу. Анон хочет производительности, а не паттернов или форматирования кода. Например тот же фикседапдейт либо даже кривая проверка батонов могут съесть немало фпс. Но тут уж надо самому разбираться и гуглить, почему с одной лампочкой 10к трисов, а с двумя в два раза больше и так далее.
>>257929
>постоянно нужно наследоваться от монобихейвиор.
Не нужно, если знаешь, что делаешь. Туториалы есть.
А да, еще оно не работает.
если анон сейчас в офисе юнити, ебани по ебалу говноеду, который написал это говно. Сука, блять, если я сижу с компа и делаю игру под девайсы, это не означает что я хочу постоянно юзать ремоут. Что за ебанутые узколобые дегенераты? Почему нельзя написать так, чтобы на компа работал ввод и с клавиатуры и с мышки? Суккаа, ненависть блять пиздецюаквпвап
У меня работает. На мобилах не юзал, делал небольшой проект с машинкой, всё работает.
а у меня вагон проектов, которые надо зафиксить по-быстрому в ВО ВСЕХ не работает это говно. В предудущих было тоже самое. Сука, блять, еще и производители ассетов тоже добавляют это говнецо к себе. Серьезно, дотнет-бляди - не люди. Нахуй юнити нанимает людей, которые пишут вопреки экосистеме. АААААА. СУУУКАААА.
какого хуя я вообще должен чинить покупные ассеты? где эти ебучие черные ящики? Почему я вообще должен обращать внимание на говнокод?
>производители ассетов тоже добавляют
Потому что у них тоже всё работает. Но всегда есть кто-то один, у которого всё не работает.
Можно сделать джве камеры, первая не имеет гуя, вторая не рендерит ничего, кроме гуя. Ещё придётся установить порядок рендеринга.
Если канвас будет в режиме "скрин спейс оверлей", то не сработает. А так работает, только что проверил. Кулинг маск и депт настрой по вкусу.
Я вот поставил настройки как у тебя. И все кнопки на андроид устройстве ужимаются. На компе и в самой юньке все нормально, а как на телефон перекину, то все сжимается до маленьких размеров.
Еще вопрос такой. Как реализовать сохранение лучшего результата в игре, что бы еще и на андроиде работало. Приведите точный пример скрипта на сохранение, что именно там должно прописываться?
Я. Так себе, если честно, даже стандартный Animator впечатлил больше.
Насчет первого — попробуй поставить не Scale with screen size, а Constant Physical Size, с дефолтными настроечками (Points, 96, 96, 100).
Насчет второго, эм... Ну:
PlayerPrefs.SetFloat("Player Score", Mathf.Max(currentScore, PlayerPrefs.GetFloat("Player Score")));
PlayerPrefs.Save();
Примитивно, дальше сам.
Все "стартовые" значения и вызовы функций вынеси из Start() в функцию Spawn(), которую будешь вызывать из Start и из нужной кнопки.
1.6 нигде нет, есть 1.4.9
https://forum.cgpersia.com/f79/release-ufps-ultimate-fps-1-4-9-a-106631/
хотелось бы 1.6, но и на этом спасибо, не думаю что различия стоят долгих упорных поисков
Есть объект, переносящий игрока не следующий лвл. Нужно получить номер текущей сцены, добавить к нему 1 и при колайде с игроком запустить следующую сцену.
Какую ему ссылку то нужно?
Если прописать номер сцены вручную, то всё ок.
А ты пиши имена переменных как белые люди - с маленькой буквы, и проблем не будет.
Я открою тебе тайну- пока я делал свою говно игру я ничегошеньки не понимал. Туполепил команды по мануалу и копипастил готовый код. Уже движок забабахал, врагов сделал, осталось спрайты нарисовать да какую-нибудь историю прикрутить и игорь готов. По образованию визажист, если что.
У меня есть объект, который нужно раздавить. Скажем на поверхности лежит блок. На него сверху падает другой. Если падает достаточно тяжелый, то первый блок уничтожается.
Другой вариант - когда блок зажимается между двумя кинематик объектами. Они просто продавливают блок через себя, а нужно его уничтожить.
Я честно гуглил, но нихуя не нашел.
Тебя за твою игру тупую обоссут, а уже потом за лого юнити. Так что не волнуйся.
>>258294
На 3х месячных курсах, очевидно.
>>258297
Ну, когда падает, можешь через коллайд уничтожить.
void OnCollisionEnter2D(Collision2D coll)
{
if (coll.gameObject.tag == "BiggerMass")
{
Destroy(gameObject,.5f);
}
}
Скрипт ставить в объект с меньшей массой. Правда тут уничтожится лёгкий объект даже если не на него упадёт большой, а он на большой. Можно ещё скорость движения чекать, но это думаю и так понятно.
про второй вариант не очень понял. В голову пришёл только корейский способ- вставить внутрь объекта ещё один объект, который будет уничтожать их оба при контакте с чему угодно кроме того, во что он вставлен.
В обоих случаях нужно вычислить силу, которая действует на объект.
Во втором случае два движущихся объекта как бы зажимают блок между собой. Резолвер, если есть куда - "выдавливает" блок, а если его "выдавить" некуда - продавливает сквозь коллайдеры.
Самый простой и очевидный способ, который пришел мне в голову - количество точек столкновения. В самом простом случае с круглым коллайдером их две, по одной на каждый из объектов, которые зажимают его. Может быть и больше, если коллайдер не круглый. Но я пока рассматриваю этот простой случай. Получается, что когда блок "продавливается" через коллайдеры, количество точек столкновения увеличивается, например до четырех (в некоторых случаях и больше). Так что если количество точек столкновения больше 4 - можно смело уничтожать объект.
Но это частный случай. Время от времени с таким подходом возникают проблемы. Например при больших скоростях резолвер не успевает добавить контрсилу вовремя, и блок уничтожается даже при обычном столкновении, а не когда его зажимают другие обьекты.
Может есть способ вычисли эту самую силу давления на объект?
Rigidbody2D.mass
Массу точно можно получить, не думаю, что есть смысл ебаться с расчётом силы (масса* на ускорение).
Если у тебя проблемы только при больших скоростях, то может проще взять и обрезать макс скорость?
Нужно сферу сделать полупрозрачной, пол часа гуглил, нихуя не нашел, поулчить компонент не получается, помогите, иду спать с разорванным пердаком. Блядь, все приходится гуглить, анон, сижу 4 дня, я конечно ньфажина ссаная, но тем не менее. Вот создал 10 обьектов, и подцепил их к пустому обьекту, чтоб двигать все вместе. Запускаю, и тут хуяк главОбьект сьехал вправо, а координаты в трансформе те же самые что и были. WTF? у меня баттхерт, приходится сука былокодить и в ручную писать сдвиг. А от UI кресло прогорело нахуй. Ладно, может просто тупой, зато кораблик летает, мнимапа работает и карта со свездами, которая скролится, только нужно сделать чтоб объекты на краю были прозрачными, а то когда резко исчезает оченоь некрасиво.
рейнджер порватка
На самом деле проблема возникает не только при больших скоростях. Есть частные случаи, когда точек столкновения много, но нет давления на блок. Предусмотреть все такие случаи и исключить их не получится.
Ну и да, сила давления не предусматривает ускорения. Как быть в этом случае?
Отвернуться от давления- делить силу на площадь соприкосновения ты заебёшься. Может просто сравнивать массы сталкиваемых объектов и неподвижный уничтожать?
С зажиманием-у тебя как эти зажимания возникают то?
Ебать, так у тебя 1 тело не подвижное жи. Тогда просто чек 2х коллайдеров одновременно+чтобы кто-то из них двигался.
Функции лень гуглить но логика такая:
Если ((есть_колайд_с_1объектом&&есть_колайд_с_2объектом)&&(скорость1го>0&&скорость2го=0||скорость1го=0&&скорость2го>0))
Уничтожить этот объект.
Ладно, завтра попробую нормальный код кинуть. По-моему идея с проверкой точек соприкосновения тут будет полностью провальна.
Не спеши с выводами. Вместо статического коллайдера может быть кинематик коллайдер.
Я пришел к выводу, что пока самый оптимальный вариант - с двумя коллайдерами.
Но возникла другая проблема. Чтобы уничтожить объект нужно чтобы в столкновении участвовало минимум три объекта - сам блок, и два (статических или кинематик) коллайдера. Я порылся в документации, но так и не понял как мне определить сколько коллайдеров сталкиваются с моим блоком. Collision2D.collider дает мне доступ к одному. А если их два или больше, как быть тогда?
Application.persistentDataPath
>>257929
>потому что тебе постоянно нужно наследоваться от монобихейвиор
Катись отседова, умник ебаный.
>>257941
Манда ты тупая, даже объяснять тебе ничего не буду, а ткну сюда: http://gameprogrammingpatterns.com/command.html
Ебись дальше со своими перехардкожеными ифами.
Алсо, скоро новый инпут завезут: http://blogs.unity3d.com/ru/2016/04/12/developing-the-new-input-system-together-with-you/
>>258211
Юзал. Штука хорошая, но ебал в рот. Аниматор попизже будет.
>>258313
Ты какой шейдер используешь, наркоман?
Вангую, что какой-нибудь Opaque.
>Ты какой шейдер используешь, наркоман?
>Вангую, что какой-нибудь Opaque.
А какой надо? Разные пробовал, напиши строчку кода будь добр как получить доступ со скрипта, потому что у меня подсвечивает красным.
Отбой, сделал
А как они могут называться? CircleCollider, Polygon Collider. Они добавлены как компоненты. Я подозреваю что доступ к ним можно получить через гет компонент и массив с коллайдерами. Но тут другая проблема теперь - даже если я получу ссылку на правильный коллайдер, как мне проверить что OnCollisionEnter происходит для правильного коллайдера?
Юнитигоспода
Расскажите мне про возможности местного физического движка.
Мне нужно симулировать поведение шагохода в реальном мире и отработать алгоритмы.
Есть ли у вас подобие акселерометра, гироскопа? Про соединения все итак более-менее понятно.
А вот про то, можно ли тут сделать балансирующий шагоход - не совсем.
Берешь и без задней мысли пишешь СИСТЕМУ СОХРАНЕНИЙ.
И каждая блядь, которой надо сохранить-загрузить данные стучится в эту систему сохранений.
мимоПРОбыдло
Сделать можно всё. Ты должен понимать, что physics - физический движок, который ты в любом случае будешь использовать.
Нужно ли для 2Д игры писать/заюзать готовое решениедля culling-га объектов вне камеры?
Если включишь, то будут бесящие фичи, как в ниндзягайдене, когда враги ВНЕЗАПНО появлялись там, где их не было секунде назад. Если не включишь- могут быть лаги (если овердохуя понапихал). Я свои 2д делаю без кулинга.
Делать всё из кубиков размеров в 1f? Больше кубиков богу кубиков!!!
Это не проблема юнити. Это проблема c#. Только в библиотеках java можно сделать мир как в майнкрафте, т.к. там используется double. А в c# во всех либах для координат float.
float предоставляет четкие данные вплоть до 6 или 7 чисел, вне зависимости от того, после какого по счету числа идёт запятая. Такова особенность. Поэтому мир достаточно сильно ограничен, если тебе важен каждый сантиметр.
до 6 или 7 цифр*
То есть если я тупо перепишу сейчас все скрипты на js, то расстояние от центра координат перестанет быть проблемой? Какие подводные камни у такого подхода?
Как я понял, мне не решить проблему с погрешностью?
Я на эту тему гуглил. Нет никакого готового куллинга для 2д. В моем случае было достаточно скрипта, который деактивирует объект, и отключает физику, если он вне видимости камеры.
Генерить мир в виртуальных int координатах, а потом преобразовывать значения в float?
И ещё вопрос: как эта проблема решена в kerbal space program? Там ведь довольно большой мир, и скорости тоже серьёзные.
черт, два раза запостилось
Например скрипт генерации работает с целыми числами. А уровень генерируется в процессе игры в пределах, где погрешность не влияет на координаты. Относительно позиции игрока, например.
Катится в пизду это как?
Кубики стык в стык не попадают что ли?
>>258606
Не вижу таких ситуации в этой игре, на которые погрешность оказывала бы серьезное влияние.
У себя сделал так - мир отцентрован относительно персонажа, персонаж всегда примерно в нулевых координатах, мир двигается относительно него. Положение персонажа - три double, XYZ. Из подводных камней большого мира - отрисовку вдаль не запилить, т.к жрёт фпс. Много активных объектов не запилить, т.к жрёт фпс.
У меня не кубики, а звезды, с планетами и прочим. И на большом удалении от центра камера начинает дрожать, как и сам корабль, и звезда с планетами вокруг.
На каком то twg была игра с бесконечным заводом космосом на юнити, значит есть способы дать пососать ограничениям.
И в чем смысл этого действия? Ты преобразуешь int во float и опять получаешь число с погрешностью.
>>258650
Короче, я тебе поясняю. В маленьких играх можно позволить себе двигать небольшой уровень относительно персонажа. Но представь, что будет, если ты будешь менять координаты каждый кадр. Твой фпс адски просядет из-за того, что ты насилуешь physics и заставляешь всем ебаным объектам менять свою позицию.
В майнкрафте реализована возможность делать мир шириной до 10 миллионов блоков (метров), если мне не изменяет память. Также, если мне не изменяет память, он написан на libgdx. А там можно использовать double для координат. Такие дела.
>можно использовать double для координат
На самом деле нельзя и дело не во фреймворке, а в видеокарте. Она для рендеринга принимает данные во флоатах и пошлёт нахуй твои даблы. С подобной проблемой сталкивался разраб спейсэнжина, кстати, можно погуглить.
>что будет, если ты будешь менять координаты каждый кадр
Двигаю мирок 50х50 тайлов 4х4км каждый. Не каждый кадр, а только когда игрок преодолевает 2км в любую сторону. Каждый кадр учитывается только прохождение игрока по любой из координат. >>258626 -кун.
Ну значит если тип данных у координат не изменить никак , то может проще написать свой движок?
Вот мне тоже интересно как инженер обошел эту хрень, я где-то читал пару лет назад его пост об этом, но сейчас хрен вспомнить где.
>как инженер обошел эту хрень
Просто конвертирует перед передачей на рендеринг в относительные координаты во флоатах, а сам оперирует абсолютными. Почти то же, что и я делаю, лол. На читал скорее всего на хабре.
Смысл в том, что координата целого числа 60000000 может быть представлена как относительная координата 0.0.
>майнкрафт
>Также, если мне не изменяет память, он написан на libgdx
Череп не давит от знаний?
Он чуть выше писал, что в шарпе даблами пользоваться нельзя, так что всё и так понять, нечего разжёвывать.
говна пожуй, ебанат
вроде можно сцены загужать в отдельном потоке. это может помочь. В старой api это дергалось через Application.LoadLevelAcyns, сейчас, наверно, есть что то подобное в SceeneManager
Скорее всего аудиофайлы грузятся долго. Поменяй для музыки тип на streaming
там много и искать надо и для Vector3 особенно. проще спросить чем вечер искать.
Ебать прогугли площадь трехугольника в пространстве. Или найди его стороны, через функцию которая возвращает растояние между точками и подставь в формулу.
а могу просто попросить на дваче, чтобы мне дали довольно тривиальную хуйню, у которой много методов решения, которая в добавок ещё и может быть написана красиво и понятно(а может даже с коментиками) с использованием имеющейся хуйни в юнити. вместо того чтобы сидеть и выдавливать это из гугла и из себя.
на самом деле мне 27 лет, а написали хуйни, поэтому надо написать хуйни в ответ.
какой ответ такой и ответ на ответ, хули.
но вернусь к просьбе. нет чтоли ни у кого под рукой красиво функции, которая потом не клюнет меня с порядком вершин, или ещё какой хуйнёй?
Да-да, мы тебе поверили, пошёл нахуй.
Великовозрастный ленивый долбоеб - ещё хуже пиздюка
while(true)
{
GameObject gayObject = new GameObject("cockHole");
Debug.Log(gayObject.name);
Vector3[] vert = new Vector3[3];
vert[0] = Vector2.zero;
vert[1] = Vector3.back;
vert[2] = Vector2.one;
float sqrTri = ((vert[1].x - vert[0].x)(vert[2].y - vert[0].y) - (vert[2].x - vert[0].x) (vert[1].y - vert[0].x)) * 0.5f;
Debu.Log(sqrTri);
}
>>258844
я пришел к более изящному решению.
private static float Area(Vector2 A, Vector2 B, Vector2 C) {
return Mathf.Abs(Vector3.Cross(A - B, A - C).z) * 0.5f;
}
знаешь, сидя в интернете с 2002 года я пришел к простому выводу: использовать любые правила которые не приводят к искажению смысла сообщения это бесполезная трата усилий. например первое сообщение в треде я написал вежливо и с большой буквы, потому что хуяк просьба которая вроде как сэкономит мне время. а для говна мне лень на шифт жать.
впрочем иди нахуй, эту тему можно развить, но она не про юнити, а новые треды тут делают редко.
Код пишу исключительно на C#, мне без разницы 3д или 2д.
Жду тебя, няш :3
Жанры абсолютно любые, пишу на десктоп, на андроид пока-что не пробовал. Вкатился то недавно. Да и если заинтересовало, то пиши на почту. Там на все отвечу ^^"
На VR просто более пиздатого ничего пока не сделаешь. Рисовалку толко как у лилипичу.
Антуан, я тут чисто случайно наткнулся на свг импортер. Вообще охуенная штука, и со скэйлом проблем нет, и занимат копейки места. А как оно в деле, кто нибудь пробовал? Охуенно садит производительность в 2д режиме? А то у меня от юнити смешанные чувства, вроде и работает неплохо, но каждый мой пук сьедает такое колличество фпс, что я даже не знаю, стоит ли игра свеч.
Вырежи из старбаунда, там красивые.
Была игоря на мобилочку, помню, шота про паркур, там гг бежит по скролящейся дорожке с препятствиями, а игрок должен рисовать кружочки-завиточки чтобы гг изящно вращаясь и выгибаясь преодолевал препятствия. Хотел бы к своим корованам прикрутить такое. Я правильно полагаю, что машина различать узорчики лучше всего будет при использовании нейросети я в этом вообще хуй и ну ваще не разбираюсь?
Есть ли готовые решения на такой случай? Каким образом енто лучше реализовать в юнити мытищи ультрахардкор?
Ищи, гугли, на андроид студио такая библиотечка точно была, с возможностью еще и добавлять свои жесты так что думаю полюбому где то что то такое естьа в ассетстроре за 100$ так точно.
денег нет. вернее есть, но на макак не хватит.
Нашел вот это: http://www.gamesparks.com/ выглядит круто, но дорого шопиздец. Первые 100к пользователей бесплатно, потом 2 цента ЗА КАЖДОГО ЮЗЕРА. То есть с ляма установок им надо 20 килобаксов отстегивать.
но ведь играют же
transform.position = new Vector3 (gameObject.transform.position.x - Time.deltaTime * 16, gameObject.transform.position.y, 1);
if (transform.position.x > xx + 60) {
transform.position = new Vector3 (xx+58 , gameObject.transform.position.y, 1);
}
if (transform.position.x <= xx - 60) {
Time.timeScale = 0.0f;
}
}
xx - gameObject.transform.position.x;
При клике увеличивается на 4.
В самой юнити работает нормально, а на мобилках размеры херятся. И получается что полоска не до краев доходит. Что поменять?
Я думал использовать размеры самой полоски вместо чисел 60,-60. Но не могу найти как выцепить размер непосредственно в коде.
Таймбар на канвасе? Сделай на канвасе и правильно выбери относительно чего скейлить, и в настройках рескейл на мобилочках сделай.
>Как лучше всего реализовать таймбар.
Тут я хотел спросить, а не утверждать. Просто у меня не получается сделать нормально.
>>259257
У меня стоит constant physical size. Но при этом на мобилках все равно херятся размеры.
Добавь слайдер, сними галочку в нем с того чтобы его можно было мышкой двигать, наложи текстуру и програмно увеличивай размер движущейся штуки.
Или вариант номер 2, сделай картинку обводки индикатора которая типо окаймляет твой бар и сделай внутрений бар, поставь первую картинку поверх второй и локалскейлом увеличивай ту картинку которая показывает насколько этот бар заполнен. Кривовато описал но вроде понятно.
Вобще гугли HP bar unity там все будет хорошо расписано с кодом.
Как видно, тот что выше нормально реагирует на свет. Но его изображение деформировалось и стало ужасным.
Нижний спрайт не изменил своего вида, но его видно при отсутствии света. Очевидно, выглядит бредово.
Подскажите как сделать не деформированный спрайт, реагирующий на свет?
http://antonkudin.tumblr.com/post/110198230014/pixellighting
Может что-то интересное почерпнёшь.
А настоящий календарь использовать, зашквар чтоли? Бери системные инструменты, они всё умеют.
Но у меня игрок будет пролистывать время, и неделя за 5 сек пройдет, у меня будет симуляция времени, разве так можно будет делать?
>>259246
Кстати, сам нашел ответ на свой вопрос.
>Но не могу найти как выцепить размер непосредственно в коде.
RectTransform objectRectTransform = gameObject.GetComponent<RectTransform> ();
wid=objectRectTransform.rect.width;
Если говорить про фильтрацию, то билинейная и точка на производительность почти не влияют. Так что если у тебя не пиксель арт какой нибудь - лучше брать билинейную.
Нет мягких градиентов - 16 битный формат самое то. На ретине даже не заметишь. А максимальный размер, насколько я понял влияет за упаковку в атласы и мипмапы. Не думаю что тебе нужно ее дергать. Я ставлю минимальный размер в который втискивается спрайт.
Алсо, хорошая практика - работать со спрайтами один к одному. Поэтому у меня всегда 1 юнит - 1 пиксель.
А зачем тебе это делать на UI? Вы тут как то криво решаете задачи. Один на физике элементы интерфейса делает, другой элементы сцены в интерфейс запихивает. Охуеть тут можно.
я вообще не знаю как решить эту задачу, физикой я просто получаю имя объекта, но мне нужно ка то отобразить вокруг этого объекта спрайт, независимо от расстояния от камеры, поэтому и подумал что UI лучше использовать.
>>259511
Вот скрин космической карты из SE. На нем видно у всех звезд обводку, которая не меняет размера от расстояния от камеры до этой звезды. Я хочу реализовать что-то подобное, но только для звезды по которой кликнул мышью. Сам объект получаю рейкастом, это не проблема. А вот как рисовать этот кружок вокруг него, нет идеи.
спроси в бэкенд треде.
Есть несколько вариантов.
1. Создаешь canvas, в нем renderer mode ставишь в world space. Теперь у тебя UI будет рисоваться не на камере, а в пространстве. Потом ты добавляешь картинку в этот canvas и перетаскиваешь canvas в трехмерном пространстве туда, куда тебе нужно. Ну или картинку. Его можно вращать, все дела.
2. Другой вариант (Кстати, у тебя 2д или 3д?) Если 3д, то можно создать plane и на нее повесить как текстуру твою картинку, которую ты хочешь. Ну и просто перетаскиваешь ее в то место, куда тебе надо.
3. Если ты хочешь создавать динамически 2д-фигуру, то с этим проблема, потому что юнити почему то так не умеет. Зато, вроде бы, умеют плагины. Посмотри в этой категории:
https://www.assetstore.unity3d.com/en/#!/search/page=1/sortby=popularity/query=category:117
То, что тебе может подойти:
https://www.assetstore.unity3d.com/en/#!/content/20166
https://www.assetstore.unity3d.com/en/#!/content/29160
https://www.assetstore.unity3d.com/en/#!/content/82
Отличная функция, спасибо за наводку. Все замутил, все работает.
Цель - сделать галактическую карту, просмотри пожалуйста быдлокод и скажи что не так? Все работает, но должны быть упущения, bad practice и тд. Может само по себе решение глупое? Сорри что так сжато.
Спасибо анончик, спас.
Вы не девелоперы. Вы ссаные конструкторы. Сажи въебите.
Если у тебя в игровом мире 10 звезд это ок. А если 1000 или 1000000? Инстантиэйт не лучший вариант. Тем более парсить список из 100000 элементов, на предмет их видимости это очень плохо. Нужно оптимизировать.
Но пацаны, как всегда, не обратили внимания на это визгливое кукареканье. Пусть кукарекает, что с него взять?
Движкоблядь — не человек, и сегодня ему предстоит очень трудная ночь. У него уже в течение полутора лет каждая ночь была очень трудной, и теперь его рендер был разработан настолько, что он без труда мог вывести на экран банку сгущёнки.
Звезд будет 50-100, но а если тысячу, какое решение можно применить? Была еще идея сделать карту как бокс коллайдер, и если звезда в нем, то отображается. Благодарю за отзыв.
Решений может быть множество, от структуры данных, из которой ты будешь читать информацию для отображения до каких нибудь кластеров, которые будут обрабатываться попадая в область видимости камеры. Честно говоря мне лень думать.
Что мне сейчас бросилось в глаза, так это проверка на видимость. Быстрее использовать префаб со скриптом. OnBecameVisible тебе поможет рисовать все что нужно и избавит от пробега по массиву в каждом апдэйте.
Можешь рейтануть мой маленький проект в плане оптимизации? Один скрипт скинуть будет глупо, там их всего лишь пять и они тесно связаны, лучше просмотреть цельный проект.
Суть в том, что хотелось бы не проседать по кадрам на ~100м объекте при скорости x10. Есть у вас какие-нибудь советы, как у тех, кто уже довольно давно кодит?
Единственные мои идеи по оптимизации на данном этапе - вместо постоянного applyforce с собственной силой за каждый объект, применять всего лишь один applyforce с суммой всех нужных сил.
Просто хочу максимально обсосать этот тестовый проект ради получения бесценного опыта.
В c# и юнити я третий месяц, не бейте ногами.
https://www.dropbox.com/s/cxjo4or73to4yc5/chem.rar?dl=0 не вишня
Ты себе льстишь, когда говоришь что на скорости 10х проседает на сотом объекте. У меня проседает на третьем десятке, с семидесяти до пяти-шести фпс, лол.
Ты не думал использовать вместо всего этого хлама Point Effector?
После ue4 вообще невозможно работать, глаза вытекают, пальцы узлом завязываются, мозг фаломорфирует.
В официальных мануалах юнити всегда берут 10-36 пикселей на 1 юнит. Ты вообще представляешь, что значит 10 юнитов? Это гигантский объект. Так никто не делает.
Физика объекта размером в 100 юнитов - это пиздец, например. Просто по поведению объектов можно судить.
>После ue4 вообще невозможно работать
Не знал что ко вкусу говна можно привыкнуть. Почему с уе4 ушел, кстати? Насчет вопроса - интерфейс юньки можно до неузнаваемости перелопатить, правда блюпринт-программистам это не под силу.
Поинтэффектор хорошая штука, но я, как минимум, не знал о его существовании. В новой версии обязательно воспользуюсь им.
Но на данный момент я хотел бы оставить апплай форс просто ради интереса и, опять же, опыта. А то кто знает как жизнь сложится.
Может меня свяжут и под дулом автомата заставят аналогичную хуйню делать используя только апплайфорс? Как я перед ними отчитаюсь, если проседать на тридцатом объекте начнёт?
UE4 слишком тяжелый для нашего скромного 2D говнеца.
У меня тут рядом сидит сеньор шарпов, он со мной полностью согласен насчет интерфейса.
Рассказывай как лопатить. С документацией у юнити тоже беда какая-то.
Ты представляешь что размер - относительная штука, и 1 юнит это всегда один юнит. Не метр, не килограмм. Просто единица измерения. Если тебе нужно сдвинуть спрайт на 10 пикселей, ты заебешься с координатами. Гигантские объекты у него, вообще охуеть.
У тебя абуз фиксед апдейта. Единственное что может это исправить - отказ от такого количества вычислений за тик.
Ты ебанутый? Ты понимаешь, что максимальная координата равна максимальному float'у? Ты понимаешь, что никто в здравом уме не будет использовать 1 юнит как 1 сантиметр? Это, блять, просто здравый смысл. Он делает картинку равную 1/650 от общего размера ФИЗИЧЕСКОГО МИРА. Вообще охуеть. Удивительно.
Ты странный, так как нет смысла считать расстояние в юнити в пикселах, юнити же не блиттингом в фреймбуфер эти спрайты рисует. Где отображается пиксель только от настроек камеры зависит.
И ты мне сейчас назовешь общий размер физического мира, и максимальное значение float?
Настройки камеры... считаются в юнитах))) Браво. Теперь ты должен понимать о чем я говорю.
>OnBecameVisible тебе поможет рисовать все что нужно и избавит от пробега по массиву в каждом апдэйте.
Хм, не знал, крутая штука, но, OnBecameInisible не подойдет, так как хочется плавного исчезновения, а не мгновенного. Придется пока оставить так, буду поднимать скил на других вещах, добра.
Ладно, не трудись. Я сам тебе его назову - 3e+38. Точные значения можно получать вплоть до 9999999, что для любой 2д игры не просто достаточно, а более чем.
Я понимаю, что фиксдапдейт это святое, но мне казалось, что большую часть жрёт именно физика, а не какие-то там 2+2.
Это не так?
Теоретический вопрос: как реализовывать обход динамических препятствий?
Есть один встроенный navmesh, и хотелось бы, ползая по нему, обходить динамические препятствия, типа других ползунов.
Можно использовать встроенные obstacle, но тогда нет возможности выбирать "игнорить" легкую обстаклю, которую проще сдвинуть, или видя что она более тяжелая - аккуратно обходить. К тому же ползун будет "видеть" весь путь, даже тот который не в его поле зрения, а какого хрена он видит других ползунов за углом?
Можно рейкастить перед собой, находить коллайдер, сравнивать массы, брать его bounds, но что делать потом? Как построить новый путь или скорректировать старый, исходя из этих bounds?
Дискач.
ты задал довольно страшный вопрос. динамические обстаклы это обычно когда берется готовый навмеш, в нем вырезаются дырки в нужных местах и он ретриангулируется минуя этап вокселизации. можешь попробовать брутфорсить все баунды, например как это у этих хуёв http://rivaltheory.com/rain/ например чтобы агент просто обходил их по краям в надежде что где-то там найдется дырка. или триангулировать только динамические обстаклы, строя проходимые области только между ними, а потом искать места соприкосновения с существующим навмешем.
если препятствия появляются в процессе, то можешь сохранять несколько предыдущих маршрутов и проверять, какие препятствия появились на старом пути, например. и пускать агента по старому маршруту, если он более адекватен.
алсо пикча из моего самодельного навмеша который я никак не закончу.
Ковырял их проект, по некоторым причинам, отказался от его использования.
Как я уже упоминал, нет проблем в использовании обычных обстаклей, есть проблема в том, что навмеш един для всех. Это значит что Ползун весом в 1 килограм и весом в 100 килограм для навмеша - одинаковые препятствия.
К тому же, учитывая, что навмеш един, то Ползун1 в 20 километрах от препятствия, внезамно о нем узнает при построении пути, если Ползун2 в 1 метре от него поробует через него пройти.
Поэтому я предположил, что наиболее адекватным будет компть в сторону редактирования определенного Path, рассчитанного для данного конкретного ползуна, учитывая что мы знает bounds препятствия.
Так же есть решения, которые называются 3d pathfounding (в "космосе" и т.д.), но там много непонятной магии, типа Dijkstra's algorithm и т.п.
Опять же, это мои предположения, поэтому запускаю дискач.
Для одного это препятствие, для другого "я эту хуйню еще обходить буду?!". Но навмеш же один для всех.
Тащемта можно упороться в подобное, но чот как то непросто это.
http://gamedevelopment.tutsplus.com/tutorials/understanding-steering-behaviors-collision-avoidance--gamedev-7777
Навмеш да, а carving можно включать в зависимости от того, кто использует навмеш.
5 Ползунов используют навмеш. Одновременно. Каждый использует как обстакли только 2 из оставшихся 4. Вот я о чем. Ниторопись, подумой.
это долго, если нихуя не знаешь какие есть проблемы и как их можно решить.
>>259697
да можешь особо не описывать проблему, она и так понятна. вроде у юнити обстаклы не могут влиять на какой-то конкретный леер, так что вариант с тем чтобы каждый леер был для своего агента отпадает. если хочешь пользоваться навмешем юнити то можешь попробовать сделать довольно нелепую хуйню - очередность проверки путей. включить нужные обстаклы для нужного агента, получить путь, включить обстаклы другого агента и так далее.
редактирование пути на самом деле довольно плохая затея, если несколько обстаклов рядом. если хочешь именно строить маршрут, то для проблемных мест можно на коленке собрать свою навигацию по гриду, например. это проще чем свой навмеш написать. например когда агент приближается к жопному месту то там кастуется грид Physics.SphereCast и дальше навигация уже по нему.
алсо ололо че дейкстру то вспомнил? лучше https://ru.wikipedia.org/wiki/Алгоритм_поиска_A* воспользуйся. тот-же дейкстра, только плюс фактор удаленности.
>очередность проверки путей
Я уже представил всю печальность способа от 10 Ползунов и начало слайдшоу. :(
>если несколько обстаклов рядом
Согласен, "увидев" один обстакль, попробует обойти, там второй, попробует пройти по предыдущему пути, там первый обстакль и так до бесконечности.
Но!
Можно использовать CapsuleCastAll и использовать суммарный Bounds.
>A*
Согласен, рассматриваю как вариант, наряду со steering. Подходы разные, и в данный момент steering мне кажется чуть более удобным вариантом.
>Я уже представил всю печальность способа от 10 Ползунов и начало слайдшоу. :(
да врядли, у юнити динамические обстаклы довольно быстрые, как и проверка пути. к тому-же тебе надо перепроверять путь не каждый фрейм же. я бы попробовал сначала лёгкие пути. это-ж не моя бида-пичаль с тем что у юнити NavMeshBuilder в неймспейсе UnityEditor, так что хуй а не навмеш для процедурного уровня в 3д.
>Можно использовать CapsuleCastAll и использовать суммарный Bounds.
на самом деле я бы от баундов не отталкивался. если у тебя уровень имеет только одну плоскость то можно, например, зная форму обстаклов собирать все их контуры в кучу, находя места их пересечения и искать обход уже сложной фигуры. но весь этот план глобально говняный, потому что динамический обстакл может упираться в границу навмеша например полностью блокируя какой-то проход и так ходя вокруг обстакла агент никогда не найдет
>динамические обстаклы довольно быстрые
А если не 10, а 40 Ползунов? Придется менеджер писать, в котором обязать их региться, и чтобы он каждому рассчитывал путь. Мысль интересная, но не решает вопрос с "всезнанием" пока еще не видимых участков пути.
>обстакл может упираться в границу навмеша например полностью блокируя какой-то проход
По идее, можно на краях bounds брать NavMesh.SamplePosition (к примеру, используя Bounds.ClosestPoint), тем самым проверяя сам факт проходимости.
да думаю и 40 потянет, на самом то деле. и больше. у меня где-то был забавный мини-проект где был навмеш с псевдобесконечным миром для 2д. я двигая мир вокруг игрока брал самплы из перлина и представлял их как динамические обстаклы, надо было убегать от злого шара. пересчитывал каждый фрейм и в общем-то не тормозило ниче особо даже с таким ужасным подходом.
>тем самым проверяя сам факт проходимости.
не ну это вариант конечно, да. хотя интересно можно ли заставить юнити построить альтернативный маршрут, имея в виду что тут не ходим не используя метод выше.
>да думаю и 40 потянет
Как вариант запомню, хотя необходимость постоянно следить за перебираемым массивом в менеджере пути делает меня грустным.
>заставить юнити построить альтернативный маршрут
Path в юньке это массив Vector3. Где [0] это точка начала, а последний элемент - конец пути.
По идее, нужно [1] точку редактить, вводя поправку на bounds задетекченных коллайдеров (вот тут хз как... вектор от Collider.ClosestPointOnBounds до.. до... хз, края bounds?), а потом в появившемся vector3 брать NavMesh.SamplePosition, тем самым гарантированно получая точку навмеша. Если непроходимо обстаклями, то будет толкаться до упора, это да.
А еще можно от до [i+1] рейкастить (как минимум первые 2-3 точки), и вводить поправку вышеуказанным способом, перерассчитывая после этого путь от скорректированной точки и дальше, получая новый path.
Но это первое что в голову пришло, надеюсь адекваты присоединятся к обсасыванию сферического коня в вакууме.
да не, я про другое. картинкой объясню. подход с обходом краев предполагает что препятствие можно обойти. а что если нельзя? юнити же нельзя нормально сказать "исключай эту область из поиска пути", кроме как динамическим обстаклом, или Area, что не рассматривается как вариант.
>подход с обходом краев предполагает что препятствие можно обойти. а что если нельзя
Можно рассчитать [1] скорректированную точку (главный вопрос в том, как ее корректировать. Тут у меня проблемы.). От нее (а не от твоего положения, как при первом проходе) сделать NavMesh.CalculatePath(). Получаем путь, учитывающий и объем агента и обстаклю перед носом.
да по моему никак. надо же чтобы она была ближе к цели чем предполагаемый путь через обстакл. а хуй знает где там продолжение маршрута. юнити же не дает вроде весь граф областей навмеша.
Я не понял тебя.
NavMesh.CalculatePath() от Начала до Конца.
У нас есть Path. Он содержит 4 точки пути (waypoint): [Начало, 1, 2, Конец]
Между [Началом] и [1] обстакля. Корректируем точку [1] относительно обстакли (получаем точку на навмеше, с учетом bounds обстакля).
Рассчитываем путь от [1] до Конца.
Профит.
Что не так?
ну смотри, есть например коридор из двух квадратов. на картинке они черные. если спросить путь до цели у юнити, то он будет синим. но что если синий путь полностью перекрыт красным обстаклом? его не обойти вблизи синего пути. тогда с учетом обстакла правильный путь будет зелёный. но юнити не знает что синий путь не является правильным. чтобы построить зеленый путь надо передвинуть точку номер 2 с синей позиции на зелёную и считать путь от неё (скорей всего). но каким макаром её можно узнать исходя из оранжевых точек которые являются границами обстакла? я не вижу пути.
Понял. Согласен.
Пока единственный работающий механизм - менеджер, включающий\отключающий обстакли и после этого рассчитывающий путь для каждого агента. Учитывая, что обстакли динамические, придется перерассчитывать Путь для каждого (с включением соответствующего обстакля) минимум раз в пол секунды. Потестю, но предвкушаю грусть и печаль.
Больше мне в голову пока идей не приходит...
> включить нужные обстаклы для нужного агента, получить путь, включить обстаклы другого агента и так далее
Не прокатывает. Включаемая обстакля не успевает "прорезать" навмеш.
Ray.collider.GetComponent<NavMeshObstacle>().enabled = true;
NavMesh.CalculateTriangulation();
NavMesh.CalculatePath(SourceHit.position, DstHit.position, NavMesh.AllAreas, Path);
Ray.collider.GetComponent<NavMeshObstacle>().enabled = false;
там под опцией Carve у обстаклов есть опции всякие интересные. и попробуй давать какое-то время в лупе внутри IEnumerator c WaitForSeconds согласно настройкам обстаклов.
Это норма, у меня как-то целый проект распидорасило, что-то тупо выключилось и не работало, пришлось заново пересобирать.
В смысле подходит ГГ к табличке- появляется надпись (через колайдеры что-то не прокатывает). Или идёт по локации и пошёл текст типа истории.
> (через колайдеры что-то не прокатывает)
У меня все прокатывает. Подошел к коллайдеру - заинстансился геймобжект перед камерой, досточка с текстом. Нажал эскейп - досточка дестроится, и можно дальше идти.
void OnCollisionEnter2D(Collision2D coll)
>>260009
У меня сами таблички даже но 10-20 камер появляются через UI. Так что привязку делаю на подобии этого. http://nn-game.ru/assets/всплывающие-диалоги-в-2d-играх
Свой код можешь показать?
Нууу ээээ
Вот врезается игрок в дверь. На двери колайдер-триггер и скрипт:
void OnTriggerEnter(Collider other)
{
if(other.gameObject.tag == "Player")
{
Instantiate(tablichka, transform.position, transform.rotation);
}
}
"Когда триггер-коллайдер соприкоснулся с другим коллайдером, то если у другого коллайдера тег "Игрок", создаем обьект "табличка" в таких-то координатах повернутый в такую-то сторону". Обьект естественно берется из префаба, ну и в префабе скрипт вида "при нажатии Esc - уничтожиться".
добавил,ход не переключается как будто он не понимает какой геймобжеки юзать
Сохрани на него ссылку где-нибудь.
Я понимаю.
Но это значит, что при каждой итерации необходима будет задержка в цикле.
Предположим, задержка в 0.1 сек. Уже при 10 ползунах, это будет 1 секунда.
При 100 это будет 10 секунд, что вообще нереально.
Пока решения проблемы нет. Благодарю за дискач, навмеш-кун, успеха тебе.
Пока в роадмапе под грифом "Альфа" висит возможное решение данной проблемы:
AI: NavMesh workflow and bake API
Workflow: the workflow is now based on components
NavMesh Surface component describes a volume where the navmesh will be build, you can have multiple volumes, in any orientation
NavMesh Portal is a new component which allows to connect two NavMeshes with a wide link
NavMesh Modifier allows to change the area type of the NavMesh which falls inside the volume
NavMesh Markup allows fine grained control of area types per Game Object, replaces static flags
Bake API: everything above is built on top of a simple API which allows you to pass in the geometry that will contribute to the NavMesh building method to quickly collect render or physics geometry
>>260340
да поставь более маленькую задержку, че ты. например выше на том скриншотике с кучей навмеш обстаклов каждый кадр выключал все обстаклы, потом брал обжекты из пулла и включал обратно. там задержка была явно не 0.1 секунды.
вообще по моему опыту скажу - если есть возможность не ебаться с навмешем, лучше городить костыли. если хочется ебатся с ним, то советую почитать http://upcommons.upc.edu/bitstream/handle/2099.1/16508/Ramon Oliva.pdf?sequence=1&isAllowed=y
кстати, стоит добавить что у этого хрена идея вокселизации мне не очень понравилась. из всех методов мне более адекватным показался у rain indie. у A* берутся треугольники меша и растеризуются, а rain indie более хитрожопый - там берутся меши примитивов и подставляются на место коллайдеров соответствующих типов и растеризуются уже они, так что в итоге меш по границам коллайдеров а не мистической хуйни.
кстати одна из причин почему мне не нравится навмеш юнити, он строится по видимой хуйне. в итоге всякие ветки у деревьев которые не имеют колизии добавляются в навмеш как препятствие.
NIET POOTY.
С любой задержкой не работат. Что с большой, что с маленькой. Что с Carve параметрами в 10 что в 0.001.
Выйдет адекватный API - будем ковырять, а пока придется подождать, либо, если совсем уж припрет, стороннее юзать.
>в итоге всякие ветки у деревьев которые не имеют колизии добавляются в навмеш как препятствие
Согласен, бесит. Фиксится выставлением NavigationStatic в false у модели.
Так же как ты и заставил их бежать на тебя.
if (игрок стреляет) стрейф
if (дистанция <= 100) не идти вперед
> не врезаться в стены
A* или NavMesh
Скорее всего. Может кто тут узнает.
Можно, но нахуя? Даже близарт тупо с ассетстора тащит для хертстона либы. Зачем заниматься велосипедостроением и занимать программистов у которых рейт выше чем единоразовая покупка поддерживаемого ассета?
https://www.youtube.com/watch?v=R29OY7KbrlA
>>260402
надо будет самому попробовать костыль такой приделать, интересно стало. кстати там же осенью обещали сделать навмеш не таким полужопинским как сейчас. во всяком случае в их роадмапе был такой пункт. но там довольно мало писали, хотя сказали что сделают выделение зон для навмеша.
>>260579
а не разглядеть название окошка даже. че делает то не знаешь?
>а не разглядеть название окошка даже. че делает то не знаешь?
хз, тетка в очках левел дизайнер.
никак, они выключаются при выключении объекта. можешm делегировать корутину другому объекту, который бы выполнял функцию менеджера.
Многовато обьектов получается, а через InvokeRepeating непонятно как передавать параметры в void.
так ты одному менеджеру делегируй, просто имей в нем колекцию с IEnumerator, где список активных корутин и передавай в корутины что-то что содержит делегат, и например параметр для WaitForSeconds.
корутины же можно держать как параметр и делать например
IEnumerator myIEnumerator = SomeIEnumerator(myAwesomeValue);
myIEnumeratorList.Add(myIEnumerator);
StartCoroutine(myIEnumerator);
и делать это много раз. кстати единственный адекватный известный мне способ применять корутины не в плеймоде это вот так сохранять на них ссылку и каждый раз им говорить myIEnumerator.MoveNext(); в каком-нибудь ГУИ.
Блюпринты, вестимо. В ассет сторе именно таких не нашел, так что наверное самописные.
Спасибо!
Блюпринты уже настолько устойчивый мемас, что нет смысла ебаться с такими длинными и неудобными описаниями. Ноде-базед функционал? Нахуй это говно.
>Один из тысячи визуальных редакторов.
Это понятно, но какой именно? Интересно какие именно штуки используют в больших именитых проектах.
Да скорее всего юскрипт. С моим скрином вся разница только в тёмной\светлой теме. А вообще из визуальщины под юнити навороченней антареса хуй найдёшь, наверное. Но это точно не он.
Большое спасибо! Похоже это оно и есть.
Лично мне похуй, я не участвую в петушиных боях.
PhysicalOverlap не предлагать, оно ебически тяжелое.
Самое очевидное - держи все юниты в листе и чекай между ними дистанцию, когда надо.
Там всего 9 drawcalls и 150-200 треугольников. Vsync отключен.
Простой мониторинг фпс не помогает разобраться - я собирал раз в 0.5 сек, показывает 55-60 фпс. Но лаги-то есть.
Пытался рассмотреть профайлером в редакторе - есть странные спайки в работе GPU, но похоже, что это работа на отрисовку самого профайлера ()если двигать его окошко, то спайки превращаются в постоянную нагрузку, такой же по длительности выполнения).
На что обратить внимание, какой код, может, вычистить?
Скрин профайлера и названия девайсов, на которых тестировал.
Это пиздец убогий.
Прикрутили сетку и поиск 1-9-25-49 c сохранением результатов. Работает примерно в 50 раз быстрее physics overlap. Нужно еще байтоёбством позаниматься, можно еще быстрее.
Чо пиздец то? У тебя все равно есть массив с юнитами, если ты заранее позаботился о том, чтобы назначить им родителя.
Это список. Список пиздец дорогой для обработки. Клетки на порядок дешевле выходят.
Бро, поясни пожалуйста что такое клетки? Сам ньюфаг ебаный, делал поиск через списки.
Алсо, как сделать так чтоб глаза не вытекали от мелкого шрифта и интерфейса ?
Полагаю, он разбил поле на сколько-то квадратов, квадрат хранит в себе списочек находящихся в нём юнитов. Юниты, перемещаясь по полю, отправляют контроллеру квадратиков инфу о смене своего квадрата по необходимости.
В таком случае вместо перебора всех юнитов на мапе ты перебираешь обычно в разы меньше, рассчитывая через нужное расстояние N те квадраты, которые оказываются в пределах этого радиуса, остальные отбрасывая.
> разбил поле на сколько-то квадратов, квадрат хранит в себе списочек находящихся в нём юнитов
Шёл 2016 год, в гд всё ещё не слышали про деревья.
Что ты там деревьями сделаешь, мамкин гений?
>Александр Друзь
>>261094
Не знаю к чему бы это, но попрошу без оскорбительного оттенка, плиз.
Оскорбительный оттенок был бы если бы тебе ответили "тебя блядь ебет вообще, когда выйдет тогда и увидишь".
>Это будет полноценный сервер типа фотона
Какого фотона? Болт? Или клауд? Там много фотонов. Ты про dedicated говоришь?
Все так, это мамкин програмизд порвался.
Подскажите с чего начать ньюфагу?
Не знаю, как мне завести где-то переменную ( любого типа ) так, чтобы она была доступна из всех классов всех объектов всех сцен. Во всех туторах что нашел люди делают ГеймОбжект.файндБайТэг//, но что-то подсказывает мне что так делают только мудаки.//
Объясни детальнее, может быть двухмесяный гуру с# тебе подскажет что-то дельное.
А может и недельное, но подскажет точно.
Вот смотри, допустим я хочу сделать много дверей, которые могут иметь уникальные ключи.
Вот я создаю класс doorLockable, с публичными полями типа айди подходящего ключа, закрыта ли дверь и т.д. и кидаю этот класс на двери в сцене.
Потом создаю класс для ключей например itemKey, с паблик полем айди ключа.
Так вот где же мне сохранить инфу о том какие ключи я взял? Причем так чтобы она была максимально прямо доступна из класса дверей, что-то типо Player.keys[...], без поиска по дереву всех геймобжектов.
Статическая переменная в любом скрипте тебе в помощь. Обращаться как к статической переменной по имени Класса.переменной
так реально делают мудаки
Прикрутить к каждому ключу булевскую "взят ли" и проверять её на тру-фолс у определённого ключа при взаимодействии игрока с определённой дверью. Достаточно связать ключ и дверь, которую он откроет, и искать по всем геймобжектам уже не нужно.
Прикрутить к игроку лист взятых ключей и перебирать его на наличие нужного ключя при взаимодействии с дверью. Проверку прикрутить на дверь, заставить её открываться только если есть определённый ключ. Искать игрока перебором геймобжектов не нужно, просто единожды дать каждой двери ссылку на него.
Менять свойство определённой двери уже при взятии определённого ключа так, чтобы при первом же взаимодействии с игроком она уже была открыта/открывалась без проблем. Опять связываем попарно двери с ключами и никаких поисков не нужно.
Выделить отдельный объект, который будет отслеживать и хранить состояние всех ключей, а при взаимодействии передавать их нужной двери. Тут тоже связываем нужные двери и ключи и... ну ты понял
Других мест для хранения данных наверно и нет. Один из трёх участников взаимодействия или сторонний объект.
А вот другие способы передачи данных о подобранности скорее всего есть, но я, очевидно, о них ещё не знаю.
Кстати, опытные аноны, какое из этих четырёх мест хранения будет эффективнее и почему?
Надо просто писать нормальный код, а не то говно в которое так легко скатиться с Юнити. Ключи - состояние персонажа, у него и проверяй.
Google: Dependency Injection.
короче дефолтный чарконтроллер ставлю, всё как обычно, вроде всё работает но там какая-то вообще одичалая задержка ввода
сцена сама пустая, пол и чарконтроллер
смотрю инпут сеттингс, там какое-то значение gravity, у всех инпутов 1000, у горизонтал/вертикал 3
заменил на косарь, задержка пропала
собственно вопрос, что это за хуйня была, не аукнется ли мне через время, зочем сломали то что раньше нарм работало
не мог проебаться, потому что школоперетащил чарконтроллер на сцену
Чтоб можно получать было доступ вот так, object.dimensional = 42, или так нельзя?
Например, у меня есть стандартная мартышка из блендера голова мартышки из 3 полигонов, стадартная моделька в блендере, так вот, я ее хочу разрезать пополам в рилтайм. Существует ли способ автоматически разделить ее на две половинки, дорисовать поверхности в месте разреза и затекстурировать их? Или нужно будет в блендере рисовать мартышку из двух половинок, которая будет распадаться по команде?
Хранить все взятые ключи в List. При открытии проверять есть ли в этом List ключ. Все.
Код такой:
RotationX += Input.GetAxis("Mouse X") RotationSpeed Time.deltaTime;
RotationY += Input.GetAxis("Mouse Y") RotationSpeed Time.deltaTime;
Transform.rotation = Quaternion.Euler(-RotationY, RotationX, Yaw);
В итоге поворот совершенно ебанутый. Если, к примеру, объект перевернуть, то вместо поворота вправо он повернет влево и подобное.
Нагуглить не смог, даже запрос хз как сформировать.
Подскажете дебилу, как решить эту проблему?
Мне нужно будет все параметры прописывать вручную в коде? Размеры, расположение подключать к скролбару, добавлять в контент сайз фильтр, добавлять как лейаут элемент, подключить к он клику нужную функцию. Сложно но раз других вариантов нету прийдеться так и сделать.
Что плохого в этом? если переменная требуется в нескольких скриптах? А если объекты создаются во время игры, на кой хуй каждому созданному объекту тянуть компонент,м ? Не, я действительно не понимаю почему способ мудаковский, тк С# осваиваю недавно.
Может есть способы обхода?
Не хочу говнокодить кучу блоков if() в методе Update() для того, что бы вызывать свой метод, в котором используется Transform.Translate (тогда типа мой метод находится в области видимости метода Update()).
Потому что ты создаёшь неуправляемое спешить. После десятка таких переменных ты будешь все время тратить на поиск почему все опять сломалось и на лютые хаки. Используй человеческий код с интерфейсами, вставкой зависимостей и всем таким. В Юнити слишком легко натворить говен особенно по нубству.
Мне нужно плавное перемещение. Transform.Translate не позволяет этого сделать, т.е. на время перемещения моего объекта юнити зависает.
С Vector3.Lerp я пока что немного обосрался и не понял, как сделать.
Поэтому если у кого есть идеи, как это сделать - буду благодарен.
Пытался, но виснет и затем мгновенно перемещает либо просто мгновенно перемещает.
Плавное перемещение это первый урок в Юнити после запуска. Как это можно запороть имея хотя бы школьный уровень математики я не представляю. Wait, oh shi...
Все через Update используют, идиёт, ёпта. А мне этот метод нахрен не всрался и я хочу его обойти.
А никак его не обойти. Максимум что можно сделать - это менеджер который будет в своём Update двигать другие объекты.
Кто-нибудь может мне объяснить, что этот болезный хочет? Я вот нихуя не понял.
А, понял. О корутинах он не слышал.
Как сделать так, чтоб в условии было время, короче когда цикл запускается, то например секунду пока он выполняется будет тру возвращать в условие, а потом фолс.
Двачну, тоже интересно как с временем работать.
Копай в сторону Grid Layout Group. На Youtube вся инфа есть. Также ищи инфу по компоненту "Mask", что сделать прокручиваемый список.
Спасибо за совет, но эту проблему я решил уже.
По сути, всё так же и осталось.
На какие камни я мог наебнуться?
У тебя лежит в списке ссылка на объект. Поскольку объект удален, ссылка теперь равна null. Use OnDestroy и удаляй ссылку на объект "руками".
мимоПРОбыдло
Я не удаляю сам объект(из сцены). Я удаляю его из arraylist, т.е. удаляю ссылку на него методом Remove. Но почему-то не выходит.
За сам говнокод по шапке чур не бить. Не рефакторил ещё.
Посмотри на Rust.
запускай в старте
Запускай в одном из стартовых методов или заимей флаг, который будет обозначать запущенна корутина или нет.
Ну и естественно нужно добавить прерывание в цикле, чтобы он отрабатывал каждый кадр, а не за раз.
break;
Ну типа
bool end = false;
float time = 1.0f;
while (time >= 0.0f){
time -= Time.deltaTime;
If (time <= 0.0f) {end = true};
break;
}
if(end) blablabla
Учусь вместе с вами.
bool m_TurboFuck = false;
void Start()
{ StartCoroutine(SISKI());}
IEnumerator SISKI()
{
m_TurboFuck = true;
yield new WaitForSeconds(1);
m_TuboFuck = false;
}
мимоПРОбыдло
Нашел сам. Вставил StopAllCoroutines().
Теперь, как я понимаю, все корутины, запущенные после первой будут остановлены. Только я пока не знаю, будет ли это большой нагрузкой.
Объясни где в переводе Stop All Coroutines на русский сказано про "корутины, запущенные после первой".
Тебе булевый флаг нужен. А еще лучше - проектировать логику так, чтобы одноразовый код не запускать ил апдейта.
Базара ноль, можно сделать и на if-ах, можно и корутинои.
Но человек попросил показать с while.
Ну вот в апдейте стартуют все корутины каждый фрейм. Я в самой корутине вписал Stop All Coroutines. Получается, что когда самая первая срабатывает, то все остальные прерываются. Такие дела.
Зачем их все запускать, чтобы потом останавливать, если можно в том же апдейте их запускать только когда нужно?
Я не могу так. Вроде гуглил ка через булевскую переменную останавливать, но что-то не получается.
>>261717
А то.
void Update() {
if (true) {
StartCoRoutine();
true = !true;
}
}
IEnumerator(StartCoRoutine) {
yield return;
}
if(KeyPressed.Space or KeyPressed.Enter) { some code }
Все бы хорошо, но а что если мне хочется узнать, какое именно условие сработало? Нажал ли я пробел или нажал энтер? Могу ли я узнать, на что именно среагировало условие?
Грусть печаль - это когда нельзя в стандартном редакторе кнопок навесить скрипт с несколькими параметрами в перегрузке.
Пользуйся switch case.
>>261728
Используй несколько блоков if либо используй else if.
Ну да, это ясно. Просто думал, может, возможно как-то сократить. Но все равно спасибо
switch (KeyPressed) {
case Space:
some code;
print("Space");
break;
case Enter:
some code;
print("Enter");
break;
}
Ага, про корутины знал,но еба, почему нельзя придумать переменную, при первом обращении к которой возвращает тру и еще n времени тру ,а потом всегда фолс, например /
Ты про события сейчас?
Почему-то за вечер всё сделать не получается.
Тут так то из адекватов только МимоПРОбыдло да НавмешКун. Даже я ебанутый.
Это копия, сохраненная 7 июля 2016 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.