언리얼/언리얼 C++

언리얼 C++ - 언리얼 리플렉션 시스템의 활용

monstro 2024. 6. 30. 01:43
728x90
반응형

저번 포스트에서는 CDO를 통한 언리얼 오브젝트의 활용을 알아보았습니다.

이번 포스트에서는 간단한 예제로 언리얼 리플렉션 시스템을 활용하는 방법을 알아보겠습니다.

 

1) 클래스의 구성

 

클래스는 위와 같이 구성되며

PlayerPawn은 플레이어의 역할을, NPCPawn은 NPC의 역할을 수행하게 됩니다.

 

2) NonEnemyPawn 클래스

 

부모 클래스인 NonEnemyPawn은 위와 같이 구성되어 있습니다.

생성자와 DoAction() 메서드 그리고 Getter와 Setter를 만들어 캡슐화를 적용하였습니다.

또한 상속받을 클래스에서도 갖고 있어야 하는 요소들에는 UFUNCTION()과 UPROPERTY() 지시자를 사용해

언리얼 엔진에서 상속받는 클래스들에서도 같은 구조로 만들어주게끔 설계하였습니다.

 

 

생성자와 DoAction에서는 별다른 역할을 하지 않게끔 설계하였습니다.

다만, 무엇이 생성된 것인지 알 수 있게 로그를 남기도록 하겠습니다.

 

3) PlayerPawn 클래스

 

PlayerPawn의 클래스 구조는 더 간단합니다.

DoAction에는 오버라이드가 반드시 이뤄저야 하므로 override 키워드를 적용하였고,

프로퍼티의 Level을 작성해주었습니다.

 

 

cpp파일에서는 생성자에서 CDO를 초기화하고

DoAction에서는 생성한 플레이어가 누구인지 알 수 있도록 로그를 남기도록 하였습니다.

 

4)  NPCPawn 클래스

 

 

NPC도 플레이어와 동일한 구조로 설계되었고 

차이점은 확인하기 위해 출력할 로그의 내용정도 입니다.

 

이제 위와 같은 클래스들을 다룰 수 있는 GameInstance 클래스를 하나 생성하겠습니다.

 

5) TestGameInstance 클래스

 

TestGameInstance의 구성은 위와 같습니다.

생성자에서는 별다른 행동을 하지 않지만,

유니티의 BeginPlay()와 비슷하게 게임 시작시에 호출되는 Init() 함수에서는 많은 행동을 하게 될 것입니다.

 

추가적으로 게임에 사용할 오브젝트들을 전방선언하여 .h(헤더파일)에 실릴 부담을 덜게끔 설계하였습니다.

또한 포인터를 사용시에 가급적 UPROPERTY() 지시자를 사용하여

언리얼 엔진의 관리를 받게끔 하는 것이 매우 권장될 뿐만 아니라 매우 좋은 방법입니다.

 

 

위의 구조에서 게임을 샐행시켜보면

 

 

위와 같은 결과를 알 수 있습니다.

 

6) 정리 - 언리얼 리플렉션 시스템의 활용

리플렉션 시스템을 사용하면 다음과 같은 장점을 얻을 수 있습니다.

 

런타임중에 제공되는 API를 사용해 특정한 속성과 함수를 이름으로 검색이 가능합니다.

 

또한, 접근 지시자와 무관하게 값을 설정할 수 있습니다.

 

마지막으로, 언리얼 오브젝트가 갖고 있던 메소드를 호출할 수 있습니다.

 

언리얼 엔진의 기본 구조는 리플렉션 시스템으로 구축되어 있으므로,

리플렉션 시스템의 이해는 곧 언리얼 엔진의 이해에 도움이 될 것입니다.

728x90
반응형