Я не гуру, но думаю нужно делать так...
1. Создаешь С++ класс AMyActorCppClass для своего актера.
Далее от него делаешь еще кучу классов (если нужно) и свой Blueprint.
2. Создашешь С++ класс для своей базы. Можно в принципе любой, но для базы предпочтительнее DataAsset.
Из русских источников этот, вероятно, самый лучший
https://uengine.ru/forum/viewtopic.php?f=17&t=1502В этом классе пишешь
UPROPERTY(EditDefaultsOnly, Category = "MyAcrot bla bla bla")
TSubclassOf<class AMyActorCppClass> MyActorClass;
Эта штука появится в Blueprint твоей базы (который ты наследуешь от данного С++ класса), и ты сможешь назначить для этой переменой своего актера.
TSubclassOf означает что можно запихать сюда любые наследованные от AMyActorCppClass классы.
3. Для чтобы добавить базу нужно сделать что-то типа
TMap myMapActorsBase <int32, TSubclassOf<class AMyActorCppClass>>
Хотя не уверен в правильности этой записи. Я вместо TSubclassOf<class AMyActorCppClass> записывал структуру, где эта самая TSubclassOf<class AMyActorCppClass> выступает в качестве элемента.
Вот так, собственно, любой Blueprint должен попадать в С++.
ConstructorHelpers рекомендуется избегать.
У меня тоже есть вопрос...
Зачем делать TMap типа TMap<int32, something>?
int32, как я пониманию, просто идентификатор?
Если они будут идти подряд 0,1,2,3... то лучше сделать TArray<something>.
Прямой доступ к элементу TArray работает в 2 раза быстрее, чем операция Find для TMap.
И, опять таки, если применять TMap, где первый элемент идентификатор, то лучше всего поставить на его место не безликое число, а имя этого объекта.
Причем лучше использовать не FName, a FGameplayTag, что позволит избежать ошибок в подстановке как минимум.