GENERATED_BODY() или GENERATED_UCLASS_BODY() Разное поведение

By | November 24, 2015

Пытаясь собрать проект, после создания пауна или актёра, проект просто ругался в студии и создаваться на отрез отказывался. После долгих манипуляций, я выяснил, что причина была в том что он не мог сгенерировать файл по умолчанию который прописывается в заголовке и по факту не существует(генерируется после старта сборки проекта) Причина до банальности проста, надо заменить GENERATED_BODY() на GENERATED_UCLASS_BODY().

Данную особенность в unreal engine я заметил достаточно давно, но решил разобраться с чем связано это и наткнулся на пост, процитирую.

Hello, ubi

Please note that with GENERATED_BODY(), a constructor is no longer necessary for each class (however, if you need a constructor, you can declare and define it as usual). The other difference is that, in comparison to GENERATED_UCLASS_BODY(), GENERATED_BODY() doesn’t have the public specifier in it, so any class members that are declared after it are private by default (you can explicitly declare them as public). In your situation, please make sure that you have your constructor declared and defined correctly:

     //.h file
     //...
         GENERATED_BODY()
         
     public:
         AFPSGameMode(const class FObjectInitializer& ObjectInitializer);
     
     // .cpp file
     AFPSGameMode::AFPSGameMode(const class FObjectInitializer& ObjectInitializer)
     {
            // constructor functionality
     }

Простыми словами. Все классы по умолчанию в С++ являются приватными. Обявляя или переопределяя новый класс, вы его должны определить как публичный, иначе проект не скомпрометируется.

Если у вас есть необходимость скомпилировать класс с приватным методом доступа в Unreal необходимо прописывать GENERATED_UCLASS_BODY(). Для публичных классов следует ставить макрос GENERATED_BODY().

 

Category: Uncategorized