Полезное

Мы Вконтакте

Discord канал

#
Аватара пользователя
Пользователь
Сообщения: 27
Здравствуйте, я новичек в си и в УЕ и у меня мозг уже закипает не могу понять одной вещи, есть у меня 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 и для чего он нужен?
Аватара пользователя
Пользователь
Сообщения: 2319
Цитата:
OnConstruction срабатывает снова и снова и меня не покидает мысль что каждый раз когда я меняю класс, создается новый объект, ссылка в ItemReferrence просто обновляется и там где-то зависает куча объектов без ссылок.

да

Цитата:
и что происходит с объектами на которые ничто не указывает?

их потом должен мусорщик затереть...

outer - что-то вроде- уже существующий владелец-представитель уобжекта. (может кто-то грамотней напишет)
_________________
we need to go deeper
Аватара пользователя
Пользователь
Сообщения: 27
А еще вот вопросик по поводу этого мусорщика, я такой эксперемент провел, сделал ссылку на актор и потом вызвал Destroy()
после чего деббагером выводил GetName() по этой ссылке и у меня продолжало выводить имя объекта, это как работает? пока я сам nullptr на эту ссылку не назначил это не прекращалось, это потому что у меня активная ссылка была он не подтерся?
Аватара пользователя
Пользователь
Сообщения: 2319
"Actor'ы обычно не собираются сборщиком мусора. Вы должны вручную вызывать метод Destroy, после порождения Actor'а. Удаление произойдет не сразу, а только в течении следующей фазы сборки мусора."(C)

Destroy - помечает помечает актора для мусорщика и убирает его из мира. А мусорщик потом затирает память.
IsPendingKill() проверка на метку для мусорщика, true - если объект помечен для уничтожения.
_________________
we need to go deeper
Аватара пользователя
Пользователь
Сообщения: 27
Snake писал(а):
"Actor'ы обычно не собираются сборщиком мусора. Вы должны вручную вызывать метод Destroy, после порождения Actor'а. Удаление произойдет не сразу, а только в течении следующей фазы сборки мусора."(C)

Destroy - помечает помечает актора для мусорщика и убирает его из мира. А мусорщик потом затирает память.
IsPendingKill() проверка на метку для мусорщика, true - если объект помечен для уничтожения.


Спасибо, теперь стало понятно.
Аватара пользователя
Пользователь
Сообщения: 27
Кстати на всякий случай по поводу спаун функции, если у кого то возникнут проблемы с созданием таких объектов через си, там надо не обычным 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)));


Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9

UEngine.ru © 2017
Все права защищены. При копировании материалов с сайта, ссылка на первоисточник обязательна.
Яндекс.Метрика
Главная страница