728x90

언리얼에서 TFieldIterator을 사용하여 리플렉션으로 속성과 함수들의 검색이 가능하다.

멤버 변수에는 UPROPERTY, 멤버 함수에는 UFUNCTION 매크로를 지정해주어야 가능하다.

 

TFieldIterator<UProperty>타입을 사용하면 속성을 가져올수 있다.

for (TFieldIterator<UProperty> It(ClassInfo1); It; ++It)
{
    AB_LOG(Warning, TEXT("Field : %s, Type : %s"), *It->GetName(), *It->GetClass()->GetName());
    UStrProperty* StrProp = FindField<UStrProperty>(ClassInfo1, *It->GetName());
    if (StrProp)
    {
       AB_LOG(Warning, TEXT("Value = %s"), *StrProp->GetPropertyValue_InContainer(WebConnection));
    }
 }

 

TFieldIterator< UFunction >타입을 사용하면 함수을 가져올수 있다.

for ( TFieldIterator<UFunction> FunctionIterator( MyObjectsClass ); FunctionIterator; ++FunctionIterator )
{
    UFunction* Func = *FunctionIterator;
    
    UE_LOG( LogTemp, Log, TEXT( "%s" ), *FunctionIterator->GetName() ); 
}

 

함수의 경우 NativeFunctionLookupTable 배열을 사용해 현재 클래스에 어떤 함수가 있는지 알수 있다.

함수의 이름을 사용하여 FindFunctionByName함수를 사용해 가져올수 있다.

for (const auto& Entry : ClassInfo1->NativeFunctionLookupTable)
{
    AB_LOG(Warning, TEXT("Function=%s"), *Entry.Name.ToString());
 
    UFunction* Func1 = ClassInfo1->FindFunctionByName(Entry.Name);
    if (Func1->ParmsSize == 0)
    {
        WebConnection->ProcessEvent(Func1, NULL);
    }
}

 

728x90
Posted by 정망스
,
728x90

-게임 인스턴스 (컨텐츠에 관여하는 용도로 사용하기보다, 어플리케이션의 데이터를 관리하는 용도로 많이 사용)

-에셋 매니저

-게임 플레이 관련 액터 (게임모드, 게임 스테이트)

-프로젝트에 싱글톤으로 등록한 언리얼 오브젝트

728x90
Posted by 정망스
,
728x90

언리얼에서는 런타임에 빠른 타입 체킹과 클래스 검색을 위해, 컴파일 타임에서 클래스와 타입 등의 메타 정보를 생성한다.

생성한 메타정보는 UClass라는 언리얼 클래스에 보관된다. UClass에는 클래스의 계층구조, 멤버 변수, 멤버 함수에 대한 정보가 들어있다.

이러한 UClass를 사용하면 런타임에서 인스턴스의 멤버 변수값을 변경하거나 멤버 함수를 호출할수 있다.

이러한 기능은 C#에서 제공되는 리플렉션과 유사하다.

 

모든 언리얼 오브젝트의 실행 초기 런타임과정에서는 UClass 인스턴스와, 언리얼 오브젝트 인스턴스가 생성된다.

이러한 인스턴스는 언리얼 오브젝트의 기본 세팅을 지정하는데 사용되는데

이를 클래스 기본 객체 (Class Default Object) CDO라고 한다.

 

CDO를 만드는 이유는 언리얼 오브젝트를 생성할때마다 매번 초기화 시키지 않고

기본 인스턴스를 미리 만들어놓고 복제해서 사용하는 방식으로 매커니즘이 구성되어 있기 때문이라고 한다.

 

예를 들어 100명의 캐릭터를 스폰시킨다고 했을때 1명, 1명마다 생성하고, 초기화를 시키는것은 비효율적이다.

이러한 문제를 해결하기 위해 처음에 생성시킨 기본 인스턴스를 복제해서 속성만 변경하여 사용하는것이 훨씬 효율적이기 때문이다.

 

언리얼 오브젝트의 생성자 구문에는 인스턴스를 초기화해서 CDO를 제작하기 위한 용도로 사용이 된다.

즉 생성자 코드는 초기화에서만 실행이되고 이후 게임을 실제로 플레이하는 타임에서는 생성자 코드를 사용할일이 없다고 보면 된다.

게임 플레이시 사용할 초기화 함수는 생성자 대신 Init이나 BeginPlay라는 별도의 함수가 제공이 된다.

 

728x90
Posted by 정망스
,
728x90

 

맵에 존재하는 봇들을 없애는 게임을 만들어보면서 언리얼 엔진 경험을 해보았다..

 

약 일주일간 구글링, 언리얼 공식문서 및 공식 카페 분들에게 질문하며 만들었다. 사용법은 금방 익숙해 질 수 있었다

 

하지만 내부 제공되는 기능들, 블루 프린트가 아닌 c++로 최대한 만들어 보려 했기에 제공되는 함수의 종류나 사용법등에 익숙치 않아 시간을 잡아 먹었다.

 

그래도 언리얼 공식 문서가 잘 정리되있어서 필요한 정보를 찾아보기에는 수월했다.

 

늘 언리얼 엔진은 어떻게 개발하는걸까 궁금하긴했는데 어쩌다 해볼 시간이 주어져 하게 되었다. ㅋㅋ

 

아직 내가 모르는 많은 기능들이나 사용법이 있겠지만, 대충 이런거구나 하고 느낌 정도는 알 수 있는 시간이었다.

 

엔진 버전 : 4.14.3

 

구현 목록 :

플레이어 생성 및 이동,공격 (이동키 :W,A,S,D,  카메라 조정 : 마우스, 공격키 : 왼쪽 Shift)

 

플레이어 무기 생성 및 변경 (변경키 : C)

 

적 생성 및 이동,공격 AI (BehaviorTree)

 

발사체 발사 및 충돌 처리 (플레이어 경우 무기가 총일때 발사체, 적 봇은 원거리 공격 적일 경우 발사체)

 

플레이어 체력, 총알 갯수, 점수 계산 처리 (체력이 0일경우 게임 끝, 총알은 Max가 6개 다쓰고 나면 일정 시간 후 재충전, 적을 죽일때마다 100점씩)

 

적 타격시 폭발 이펙트 처리

 

UI처리

      게임 시작시 플레이어 체력, 총알 갯수, 점수 표시.

      게임이 종료시 메뉴 화면(재시작 or 나가기)

 

728x90
Posted by 정망스
,


맨 위로
홈으로 ▲위로 ▼아래로 ♥댓글쓰기 새로고침