Дело вот в чем, не могу понять почему некоторые вещи не работают так как должны.
есть 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.
Я в подобных случаях тикаю таймером пока нужный реф не станет валидным и потом делаю то что хочу, ставить дилеи это плохая практика
Зачем таймер ?
Разве нельзя в конструкторе задать логику спавна ?
batarihliy
чем плох delay? не делать же таймер на 1кадр.
endeavour_pr
> Разве нельзя в конструкторе задать логику спавна ?
что есть конструктор?
Если много компонент и всякого такого, то иногда бывает что далеко не всё одновременно загружено, поэтому почти всегда надо ставить isValid проверки, а если что-то должно разово сработать после того как что-то другое должно стать доступным то тут только регулярные проверки.
Дилей в секунду у тебя сейчас сработал, а у кого-то не сработает, представь лицо того кто потом будет искать причину этого бага (то есть своё). Можно конечно делать дилеи больше, например по минуте, но это тоже так себе решение.
Он пишет про ConstructionScript, все акторы имеют такой, там происходит логика в момент спавна, ещё до бегиплея.
batarihliy
> isValid проверки
Вместо делея можно сделать что бы объект сам по готовности сообщал спавнеру что он готов и что с ним можно делать всякую фигню.
Можно тупо создать в спавнере пустую переменную и валидировать её до тех пор пока отспавленый объект не передаст сам ссылку на себя в эту переменную, либо перенести часть логики в этот объект спавна и дёргать оттуда другие части логики в спавнере ссылка на который уже будет сразу.
Не помню только можно ли валидировать пустую переменную являющуюся ссылкой объекта класса )) но можно её и после спавна заполнить тем что на выходе спавна, хотя если чекать её постоянно с некоторой периодичностью(каждый кадр или каждый n кадр или по таймеру), то наверное даже и перезаписывать ничего не надо и цикл будет надёжней делея, ведь он будет работать до тех пор пока не валидирует.
batarihliy
> Дилей в секунду
1кадр.
batarihliy
> ConstructionScript
в нем также не все работает , например CustopPrimitiveData.
перенес логику в персонажа, работает без скипа, такое впечатление будто комопнент стартует раньше персонажа которому он принадлежит.
Да, мне кажется что проверка таймером надёжнее всего. Либо ещё вариант через ивент диспатчер, но я честно говоря редко им пользуюсь, в основном гоняю данные и ивенты через интерфейсы.
Дилей в кадр ещё хуже, производительность даже на одной и той же машине может варьироваться. И если часто использовать такой метод валидации то потом будут большие проблемы.
О вреде дилейев
https://www.youtube.com/watch?v=Xq_0EwmKj2w
Да в констракшн скрипте есть ограничения, там также нельзя спавнить например
Тема в архиве.