Unreal EngineФорумBlueprints

Не могу понять в чем проблема при выполнении функции .

#0
4:57, 9 мая 2024

Дело вот в чем, не могу понять почему некоторые вещи не работают так как должны.

есть actor, у него есть компоненты equipment и invenory, в invenory на beginPlay  спавню итем и добавляю его персонажу в слот, получаю ошибку actor=none, это персонаж на котором этот invenory компонент висит, как он может быть none?, itemClass=none...ставлю поинты, проверяю по шагам,
actor=valid, equipment и invenory=valid, itemClass=valid.
но по итогу выполнения функции ничего не добавляется, и ошибки  access none.
добавляю перед выполнением  функций delay в 1 кадр, все работает.
почему так ? по шагам все данные valid а по факту выполнения  access none, если не добавить delay.

сначала  грузится actor, потом его компоненты и выполняется beginplay компонентов, так ? или я что то не понимаю.
или проблема в макросах? часть логики в них.
с макросами была у меня проблема только с интерфейсами, если в макросе есть интерфейс функция она всегда none возвращала,  было это еще на 5.0.

#1
13:23, 9 мая 2024

Я в подобных случаях тикаю таймером пока нужный реф не станет валидным и потом делаю то что хочу, ставить дилеи это плохая практика

#2
14:49, 9 мая 2024

Зачем таймер ?
Разве нельзя в конструкторе задать логику спавна ?

#3
15:26, 9 мая 2024

batarihliy
чем плох delay? не делать же таймер на 1кадр.
endeavour_pr
> Разве нельзя в конструкторе задать логику спавна ?
что есть конструктор?

#4
15:59, 9 мая 2024

Если много компонент и всякого такого, то иногда бывает что далеко не всё одновременно загружено, поэтому почти всегда надо ставить isValid проверки, а если что-то должно разово сработать после того как что-то другое должно стать доступным то тут только регулярные проверки.

Дилей в секунду у тебя сейчас сработал, а у кого-то не сработает, представь лицо того кто потом будет искать причину этого бага (то есть своё). Можно конечно делать дилеи больше, например по минуте, но это тоже так себе решение.

Он пишет про ConstructionScript, все акторы имеют такой, там происходит логика в момент спавна, ещё до бегиплея.

#5
19:26, 9 мая 2024

batarihliy
> isValid проверки
Вместо делея можно сделать что бы объект сам по готовности сообщал спавнеру что он готов и что  с ним можно делать всякую фигню.

Можно тупо создать в спавнере пустую переменную и валидировать её до тех пор пока отспавленый объект не передаст сам ссылку на себя в эту переменную, либо перенести часть логики в этот объект спавна и дёргать оттуда другие части логики в спавнере ссылка на который уже будет сразу.
Не помню только можно ли валидировать пустую переменную являющуюся ссылкой объекта класса )) но можно её и после спавна заполнить тем что на выходе спавна, хотя если чекать её постоянно с некоторой периодичностью(каждый кадр или каждый n кадр или по таймеру), то наверное даже и перезаписывать ничего не надо и цикл будет надёжней делея, ведь он будет работать до тех пор пока не валидирует.

#6
21:24, 9 мая 2024

batarihliy
> Дилей в секунду
1кадр.
batarihliy
> ConstructionScript
в нем также не все работает , например CustopPrimitiveData.

перенес логику в персонажа, работает без скипа,  такое впечатление будто комопнент стартует раньше персонажа которому он принадлежит.

#7
22:52, 9 мая 2024

Да, мне кажется что проверка таймером надёжнее всего. Либо ещё вариант через ивент диспатчер, но я честно говоря редко им пользуюсь, в основном гоняю данные и ивенты через интерфейсы.

Дилей в кадр ещё хуже, производительность даже на одной и той же машине может варьироваться. И если часто использовать такой метод валидации то потом будут большие проблемы.

О вреде дилейев
https://www.youtube.com/watch?v=Xq_0EwmKj2w

Да в констракшн скрипте есть ограничения, там также нельзя спавнить например

Unreal EngineФорумBlueprints

Тема в архиве.