Войти
Unreal EngineФорумBlueprints

Как взять все объекты в классе (в проекте, не на сцене)

#0
(Правка: 9:27) 9:25, 5 дек. 2020

Собственно, нигде не нашёл, как сделать Get all actor of class для всех экторов в проекте. Сама нода берёт все экторы на сцене, а ещё не добавленные из проекта игнорирует. Это нормально, но я хотел бы просмотреть все экторы класса в принципе. Не хотелось бы оставшиеся помещать на сцену в укромное местечко или обращаться к каждому эктору в отдельности. Всем спасибо.

#1
9:30, 5 дек. 2020

Если они не на сцене, то... где они? Откуда их брать то?

#2
(Правка: 10:02) 9:58, 5 дек. 2020

Spawn Actor?
Только ты и знаешь где они есть, какие они есть.
Если это C++, то пока ты не сделаешь #include, класс в котором ты хочешь обратиться к другому классу о нём ничего не знает.

Ну или задачу ты поставил не верно. Напиши что ты хочешь сделать, я напишу как этого можно добиться.
С какой целью тебе о них знать? Заспавнить? тогда ответ дал.

#3
(Правка: 10:19) 10:10, 5 дек. 2020

Salamandr
> Только ты и знаешь где они есть, какие они есть.
Не верно. UE знает обо всех прототипах акторов, за счет CDO.

#4
11:09, 5 дек. 2020

papa_Lev
Наверно тебе нужен Asset Manager.
https://answers.unrealengine.com/questions/595580/what-is-the-ass… -manager.html

#5
11:48, 5 дек. 2020

Спасибо всем за ответы.
Вот я создаю родительский эктор, и остальные экторы как child. Это мой инвентарь. Часть его не находится на сцене, а спавнится в процессе. А часть, наоборот, удаляется вообще. Реализуя загрузку-сохранение, я могу, например, сохранить все объекты на сцене через get all actor of class и сравнить с начальной сценой. Но как быть с экторами, которые ещё не заспавнились? Они все находятся в папке с игрой, и всем присвоен родительский класс. А get all actor of class возьмёт только тех, кто на сцене.
Решение, конечно, есть ещё в первом посте, но вообще хотелось бы просто взять список всех дочерних экторов.

#6
12:00, 5 дек. 2020

papa_Lev
Ну вроде бы самое простое это создать в родителе список этих сабклассов как Uproperty TArray
И сделать такое:

for(TObjectIterator<UClass> It; It; ++It)
 {
     if(It->IsChildOf(USomeAwesomeClass::StaticClass()) && !It->HasAnyClassFlags(CLASS_Abstract))
     {
         Subclasses.Add(*It);
     }
 }
#7
13:22, 5 дек. 2020

i4ugui
Спасибо, но это надо мешать C++ с блупринтами, а у меня проект только на блупринтах. Я ещё раз повторюсь, способы есть, просто вдруг есть совсем простой способ, о котором я не знаю (гугление не помогло).

#8
(Правка: 13:46) 13:36, 5 дек. 2020

i4ugui
в память все одновременно не загружается так что это не сработает целиком...(пропустит некоторые классы, и все булпринтовые вероятно)
есть вот такя штука , но она может не работать в рантайме(что для текущей задачи не такая и проблема)

UClass* Base = Some; //input param

IAssetRegistry* AssetRegistry = 
  &FModuleManager::LoadModuleChecked<FAssetRegistryModule>(TEXT("AssetRegistry")).Get();

FARFilter Filter;
Filter.ClassNames.Add(Base->GetFName());
Filter.bRecursiveClasses = true;

TArray<FAssetData> AssetDataArr;
AssetRegistry->GetAssets(Filter, AssetDataArr);

for (const FAssetData& AssetData : AssetDataArr)
{
  if (UBlueprint* Blueprint = Cast<UBlueprint>(AssetData.GetAsset()))
  {
    if (UClass* TestClass = Blueprint->GeneratedClass)
    {
        /*Do Some with TestClass*/
    }  
  }else{/*Not BP class*/}
}

papa_Lev блупринты не обладают подобным функционалом...

Unreal EngineФорумBlueprints