SlideShare une entreprise Scribd logo
1  sur  28
언리얼 리플렉션 & CDO
DevRookie JINN
animal은 개인가 고양이인가?
RTTI (Run Time Type Information )
• 런타임 중 타입에 대한 정보를 제공해주는 기능
실행시간에 타입에 대한 메타데이터를 생성하여 안전한 다운 캐스팅(dynamic_cast)을 지원한다.
안전하지 못한 다운 캐스팅 예시
RTTI와 메타 데이터
• 메타데이터
어떤 목적을 위해 만들어진 데이터를 위한 데이터
RTTI 사용 시, 이러한 메타데이터를 생성하고
해당 데이터를 참조해 원하는 정보를 찾아야함으로
속도가 느리고 메모리 사용량이 증가한다
이미지 파일 하나에도 많은 메타데이터가 있다
쓰면 손해인 기능을 왜 만들어놨지?
위의 먹이 문제도 다형성을 활용하면 해결 가능한데?
이처럼 필연적으로 다형성을 활용하기에 애매한 상황이 온다
혹은 코드 자체가 이미 다형성을 활용해 해결할 수 없는 구조가 되어있을 수 있음
실무에서는 아예 RTTI를 끄는 곳이 많다고 들었는데..
그럼 저런 문제는 어떻게 해결해야하지???
이러한 방식을 원시RTTI(primitive RTTI)또는 수동RTTI(manual RTTI) 라고 부르고
해당 방식 외에도 Custom RTTI를 구현해 사용하는 식으로 해결합니다.
이러한 방식 역시 타입 체크를 위한 메타데이터를 만들어 사용하게 되므로
가장 원시적인 RTTI라고 볼 수 있으며.
언리얼 역시 이러한 이유로 언리얼만의 메타데이터를 생성한다.
메타데이터를 만듬으로서 이것저것 유용한 기능들을 구현할 수 있다!
현재 프로젝트에선 아래와 같은 방식을 사용했습니다.
리플렉션
C++에서 UI상의 X,Y 수치를 조절해 박스의 위치를 조절하고 싶다면?
유지보수 X 멤버변수가 뭐가 있는지 알 수만 있다면
자동화 할 수 있지 않을까?
리플렉션
프로그램이 자기 자신을 거울에 비친 것처럼 보고,
거울을 통해 자신의 구조와 성질을 알아내 조작할 수 있는 기능
C#, Java, Python, 등등 다른 언어의 경우,
언어차원에서 리플렉션을 지원하지만
C++은 지원하지 않으므로 직접 구현을 해야한다.
언리얼 역시 자체적으로 구현된 리플렉션을 제공한다.
Parse
언리얼 리플렉션
언리얼에서 새로운 클래스를 만들 땐,
비쥬얼 스튜디오에서 생성하는게 아닌, 언리얼 엔진상에서 생성하도록 권장한다.
언리얼 리플렉션
이렇게 생성된 헤더파일에는
언리얼에서 헤더파일을 파싱하기 위한
추가적인 코드들이 삽입되어있다.
프로젝트의 Intermediate 폴더를 보면 헤더파일을 파싱하여,
리플렉션을 위한 코드 파일이 새로 생성되있다.
UHT (Unreal Header Tool)
• 이렇게 사전 작업으로 헤더를 파싱하여, 메타데이터를 생성하는 역할을 담당
1. 빌드 시작 시, 모든 C++ 소스 코드를 스캔하여
UCLASS() , UFUNCTION(), UPROPERTY() 같은
마크업 키워드들을 찾는다.
2. 해당 파일을 파싱하여, 메타데이터를 추출한다.
3. 추출된 메타 데이터로 generated.h와 같은 추가적인 코드
파일을 생성한다.
생성된 파일을 보게되면, 해당 클래스를 언리얼 오브젝트로 등록하고
변수나 함수들을 저장해놓는 코드가 생성되어있음을 볼 수 있다
이렇게 생성된 코드를 토대로 언리얼 시스템에 의해 관리될 수 있는
UObject 객체로 동작하게 된다.
프로퍼티를 추가하고 컴파일하게 되면
gen.cpp에 리플렉션을 위한 추가적인
코드가 삽입되는 것을 볼 수 있음
언리얼 CDO
SYSTEM : 전사 캐릭터를 생성해봅시다
뼈를 준비합니다.
살을 채우고 피부를 씌워줍니다.
투구를 씌워주고
장갑도 끼워주고
갑옷도 입고
방패도 들고
검도 쥐어주면 완성!!
System : 이제 전사를 1000명 만들어주세요
흑흑… 다 끝났어용…
이제 퇴근해도 되죠?
SYSTEM : 이제보니 장화가 없네요.
잠깐 이러지말고,
완성된 애들만 ctrl C + V 하면되지 않나?
Class Default Object (CDO)
• 클래스의 기본 속성과 동작을 정의하는 기본 인스턴스로서
해당 클래스로 생성되는 모든 인스턴스들에 적용된다.
앞서 설명한 UHT이 헤더파일을 파싱하여 생성되는 메타데이터 파일에
CDO를 생성하는 코드가 만들어진다.
언리얼에서 UObject 하나가 초기화 되면
UClass 인스턴스 하나와 CDO인스턴스 하나가 만들어진다
( UClass 인스턴스는 앞서 말한 메타데이터를 담고있는 인스턴스이고
CDO 인스턴스는 static character warrior;같이 전역 변수라고 보면 될 듯?)
Class Default Object (CDO)
Class Default Object (CDO)
• 언리얼 오브젝트는 모듈 단위로 관리되고, 언리얼이 사용될 모듈들을 로딩하며,
로딩 시마다 CDO를 생성한다.
언리얼 엔진 실행시, 초기화 로딩 화면이 바로 CDO를 생성하는 시점이다.
Class Default Object (CDO)
• 언리얼 오브젝트의 생성자는 CDO를 제작하기 위한 목적으로 사용된다.
CDO는 모듈 로딩 시점에 생성되니,
모듈이 로딩 완료된 이후의 실제 게임플레이 상에서는 생성자가 호출되지 않는다.
대신 BeginPlay() 같은 함수를 제공한다.
생성자는 CDO생성을 위해
모듈 로딩시에만 호출된다.
게임 플레이시에는 BeginPlay를 사용한다.
요약
• C++에서 메타데이터를 만들면 다양한 기능 제공이 가능하다.
그렇기 때문에 언리얼에서는 자체적으로 메타데이터를 구성하여
리플렉션이나 CDO 같은 유용한 기능들을 제공한다.
리플렉션은 거울에 비친 모습을 보면서 자기자신을 관리하는 기
능을 의미한다.
CDO는 비유하자면 ‘원본 레시피‘ 이고 이를 바탕으로 여러 요리
를 만들 수 있다.
참조 사이트
언리얼 리플렉션 공식 문서 https://www.unrealengine.com/ko/blog/unreal-property-
system-reflection
언리얼 CDO 공식 문서
https://docs.unrealengine.com/4.27/ko/ProgrammingAndScripting/ProgrammingWithCPP
/UnrealArchitecture/Objects/
이득우님 블로그
https://koreanfoodie.me/912
CDO관련 블로그
https://kyoun.tistory.com/125
+ Chat GPT

Contenu connexe

Similaire à 언리얼 리플렉션 & CDO.pptx

리소스 중심의 서든어택2 실시간 메모리 프로파일링 시스템 개발기
리소스 중심의 서든어택2 실시간 메모리 프로파일링 시스템 개발기리소스 중심의 서든어택2 실시간 메모리 프로파일링 시스템 개발기
리소스 중심의 서든어택2 실시간 메모리 프로파일링 시스템 개발기
Wonha Ryu
 
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
중선 곽
 
함수형 프로그래밍
함수형 프로그래밍함수형 프로그래밍
함수형 프로그래밍
QooJuice
 

Similaire à 언리얼 리플렉션 & CDO.pptx (20)

리소스 중심의 서든어택2 실시간 메모리 프로파일링 시스템 개발기
리소스 중심의 서든어택2 실시간 메모리 프로파일링 시스템 개발기리소스 중심의 서든어택2 실시간 메모리 프로파일링 시스템 개발기
리소스 중심의 서든어택2 실시간 메모리 프로파일링 시스템 개발기
 
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
 
리눅스 커널 기초 태스크관리
리눅스 커널 기초 태스크관리리눅스 커널 기초 태스크관리
리눅스 커널 기초 태스크관리
 
Ropasaurusrex
RopasaurusrexRopasaurusrex
Ropasaurusrex
 
[PyCon KR 2018] 진실은 언제나 하나! : Python으로 만나보는 Digital Forensic
[PyCon KR 2018] 진실은 언제나 하나! : Python으로 만나보는 Digital Forensic[PyCon KR 2018] 진실은 언제나 하나! : Python으로 만나보는 Digital Forensic
[PyCon KR 2018] 진실은 언제나 하나! : Python으로 만나보는 Digital Forensic
 
NDC 2016 김정주 - 기계학습을 활용한 게임어뷰징 검출
NDC 2016 김정주 - 기계학습을 활용한 게임어뷰징 검출 NDC 2016 김정주 - 기계학습을 활용한 게임어뷰징 검출
NDC 2016 김정주 - 기계학습을 활용한 게임어뷰징 검출
 
제로부터시작하는오픈소스
제로부터시작하는오픈소스제로부터시작하는오픈소스
제로부터시작하는오픈소스
 
Jupyter notebook 이해하기
Jupyter notebook 이해하기 Jupyter notebook 이해하기
Jupyter notebook 이해하기
 
1.introduction(epoch#2)
1.introduction(epoch#2)1.introduction(epoch#2)
1.introduction(epoch#2)
 
Data-Oriented Design과 유니티 DOTS
Data-Oriented Design과 유니티 DOTSData-Oriented Design과 유니티 DOTS
Data-Oriented Design과 유니티 DOTS
 
[2A7]Linkedin'sDataScienceWhyIsItScience
[2A7]Linkedin'sDataScienceWhyIsItScience[2A7]Linkedin'sDataScienceWhyIsItScience
[2A7]Linkedin'sDataScienceWhyIsItScience
 
Project anarchy로 3d 게임 만들기 part_2_vforge피하기
Project anarchy로 3d 게임 만들기 part_2_vforge피하기Project anarchy로 3d 게임 만들기 part_2_vforge피하기
Project anarchy로 3d 게임 만들기 part_2_vforge피하기
 
QnA blog using Django - ORM, 회원가입, 로그인/로그아웃
QnA blog using Django - ORM, 회원가입, 로그인/로그아웃QnA blog using Django - ORM, 회원가입, 로그인/로그아웃
QnA blog using Django - ORM, 회원가입, 로그인/로그아웃
 
Create document automatically (1)
Create document automatically (1)Create document automatically (1)
Create document automatically (1)
 
Foss open sorucesw_6902
Foss open sorucesw_6902Foss open sorucesw_6902
Foss open sorucesw_6902
 
[16]Obfuscation 101 : 난독화, 프로가드, R8, 트랜스포머 API
[16]Obfuscation 101 : 난독화, 프로가드, R8, 트랜스포머 API[16]Obfuscation 101 : 난독화, 프로가드, R8, 트랜스포머 API
[16]Obfuscation 101 : 난독화, 프로가드, R8, 트랜스포머 API
 
Effective c++ 1~8장
Effective c++ 1~8장 Effective c++ 1~8장
Effective c++ 1~8장
 
함수형 프로그래밍
함수형 프로그래밍함수형 프로그래밍
함수형 프로그래밍
 
파이썬 파일처리 이해하기
파이썬 파일처리 이해하기파이썬 파일처리 이해하기
파이썬 파일처리 이해하기
 
링크드인의 Big Data Recommendation Products - 어제의 데이터를 통해 내일을 예측한다
링크드인의 Big Data Recommendation Products - 어제의 데이터를 통해 내일을 예측한다링크드인의 Big Data Recommendation Products - 어제의 데이터를 통해 내일을 예측한다
링크드인의 Big Data Recommendation Products - 어제의 데이터를 통해 내일을 예측한다
 

Plus de MUUMUMUMU (11)

Recast Detour.pptx
Recast Detour.pptxRecast Detour.pptx
Recast Detour.pptx
 
언리얼 애니메이션.pptx
언리얼 애니메이션.pptx언리얼 애니메이션.pptx
언리얼 애니메이션.pptx
 
이벤트 드리븐.pptx
이벤트 드리븐.pptx이벤트 드리븐.pptx
이벤트 드리븐.pptx
 
DevRookie 메모리 최적화.pptx
DevRookie 메모리 최적화.pptxDevRookie 메모리 최적화.pptx
DevRookie 메모리 최적화.pptx
 
DevRookie 언리얼 인터렉션 폴리지.pptx
DevRookie 언리얼 인터렉션 폴리지.pptxDevRookie 언리얼 인터렉션 폴리지.pptx
DevRookie 언리얼 인터렉션 폴리지.pptx
 
DevRookie 언리얼 EQS.pptx
DevRookie 언리얼 EQS.pptxDevRookie 언리얼 EQS.pptx
DevRookie 언리얼 EQS.pptx
 
DevRookie 언리얼 에셋과 패키지.pptx
DevRookie 언리얼 에셋과 패키지.pptxDevRookie 언리얼 에셋과 패키지.pptx
DevRookie 언리얼 에셋과 패키지.pptx
 
DevRookie 언리얼 군중 애니메이션.pptx
DevRookie 언리얼 군중 애니메이션.pptxDevRookie 언리얼 군중 애니메이션.pptx
DevRookie 언리얼 군중 애니메이션.pptx
 
DevRookie 리펙터링.pptx
DevRookie 리펙터링.pptxDevRookie 리펙터링.pptx
DevRookie 리펙터링.pptx
 
DevRookie 플로킹 알고리즘.pptx
DevRookie 플로킹 알고리즘.pptxDevRookie 플로킹 알고리즘.pptx
DevRookie 플로킹 알고리즘.pptx
 
Dev Rookie 파이썬 GUI.pptx
Dev Rookie 파이썬 GUI.pptxDev Rookie 파이썬 GUI.pptx
Dev Rookie 파이썬 GUI.pptx
 

Dernier

Dernier (8)

JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개
JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개
JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개
 
실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석
실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석
실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석
 
데이터 분석 문제 해결을 위한 나의 JMP 활용법
데이터 분석 문제 해결을 위한 나의 JMP 활용법데이터 분석 문제 해결을 위한 나의 JMP 활용법
데이터 분석 문제 해결을 위한 나의 JMP 활용법
 
공학 관점에서 바라본 JMP 머신러닝 최적화
공학 관점에서 바라본 JMP 머신러닝 최적화공학 관점에서 바라본 JMP 머신러닝 최적화
공학 관점에서 바라본 JMP 머신러닝 최적화
 
JMP를 활용한 가속열화 분석 사례
JMP를 활용한 가속열화 분석 사례JMP를 활용한 가속열화 분석 사례
JMP를 활용한 가속열화 분석 사례
 
JMP를 활용한 전자/반도체 산업 Yield Enhancement Methodology
JMP를 활용한 전자/반도체 산업 Yield Enhancement MethodologyJMP를 활용한 전자/반도체 산업 Yield Enhancement Methodology
JMP를 활용한 전자/반도체 산업 Yield Enhancement Methodology
 
(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?
(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?
(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?
 
JMP가 걸어온 여정, 새로운 도약 JMP 18!
JMP가 걸어온 여정, 새로운 도약 JMP 18!JMP가 걸어온 여정, 새로운 도약 JMP 18!
JMP가 걸어온 여정, 새로운 도약 JMP 18!
 

언리얼 리플렉션 & CDO.pptx

  • 1. 언리얼 리플렉션 & CDO DevRookie JINN
  • 3. RTTI (Run Time Type Information ) • 런타임 중 타입에 대한 정보를 제공해주는 기능 실행시간에 타입에 대한 메타데이터를 생성하여 안전한 다운 캐스팅(dynamic_cast)을 지원한다. 안전하지 못한 다운 캐스팅 예시
  • 4. RTTI와 메타 데이터 • 메타데이터 어떤 목적을 위해 만들어진 데이터를 위한 데이터 RTTI 사용 시, 이러한 메타데이터를 생성하고 해당 데이터를 참조해 원하는 정보를 찾아야함으로 속도가 느리고 메모리 사용량이 증가한다 이미지 파일 하나에도 많은 메타데이터가 있다
  • 5. 쓰면 손해인 기능을 왜 만들어놨지? 위의 먹이 문제도 다형성을 활용하면 해결 가능한데?
  • 6. 이처럼 필연적으로 다형성을 활용하기에 애매한 상황이 온다 혹은 코드 자체가 이미 다형성을 활용해 해결할 수 없는 구조가 되어있을 수 있음
  • 7. 실무에서는 아예 RTTI를 끄는 곳이 많다고 들었는데.. 그럼 저런 문제는 어떻게 해결해야하지???
  • 8. 이러한 방식을 원시RTTI(primitive RTTI)또는 수동RTTI(manual RTTI) 라고 부르고 해당 방식 외에도 Custom RTTI를 구현해 사용하는 식으로 해결합니다. 이러한 방식 역시 타입 체크를 위한 메타데이터를 만들어 사용하게 되므로 가장 원시적인 RTTI라고 볼 수 있으며. 언리얼 역시 이러한 이유로 언리얼만의 메타데이터를 생성한다. 메타데이터를 만듬으로서 이것저것 유용한 기능들을 구현할 수 있다! 현재 프로젝트에선 아래와 같은 방식을 사용했습니다.
  • 9. 리플렉션 C++에서 UI상의 X,Y 수치를 조절해 박스의 위치를 조절하고 싶다면?
  • 10. 유지보수 X 멤버변수가 뭐가 있는지 알 수만 있다면 자동화 할 수 있지 않을까?
  • 11. 리플렉션 프로그램이 자기 자신을 거울에 비친 것처럼 보고, 거울을 통해 자신의 구조와 성질을 알아내 조작할 수 있는 기능 C#, Java, Python, 등등 다른 언어의 경우, 언어차원에서 리플렉션을 지원하지만 C++은 지원하지 않으므로 직접 구현을 해야한다. 언리얼 역시 자체적으로 구현된 리플렉션을 제공한다. Parse
  • 12. 언리얼 리플렉션 언리얼에서 새로운 클래스를 만들 땐, 비쥬얼 스튜디오에서 생성하는게 아닌, 언리얼 엔진상에서 생성하도록 권장한다.
  • 13. 언리얼 리플렉션 이렇게 생성된 헤더파일에는 언리얼에서 헤더파일을 파싱하기 위한 추가적인 코드들이 삽입되어있다. 프로젝트의 Intermediate 폴더를 보면 헤더파일을 파싱하여, 리플렉션을 위한 코드 파일이 새로 생성되있다.
  • 14. UHT (Unreal Header Tool) • 이렇게 사전 작업으로 헤더를 파싱하여, 메타데이터를 생성하는 역할을 담당 1. 빌드 시작 시, 모든 C++ 소스 코드를 스캔하여 UCLASS() , UFUNCTION(), UPROPERTY() 같은 마크업 키워드들을 찾는다. 2. 해당 파일을 파싱하여, 메타데이터를 추출한다. 3. 추출된 메타 데이터로 generated.h와 같은 추가적인 코드 파일을 생성한다.
  • 15. 생성된 파일을 보게되면, 해당 클래스를 언리얼 오브젝트로 등록하고 변수나 함수들을 저장해놓는 코드가 생성되어있음을 볼 수 있다 이렇게 생성된 코드를 토대로 언리얼 시스템에 의해 관리될 수 있는 UObject 객체로 동작하게 된다.
  • 16. 프로퍼티를 추가하고 컴파일하게 되면 gen.cpp에 리플렉션을 위한 추가적인 코드가 삽입되는 것을 볼 수 있음
  • 17. 언리얼 CDO SYSTEM : 전사 캐릭터를 생성해봅시다 뼈를 준비합니다. 살을 채우고 피부를 씌워줍니다. 투구를 씌워주고 장갑도 끼워주고 갑옷도 입고 방패도 들고 검도 쥐어주면 완성!!
  • 18. System : 이제 전사를 1000명 만들어주세요
  • 19. 흑흑… 다 끝났어용… 이제 퇴근해도 되죠? SYSTEM : 이제보니 장화가 없네요.
  • 20.
  • 21. 잠깐 이러지말고, 완성된 애들만 ctrl C + V 하면되지 않나?
  • 22.
  • 23. Class Default Object (CDO) • 클래스의 기본 속성과 동작을 정의하는 기본 인스턴스로서 해당 클래스로 생성되는 모든 인스턴스들에 적용된다. 앞서 설명한 UHT이 헤더파일을 파싱하여 생성되는 메타데이터 파일에 CDO를 생성하는 코드가 만들어진다.
  • 24. 언리얼에서 UObject 하나가 초기화 되면 UClass 인스턴스 하나와 CDO인스턴스 하나가 만들어진다 ( UClass 인스턴스는 앞서 말한 메타데이터를 담고있는 인스턴스이고 CDO 인스턴스는 static character warrior;같이 전역 변수라고 보면 될 듯?) Class Default Object (CDO)
  • 25. Class Default Object (CDO) • 언리얼 오브젝트는 모듈 단위로 관리되고, 언리얼이 사용될 모듈들을 로딩하며, 로딩 시마다 CDO를 생성한다. 언리얼 엔진 실행시, 초기화 로딩 화면이 바로 CDO를 생성하는 시점이다.
  • 26. Class Default Object (CDO) • 언리얼 오브젝트의 생성자는 CDO를 제작하기 위한 목적으로 사용된다. CDO는 모듈 로딩 시점에 생성되니, 모듈이 로딩 완료된 이후의 실제 게임플레이 상에서는 생성자가 호출되지 않는다. 대신 BeginPlay() 같은 함수를 제공한다. 생성자는 CDO생성을 위해 모듈 로딩시에만 호출된다. 게임 플레이시에는 BeginPlay를 사용한다.
  • 27. 요약 • C++에서 메타데이터를 만들면 다양한 기능 제공이 가능하다. 그렇기 때문에 언리얼에서는 자체적으로 메타데이터를 구성하여 리플렉션이나 CDO 같은 유용한 기능들을 제공한다. 리플렉션은 거울에 비친 모습을 보면서 자기자신을 관리하는 기 능을 의미한다. CDO는 비유하자면 ‘원본 레시피‘ 이고 이를 바탕으로 여러 요리 를 만들 수 있다.
  • 28. 참조 사이트 언리얼 리플렉션 공식 문서 https://www.unrealengine.com/ko/blog/unreal-property- system-reflection 언리얼 CDO 공식 문서 https://docs.unrealengine.com/4.27/ko/ProgrammingAndScripting/ProgrammingWithCPP /UnrealArchitecture/Objects/ 이득우님 블로그 https://koreanfoodie.me/912 CDO관련 블로그 https://kyoun.tistory.com/125 + Chat GPT