Unreal Engine 4 http://uengine.ru/forum/ |
|
Создание UObject через AActor::OnConstruction http://uengine.ru/forum/viewtopic.php?f=19&t=12380 |
Страница 1 из 1 |
Автор: | RepkaGaming [ 01 дек 2017, 07:14 ] |
Заголовок сообщения: | Создание UObject через AActor::OnConstruction |
Здравствуйте, я новичек в си и в УЕ и у меня мозг уже закипает не могу понять одной вещи, есть у меня U класс который наследуется от UObject, класс этот используется для создания предметов которые можно хранить в инвентаре и так же выбрасывать в игровой мир, поэтому для отображения этого объекта в мире я использую другой класс наследуемый от AActor. В А классе есть 2 переменные с uproperty макроссом Код: UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Item Class") TSubclassOf<UItem> ItemClass; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Item Reference") UItem* ItemReference; ItemClass используется для создания предмета из класса, потому что когда объект уже имеется я использую свою spawn функцию с сылкой на него, в противном же случае я использую акторовский констракт, Код: void AItemActor::OnConstruction(const FTransform& Transform) { if (ItemClass) { ItemReference = NewObject<UItem>(this, ItemClass); MeshComponent->SetStaticMesh(ItemReference->GetStaticMesh()); } } и работает все классно, когда я меняю в блюпринте класс предмета, он как указанно выше сразу меняет меш на тот который указан в выбранном классе предмета, а когда я меняю класс на другой соответственно меш меняется и получается что каждый раз когда я меняю значение ItemClass в блюпринте OnConstruction срабатывает снова и снова и меня не покидает мысль что каждый раз когда я меняю класс, создается новый объект, ссылка в ItemReferrence просто обновляется и там где-то зависает куча объектов без ссылок. Так ли это? Как вообще работает OnConstruction и что происходит с объектами на которые ничто не указывает? И еще для чего при создании моего U объекта через NewObject мне нужно указывать на актор через который я его создал? Что вообще такое Outer в NewObject и для чего он нужен? |
Автор: | Snake [ 01 дек 2017, 14:45 ] |
Заголовок сообщения: | |
Цитата: OnConstruction срабатывает снова и снова и меня не покидает мысль что каждый раз когда я меняю класс, создается новый объект, ссылка в ItemReferrence просто обновляется и там где-то зависает куча объектов без ссылок. да Цитата: и что происходит с объектами на которые ничто не указывает? их потом должен мусорщик затереть... outer - что-то вроде- уже существующий владелец-представитель уобжекта. (может кто-то грамотней напишет) |
Автор: | RepkaGaming [ 02 дек 2017, 05:52 ] |
Заголовок сообщения: | Re: |
А еще вот вопросик по поводу этого мусорщика, я такой эксперемент провел, сделал ссылку на актор и потом вызвал Destroy() после чего деббагером выводил GetName() по этой ссылке и у меня продолжало выводить имя объекта, это как работает? пока я сам nullptr на эту ссылку не назначил это не прекращалось, это потому что у меня активная ссылка была он не подтерся? |
Автор: | Snake [ 02 дек 2017, 09:12 ] |
Заголовок сообщения: | |
"Actor'ы обычно не собираются сборщиком мусора. Вы должны вручную вызывать метод Destroy, после порождения Actor'а. Удаление произойдет не сразу, а только в течении следующей фазы сборки мусора."(C) Destroy - помечает помечает актора для мусорщика и убирает его из мира. А мусорщик потом затирает память. IsPendingKill() проверка на метку для мусорщика, true - если объект помечен для уничтожения. |
Автор: | RepkaGaming [ 02 дек 2017, 16:58 ] |
Заголовок сообщения: | Re: |
Snake писал(а): "Actor'ы обычно не собираются сборщиком мусора. Вы должны вручную вызывать метод Destroy, после порождения Actor'а. Удаление произойдет не сразу, а только в течении следующей фазы сборки мусора."(C) Destroy - помечает помечает актора для мусорщика и убирает его из мира. А мусорщик потом затирает память. IsPendingKill() проверка на метку для мусорщика, true - если объект помечен для уничтожения. Спасибо, теперь стало понятно. |
Автор: | RepkaGaming [ 03 дек 2017, 05:39 ] |
Заголовок сообщения: | |
Кстати на всякий случай по поводу спаун функции, если у кого то возникнут проблемы с созданием таких объектов через си, там надо не обычным Spawn создавать их , а через SpawnActorDeferred, как я понял позволяет задавать параметры до иницилизации объекта через функции класса. А то у меня скажем там все на референсе объекта завязанно, а если создан не через блюпринт и класс не указан, получается что движок крашит. Я пару часов не мог понять из за чего краш и вот в я в итоге сделал сэттер для переменной с референсом на объект и прогнал его до завершения спауна. Код: AItemActor* ItemActor = GetWorld()->SpawnActorDeferred<AItemActor>(AItemActor::StaticClass(), FTransform(FRotator(0.f, 0.f, 0.f), FVector(Hit.Location.X, Hit.Location.Y, Hit.Location.Z + 5.f)));
ItemActor->SetItemReference(DragItemReference); ItemActor->FinishSpawning(FTransform(FRotator(0.f, 0.f, 0.f), FVector(Hit.Location.X, Hit.Location.Y, Hit.Location.Z + 5.f))); |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |