Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Unity (проблемы, решения, перспективы) (83 стр)

Unity (проблемы, решения, перспективы) (83 стр)

Поделиться

Страницы: 1 2 3 4 ... 42 ... 82 83 84 Следующая

HomeshipПостоялецwww26 окт. 201710:00#1230
WISHMASTER35
Ну я так и сижу на 2017.1.0f3.
Переставил всю систему, прочистил проект от всех генерируемых при компиляции файлов, пересобрал заново. Пока что - полет нормальный. Яве отключил автообновление.))

Собственно с вопроса прошло полтора месяца.)))

WISHMASTER35Участникwww29 окт. 20171:08#1231
WISHMASTER35
> > [assembly:InternalsVisibleTo("xxx.dll.dll")]
> > [assembly:InternalsVisibleTo("xxx.dll")]
> А это хорошая идея)

И этот костыль перестал работать)) Чертовщина какая-то. Делаю баг репорт.

Ответили:

This issue is on Microsofts' end, with the Visual Studio Tools for Unity, but the fix should be released soon.
The actual issue was that VSTU generated the name with “.dll” for a file that should not contain the extension.

Странно, что не юнити занимаются своим плагином. В Microsoft видимо не много времени уделяют на него, если "soon" у них такой долгий.

Правка: 8 ноя. 2017 15:38

HomeshipПостоялецwww8 ноя. 201713:10#1232
Последнее время в Юньке дофига "чертовщины".

Например давно борюсь с таким явлением:
Есть некая анимация. Для управления воспроизведением (и для синхронизации параллельными действиями) использую события:
события в анимации | Unity (проблемы, решения, перспективы)

Выделенное (на скриншоте) событие, призвано обозначить окончание воспроизводимой анимации (привязанной к стейту Animator'а). Причем оно не просто так на 94%. Потому что событие на 100% анимации - тупо не ловится (точнее не создается события). Несмотря на вот такие настройки transition:
Настройки перехода | Unity (проблемы, решения, перспективы)

Так вот сегодня перестало ловиться и событие на 94х процентах. Сам аниматор показывает что анимацию (для текущего стейта) воспроизвел полностью.
В итоге - не ловится завершение анимации и не происходит синхронизация. Два события раньше по анимации - ловятся стабильно.
Такая беда только у меня встречается?

Причем вчера все работало.
Что там у Юньки переклинило - ХБЗ. Вообще новая система анимации Mechanim - еще тот гемор. Живет своей жизнью, работает то так то эдак. Я до сих пор до конца не понимаю закономерностей ее логики.

WISHMASTER35Участникwww8 ноя. 201716:21#1233
В C# есть маленькая, но неприятная проблема.
List<int> list = null;
Func<List<int>, int>( list );

public static T Func<T, T1>(T list) where T : IList<T1> {
   return list;
}

Тип дженериков не может быть выведен компилятором. Приходится вручную указывать. Особенно это приятно, когда дженериков больше, а имена длиннее.

alexzzzzПостоялецwww8 ноя. 201716:38#1234
В объявлении метода Func параметр типа T1 лишний. Он требуется, но нигде не используется. При вызове метода Func(list) компилятору C# неоткуда вывести его значение.

Без него автоматический вывод типов работает:

static void Main()
{
  var list = new List<int> { 1, 2, 3 };
  var result = Foo(list);
}

static T Foo<T>(T list) => list;

или так:

static IList<T> Foo<T>(IList<T> list) => list;

Вот эта вот часть

where T1 : IList<T2>
- это ограничение. Сначала компилятор должен откуда-то вывести сами эти типы T1 и T2, а потом определить, удовлетворяют ли они этому ограничению. А получилось, что ограничение есть, один из типов выводится автоматически, а второй вывести неоткуда, поэтому приходилось указывать вручную.

Правка: 8 ноя. 2017 17:06

WISHMASTER35Участникwww8 ноя. 201720:18#1235
alexzzzz
Я делаю методы расширения для удобного fluent interface. Но эта проблема с выводом типов дженериков как палка в колесо.
Да, T1 в параметрах не используется и не может быть выведен. Но теоретически компилятор мог бы понимать, что T1 эти дженерик list-а и его можно вывести из первого параметра.
Или лучше были бы специальные конструкции для иерархических дженериков.
wonderwooНовичокwww9 ноя. 20178:39#1236
Играюсь в Юнити неделю, напрягает тормозной интерфейс, нету в нем отзывчивости как в том же Блендере, при нажатии на любую кнопку микро-подтупливание, думаю это из-за легаси технологий на котором он написан. И второе - при запуске игры из редактора - кнопка play, игра рендерится из в том же процессе что и редактор, в другом процессе/потоке запускать видимо не сообразили, и получается если нахимичить в коде скриптов, и игра повиснет, то виснет и весь редактор. И это в 2017-ом. Бред.
i54570, 8gb ddr3, ssd, gtx760 2gb. То-есть проблема не в железе.
HomeshipПостоялецwww9 ноя. 20179:00#1237
wonderwoo
> и получается если нахимичить в коде скриптов, и игра повиснет, то виснет и весь
> редактор

Да, есть у Юньки такая "дыра" - если зациклить код, то все - только через диспетчер задач. ((( И это меня тоже обескураживает.

Так что - по аниматору? Кто-нить сталкивался с обработкой событий в анимациях?

За последние пару дней перестало работать несколько давно отлаженных кусков кода. О_о

Например (внутри coroutine):

while (PhaseIndex < Phases.Count - 1 && _isActive)
        {
            yield return new WaitForEndOfFrame();
        }

изменение значения _isActive - не прерывает цикл. Пару дней назад все было - ок. Классу в котором перестал работать цикл - уже несколько месяцев. И он работал как часы.
Это конечно паранойя, но я начинаю подозревать - а не обновляет ли Юнька какие-то свои модули "втихаря" - чтобы сподвигать на закачку своей последней версии такими вот глюками? Я уже дважды обновлял версию Юнити за последние полгода из-за подобной чертовщины.

И так смотрю, "странности" не только у меня: найденные "костыли", внезапно перестают работать и т.д.

Правка: 9 ноя. 2017 10:05

KumoKairoПостоялецwww9 ноя. 20179:15#1238
Кто-нить сталкивался с обработкой событий в анимациях?

События в аниматоре это жопа. В каком-то случае я помню вообще пришлось от них отказаться (когда события при окончании клипа или близко к окончанию) и запускать просто кастомный таймер на заранее известное время (сколько займёт проигрывание всей анимации стейта), после чего вызывать "ивент" вручную
HomeshipПостоялецwww9 ноя. 201710:10#1239
KumoKairo
> отказаться (когда события при окончании клипа или близко к окончанию)
Вот я про них-то и пишу - проблема с ними, не вызываются они.

KumoKairo
> кастомный таймер на заранее известное время
А вот тут беда - у меня класс-обработчик работает с разными анимациями. А получить нормально длительность анимации из аниматора мне как-то ни разу не удалось.
Также накладывается то что WaitForSeconds вообще перестала работать - на ней код тупо останавливается и дальше не выполняется. Хорошо что это в coroutine - поэтому приложение не виснет.

Вообще началась свистопляска с coroutine и различными yield инструкциями ( WaitForSeconds, WaitForFixedUpdate, WaitForEndOfFrame) - они изменили свое поведение. Причем на совершенно нерабочее - доходя до них код дальше не выполняется.

UPD:
Сейчас проверил свой кусок кода:

while (PhaseIndex < Phases.Count - 1 && _isActive)
        {
            Debug.Log("Next Frame waiting");
            yield return new WaitForEndOfFrame();
        }
  if (CameraNode && kc)
            kc.IsKinematic.Value = false;
        _anim.enabled = false;

В логе появилась ОДНА запись Next Frame waiting. И все. Точка останова на if (CameraNode && kc) - не сработала.

Т.е. coroutine просто прервала свое исполнение на инструкции yield return new WaitForEndOfFrame();
Вот что за ?

Правка: 9 ноя. 2017 10:18

KumoKairoПостоялецwww9 ноя. 201710:36#1240
Во-первых, позанудствую и скажу что вы похоже неправильно юзаете WaitForEndOfFrame. Скорее всего вам нужно подождать один кадр, а не дождаться окончания текущего. WaitForEndOfFrame обычно используется для кастомного рендеринга какого-то глобального оверлея, который рисуется и поверх стандартного оверлейного канваса, или для граба скриншотов (https://docs.unity3d.com/ScriptReference/WaitForEndOfFrame.html) см. момент вызова WaitForEndOfFrame https://docs.unity3d.com/Manual/ExecutionOrder.html. Но в вашем случае, на первый взгляд, ничего связанного с рендерингом нет.

Во-вторых, в таких случаях с проверкой доп условий есть вероятность получить ситуацию когда условие просто не выполняется (одно из описанных в if), и выглядит это как баг обёрточного кода.
Могу посоветовать:
вместо yield return new WaitForEndOfFrame использовать yield return null; - это пропустит один кадр (чего собственно вы скорее всего и пытаетесь добиться)
вывести debug.log после скобок while без всяких дополнительных условий

В-третьих, не корутинами едиными. Есть масса вариантов запуска своих таймеров даже через обычный UpdateLoop (в нашем случае с использованием ECS компоненты-таймеры работают именно так)

Правка: 9 ноя. 2017 10:38

HomeshipПостоялецwww9 ноя. 201711:06#1241
KumoKairo
> позанудствую и скажу что вы похоже неправильно юзаете WaitForEndOfFrame.

Ну я в свою очередь позанудствую и скажу что вы неправильно читаете код, и неправильно используете телепатор.

KumoKairo
> нужно подождать один кадр

Мне нужно подождать НЕСКОЛЬКО кадров - покуда выполняется условие в while. Затем - продолжить выполнение coroutine.

KumoKairo
> когда условие просто не выполняется (одно из описанных в if)

Причем тут вообще условие в if? Дотуда просто не доходит исполнение - в этом и проблема.
По вышеприведенным данным, следует что:
1) В цикл входит (пишет в лог)
2) цикл выполняется ОДИН раз
3) Из цикла не выходит - breakpoint сразу после цикла не срабатывает.

Вопрос - куда пошло выполнение ? Тут даже не в условиях суть. Что происходит с выполнением кода?

KumoKairo
> вместо yield return new WaitForEndOfFrame использовать yield return null

Результат точно такой же - выполнение coroutine прерывается по непонятной причине.

Правка: 9 ноя. 2017 11:16

KumoKairoПостоялецwww9 ноя. 201711:18#1242
Можете скинуть мини пример проекта с воспроизводимым случаем, который вы описали?
Что происходит с выполнением кода?

Скинете пример и разберёмся, эти вещи очень хорошо дебажатся
HomeshipПостоялецwww9 ноя. 201711:38#1243
UPD:

Я самостоятельно разобрался в чем дело. Правда так и не понял почему оно работало еще пару дней назад (а в коде ничего не менялось).

Я инициирую запуск coroutine из coroutine другого класса.

1. Если вызов оформить вот так:

yield return StartCoroutine(WinEffect.Process());

То возникают проблемы со всеми yield-инструкциями ВНУТРИ запускаемой coroutine WinEffect.Process()

2. если вызов сделать через public-метод (который сам выполняет StartCoroutine(WinEffect.Process()):

WinEffect.StartEffect();

то все yield-инструкции внутри WinEffect.Process() работают, но конечно тогда нет синхронизации coroutine обоих классов.

Правка: 9 ноя. 2017 11:39

HomeshipПостоялецwww9 ноя. 201711:41#1244
KumoKairo
> Можете скинуть мини пример проекта с воспроизводимым случаем

Нет не могу.  Там завязано на анимациях, событиях в анимациях и  т.д. Т.е. мне тупо надо скидывать еще и префабы с моделями, анимациями, настройками.
А учитывая что это все - внутри отдельного подгружаемого уровня... и завязано на его логику...
Собственно вся свистопляска - вокруг эффекта завершения уровня, срабатывающего по решению головоломки, с анимацией объектов, наложенными поверх нее - эффектами из партиклов, выводом UI и т.д.

KumoKairo
> эти вещи очень хорошо дебажатся

"Эти" вещи отвратительно дебажатся. Внутри coroutine видны только локальные переменные, остальные Visual Studio почему-то не видит вообще.

Правка: 9 ноя. 2017 11:44

Страницы: 1 2 3 4 ... 42 ... 82 83 84 Следующая

/ Форум / Программирование игр / Общее

2001—2017 © GameDev.ru — Разработка игр