SlideShare a Scribd company logo
1 of 42
Unreal Engine 4 C++ 입문과 팁
19.1.19 데브루키 언리얼 스터디
쿵쾅(김광일)
C++ 클래스 생성하기
파일-새로운 C++ 클래스… 를 눌러 C++클래스를 생성할 수 있다.
C++ 클래스 생성하기
C++ 클래스 생성하기
C++ 클래스 생성하기
엔진에서 컴파일을 실패하더라도 당황하지말고
C++ 클래스 생성하기
프로젝트명.sln 파일을 열어서 빌드를 한다. 성공했다면 Ctrl + F5로 실행시키면 엔진이 켜진다.
C++ 클래스 생성하기
이제 새로 만든 클래스가 생성되었다.
용어 정리 - 1
UObject: 언리얼 엔진 내에서 고안된 클래스로 다양한 기능을 제공한다.
(가비지 컬렉션, 레퍼런스 업데이트, 리플렉션 등 C#, JAVA 같은 타 객체 지향 언어의 기능을 엔진에서 제공하고있다.)
AActor: 게임 플레이에 사용되는 클래스. 게임 월드에 존재하는 대부분 오브젝트는 AActor를 상속.
UObject를 상속받지만 가비지 컬렉션에서 관리되지 않음. Destroy 함수를 통해
APawn: AActor를 상속받고 Controller에 의해 조작이 가능한 플레이어, AI 캐릭터를 개발할 때 사용되
는 클래스.
ACharacter: APawn을 상속받고 Mesh와 CapsuleCollider 충돌체, CharacterMovement 클래스를 기본
으로 가지고 있으며 이동, 점프 등을 기본적으로 구현되어있어 플레이어를 구현하기 위한 구성이 되어
있는 클래스. (APawn과 차이는 이족 보행 캐릭터를 위한 Pawn이 ACharacter이다.)
용어 정리 - 2
UActorComponent: AActor에 다양한 기능을 가지는 부품과 같은 역할을 한다. 디
자인 패턴 중 컴포넌트 패턴이 적용된 클래스로 별도의 동작 방식이 내장되어있고
AActor에 붙이거나 다른 부모 컴포넌트에 붙일 수 있으며 다수의 자식 컴포넌트를
붙일 수 있다.
USceneComponent: UActorComponent를 확장한 클래스. Transform을 가지고 있
다. 카메라, 오디오 컴포넌트 등 보이지는 않지만 위치값이 필요한 컴포넌트를 개발
할때 상속받아서 사용한다.
C++ 클래스 구조 보기
CDO를 정리하기 전 ACharacter을 상속받은 ABaseEnemy의 구조를 먼저 본다.
C++ 클래스 구조 보기
C++ 클래스를 생성하고 include 된 파일중 보면 클래스명.generated.h 라는 파일이 있고
언리얼 클래스에는 UCLASS() 매크로를 작성하고 GENERATED_BODY() 매크로는 세트로 와
야한다.
C++ 클래스 구조 보기
참고자료: 언리얼 엔진 프로퍼티 시스템(리플렉션)
https://www.unrealengine.com/ko/blog/unreal-property-system-reflection?lang=ko
언리얼 엔진에서 리플렉션이라는 런타임에 클래스의 정보를 알 수 있는 기능이 동작한다. C++
에는 없는 기능으로 언리얼 엔진에서 제공.
클래스명.generated.h에 리플렉션 데이터를 생성해서 넣는다.
C++ 클래스 구조 보기
참고자료: 언리얼 오브젝트 처리
http://api.unrealengine.com/KOR/Programming/UnrealArchitecture/Objects/Optimizations/index.html
UCLASS가 선언된 UObject를 상속 받는 언리얼 오브젝트 클래스는 CDO를 유지하는 것 외에
도 가비지 컬렉션, 리플렉션 등 엔진을 위한 다양한 기능을 제공한다.
또 매크로에 인수를 넣는 것으로 추상 클래스 등의 설정이 가능하다.
C++ 클래스 구조 보기
참고자료: 언리얼 오브젝트
http://api.unrealengine.com/KOR/Programming/UnrealArchitecture/Objects/
GENERATED_BODY() 아래에 작성되는 변수 및 함수는 접근자가 public이 된다.
C++ 클래스 구조 보기
참고자료: 모듈 API 지정자
http://api.unrealengine.com/KOR/Programming/Modules/API/
클래스 사이의 프로젝트명_API 매크로를 통해 언리얼 엔진 클래스는 DLL로 관리되는 것을 알
수 있습니다. 매크로는 상황에 따라 declspec(dllimport), declspec(dllexport) 또는 공란으로 사
용된다.
C++ 클래스 구조 보기
그 다음은 기본 생성자와 게임을 실행하면 최초에 한 번 호출하는 BeginPlay와 매 프레임 호출
하는 Tick가 오버라이딩 되어있습니다.
CDO(Class Default Object)
UCLASS() 매크로를 통하여 UObject와 관련 클래스의 기본 오브젝트를 하나 유지하는 것
본질적으로 기본 ‘템플릿’ 오브젝트로, 클래스 생성자에 의해 생성된 이후 변경되지 않음
C++ 클래스 정리하기
새로 생성한 Enemy와 EnemyController 클래스를 정리하고 싶은데 C++ 클래스에 폴더가 생성이
안됩니다. 드래그 앤 드롭도 안된다.
언리얼 엔진의 클래스는 컴파일 후 CDO라는 것을 생성한다. 런타임에서는 조작불가능.
C++ 클래스 정리하기
클래스를 보면서 헤더에서 CDO를 생성하는 것은 보았다. 그럼 정리를 하기 위해서는 직접
Project 폴더의 Source 폴더에서 코드를 정리하는 것 입니다. 언리얼 엔진 스타일로 폴더를 정리
하고 비주얼 스튜디오에도 필터를 만들어서 정리하였다.
C++ 클래스 정리하기
그 후 빌드를 해서 엔진을 켜보면 아래와 같이 정리된 것을 볼 수 있습니다.
또 다른 방법으로는 헤더 파일을 옮긴 다음 엔진내에서 컴파일을 진행하면 됩니다.
IWYU
(Include-What-You-Use) UE4 4.16↑변경사항
4.16 이전버전에서는 CPP파일에 언리얼 엔진의 대부분 모듈이 포함된 Engine.h, UnrealEd.h 헤더
파일을 포함하였으나 엔진이 커지면서 이 부분이 병목이 되었다고 합니다.
4.16버전부터는 CPP파일에 필요한 헤더파일을 추가해야합니다.
참고자료: IWYU 레퍼런스 가이드
http://api.unrealengine.com/KOR/Programming/UnrealBuildSystem/IWYUReferenceGuide/
IWYU
(Include-What-You-Use) UE4 4.16↑변경사항
현재 사용하고자 하는 클래스의 헤더파일이 어디있는지 모를 때에는 구글링을 한다.
그리고 이어진 문서에서 제일 아래에 가보면 어떤 헤더 파일의 위치를 알 수 있다.
핫 리로드
언리얼 클래스가 DLL로 관리되는 것을 알게되었다. 핫리로드는 소스코드를 수정 후 런타임에서
동작하고있는 엔진에 바로 로드하는 기능이다. 이 기능을 사용하는 것으로 코드에서 수정된 로직
을 바로 테스트해볼 수 있다.
엔진과 비주얼 스튜디오가 모두 켜져있는 상태에서 비주얼 스튜디오에서 빌드 완료하면 아래와
같이 핫 리로드 완료! 라는 창이 뜬다.
비주얼 스튜디오 대신 엔진에서 컴파일 버튼을 눌려서 빌드를 해도 된다.
때때로 핫리로드 보다는
Visual Studio에서 빌드
단 핫리로드를 했을 때 생성자에서 수정한 내용은 적용되지 않습니다.아래와 같은 이유입니다.
그래서 엔진을 끄고 코딩을 한 다음 빌드를 해서 엔진을 켜는 것을 때때로 추천합니다.
적 캐릭터 구현 - HP
적 캐릭터의 HP를 float 형으로 추가하는데 이때 언리얼 변수(UPROPERTY)를 사용하여 에디
터에서 값을 표시하거나 수정할 수 있도록 할 수 있다.
언리얼 변수(UPROPERTY)
UPROPERTY에 옵션에 따라 블루프린트 클래스에서 변수를 조작할 수 있다.
Visible은 보여주기만하고 Edit은 수정할 수 있다.
BaseEnemyChar로 여러 종류의 블루프린트 클래스를 생성 후 각각 다른 메쉬와 다른 체력을
기획자가 설정하여 여러가지 몬스터를 만들어 낼 수 있다.
참고자료: 프로퍼티
http://api.unrealengine.com/KOR/Programming/UnrealArchitecture/Reference/Properties/
C++ 클래스의 블루프린트 클래스
C++ 클래스를 기반으로 블루프린트 클래스를 생성하면 메쉬 등 다양한 것을 쉽게 설정할 수
있다.
C++ 클래스의 블루프린트 클래스
이렇게 보면서 적 캐릭터의 메쉬의 위치나
머티리얼 등을 설정할 수 있다.
언리얼에서의 캐릭터 조작
언리얼에서는 Pawn이 있고 Controller를 이용하여 Pawn을 조작한다.
플레이어
PlayerController
PlayerPawn
EnemyPawn AIController
EnemyPawn
AIController
Controller
AIController와 PlayerController 각 컨트롤러의 접두사가 A이다. 왠지 컴포넌트일 것 같았는데
아니다.
Controller
작명규칙을 보면 AActor를 상속하는 클래스의 접두사 A이다.
컴포넌트는 UObject를 상속하는 UActorComponent가 최상위 부모이다.
Controller 클래스가 컴포넌트였다면 UController이었을 것이다.
하지만 풀네임이 AController이고 Actor를 상속받는 것을 알 수 있다.
참고자료: 작명규칙
http://api.unrealengine.com/KOR/Programming/Development/CodingStandard/index.html
Controller
Controller이 Actor를 상속받는 이유는 Controller이 영혼 같은거라고 생각하면 된다.
그리고 그 영혼이 원하는 Pawn을 찾아서 Possess하여 그 Pawn을 조작한다.
엔진에 보면 빙의라고 표현한다. 컴포넌트의 경우 특정 액터에 붙이면 종속되어버린다.
그래서 Controller은 Actor를 상속받는다.
Possess
Controller = 영혼
Pawn = 영혼이 없는 몸
적 캐릭터 구현 - AIController
AIController를 상속받는 BaseEnemyController 클래스 생성. 모든 클래스 표시를 체크하지 않
으면 표시되지 않는다.
적 캐릭터 컨트롤러 구현
간단하게 플레이어를 쫓아가는 적 캐릭터를 구현해본다.
플레이어를 쫓기 위해서는 플레이어의 정보를 알아야한다.
쫓아갈 대상의 액터를 저장하는 변수를 추가하였다.
플레이어 찾기
BeginPlay에서 플레이어를 찾아서 MoveTargetActor에 넣
어준다. 우선 UGameplayStatics 클래스가 가지는
GetPlayerPawn 함수를 사용하여 현재 게임 월드에서 0번
째 플레이어를 찾아주는 기능으로 구현하였다.
Kismet: GamePlayStatics 헤더의 폴더인 Kismet이 무엇인지 궁금할 수 있다.
Kismet은 언리얼 3의 비주얼 스크립팅 이름이다. 언리얼 4는 3를 기반으로 만들
면서 Kismet이 블루프린트로 바뀐 것이지만 하위 호환을 위해 이름을 그대로 사
용하고 있다고 한다.
플레이어 쫓기
MoveToActor은 Pawn의 멤버 함수로 대상 액터까지 네비
게이션 메시를 타고 찾아간다.
두번째 인자로는 어느 거리까지 쫓아가느냐를 넘겨준다.
이때 거리 1Unit = 1cm이다. 현재 코드는 100cm까지 타겟
액터를 쫓아가는 코드이다.
유니티는 1Unit = 1m
적 캐릭터 컨트롤러 설정
BaseEnemyChar로 BP_HumanEnemy를
만들었고 방금 작성한 AI Controller Class
를 적용한다.
AIController은 Component도 아니고 Actor인데 어떻게
Actor에 붙일수 있는가?
Pawn은 멤버 변수로 AI Controller Class를 가지고 있기 때
문에 설정만 해주면 된다.
GetPlayerPawn
GetPlayerPawn 내부를 본다.
GetPlayerController 함수를 호
출하고 그 함수까지 보면
FConstPlayerControllerIterator
이라는 언리얼에서 제공해주는
반복자를 통해 월드의 오브젝
트를 탐색한다.
이는 언리얼에서 제공하는 반
복자에 대한 부분을 이야기하
기 위해 보여주었다.
TActorIterator<ActorType>
또 다른 방법으로 플레이어 액터를 찾는다면 EngineUtil.h의 TActorIterator<ActorType>를 사용하여 원
하는 액터 타입으로 찾을 수 있다.
참고자료: UE4 C++ 프로그래밍 입문 → 오브젝트/액터 이터레이터 항목
http://api.unrealengine.com/KOR/Programming/Introduction/index.html
Assert
check(값), 값이 false일 경우 엔진 크래시를 발생시킨다.
참고자료: 어서트
http://api.unrealengine.com/KOR/Programming/Assertions/
UE_LOG
출력 로그에 로그를 남겨주는 매크로
AddOnScreenDebugMessage
화면상에 메시지를 남겨주는 엔진에서 제공하는 함수

More Related Content

What's hot

윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019devCAT Studio, NEXON
 
이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019
이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019
이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019devCAT Studio, NEXON
 
멀티스레드 렌더링 (Multithreaded rendering)
멀티스레드 렌더링 (Multithreaded rendering)멀티스레드 렌더링 (Multithreaded rendering)
멀티스레드 렌더링 (Multithreaded rendering)Bongseok Cho
 
[Ndc11 박민근] deferred shading
[Ndc11 박민근] deferred shading[Ndc11 박민근] deferred shading
[Ndc11 박민근] deferred shadingMinGeun Park
 
GameInstance에 대해서 알아보자
GameInstance에 대해서 알아보자GameInstance에 대해서 알아보자
GameInstance에 대해서 알아보자TonyCms
 
[NDC 2010] 그럴듯한 랜덤 생성 컨텐츠 만들기
[NDC 2010] 그럴듯한 랜덤 생성 컨텐츠 만들기[NDC 2010] 그럴듯한 랜덤 생성 컨텐츠 만들기
[NDC 2010] 그럴듯한 랜덤 생성 컨텐츠 만들기Yongha Kim
 
나만의 엔진 개발하기
나만의 엔진 개발하기나만의 엔진 개발하기
나만의 엔진 개발하기YEONG-CHEON YOU
 
언리얼4 플레이어 컨트롤러의 이해.
언리얼4 플레이어 컨트롤러의 이해.언리얼4 플레이어 컨트롤러의 이해.
언리얼4 플레이어 컨트롤러의 이해.Wuwon Yu
 
[KGC2011_박민근] 신입 게임 개발자가 알아야 할 것들
[KGC2011_박민근] 신입 게임 개발자가 알아야 할 것들[KGC2011_박민근] 신입 게임 개발자가 알아야 할 것들
[KGC2011_박민근] 신입 게임 개발자가 알아야 할 것들MinGeun Park
 
임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012devCAT Studio, NEXON
 
Tips and experience of DX12 Engine development .
Tips and experience of DX12 Engine development .Tips and experience of DX12 Engine development .
Tips and experience of DX12 Engine development .YEONG-CHEON YOU
 
NDC2016 프로젝트 A1의 AAA급 캐릭터 렌더링 기술
NDC2016 프로젝트 A1의 AAA급 캐릭터 렌더링 기술NDC2016 프로젝트 A1의 AAA급 캐릭터 렌더링 기술
NDC2016 프로젝트 A1의 AAA급 캐릭터 렌더링 기술Ki Hyunwoo
 
NDC2011 - 절차적 지형과 트렌드의 추적자들
NDC2011 - 절차적 지형과 트렌드의 추적자들NDC2011 - 절차적 지형과 트렌드의 추적자들
NDC2011 - 절차적 지형과 트렌드의 추적자들Jubok Kim
 
게임 개발에 자주 사용되는 디자인 패턴
게임 개발에 자주 사용되는 디자인 패턴게임 개발에 자주 사용되는 디자인 패턴
게임 개발에 자주 사용되는 디자인 패턴예림 임
 
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019devCAT Studio, NEXON
 
[0903 구경원] recast 네비메쉬
[0903 구경원] recast 네비메쉬[0903 구경원] recast 네비메쉬
[0903 구경원] recast 네비메쉬KyeongWon Koo
 
김혁, <드래곤 하운드>의 PBR과 레이트레이싱 렌더링 기법, NDC2019
김혁, <드래곤 하운드>의 PBR과 레이트레이싱 렌더링 기법, NDC2019김혁, <드래곤 하운드>의 PBR과 레이트레이싱 렌더링 기법, NDC2019
김혁, <드래곤 하운드>의 PBR과 레이트레이싱 렌더링 기법, NDC2019devCAT Studio, NEXON
 
실시간 게임 서버 최적화 전략
실시간 게임 서버 최적화 전략실시간 게임 서버 최적화 전략
실시간 게임 서버 최적화 전략YEONG-CHEON YOU
 
중앙 서버 없는 게임 로직
중앙 서버 없는 게임 로직중앙 서버 없는 게임 로직
중앙 서버 없는 게임 로직Hoyoung Choi
 
Compute shader DX11
Compute shader DX11Compute shader DX11
Compute shader DX11민웅 이
 

What's hot (20)

윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
 
이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019
이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019
이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019
 
멀티스레드 렌더링 (Multithreaded rendering)
멀티스레드 렌더링 (Multithreaded rendering)멀티스레드 렌더링 (Multithreaded rendering)
멀티스레드 렌더링 (Multithreaded rendering)
 
[Ndc11 박민근] deferred shading
[Ndc11 박민근] deferred shading[Ndc11 박민근] deferred shading
[Ndc11 박민근] deferred shading
 
GameInstance에 대해서 알아보자
GameInstance에 대해서 알아보자GameInstance에 대해서 알아보자
GameInstance에 대해서 알아보자
 
[NDC 2010] 그럴듯한 랜덤 생성 컨텐츠 만들기
[NDC 2010] 그럴듯한 랜덤 생성 컨텐츠 만들기[NDC 2010] 그럴듯한 랜덤 생성 컨텐츠 만들기
[NDC 2010] 그럴듯한 랜덤 생성 컨텐츠 만들기
 
나만의 엔진 개발하기
나만의 엔진 개발하기나만의 엔진 개발하기
나만의 엔진 개발하기
 
언리얼4 플레이어 컨트롤러의 이해.
언리얼4 플레이어 컨트롤러의 이해.언리얼4 플레이어 컨트롤러의 이해.
언리얼4 플레이어 컨트롤러의 이해.
 
[KGC2011_박민근] 신입 게임 개발자가 알아야 할 것들
[KGC2011_박민근] 신입 게임 개발자가 알아야 할 것들[KGC2011_박민근] 신입 게임 개발자가 알아야 할 것들
[KGC2011_박민근] 신입 게임 개발자가 알아야 할 것들
 
임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012
 
Tips and experience of DX12 Engine development .
Tips and experience of DX12 Engine development .Tips and experience of DX12 Engine development .
Tips and experience of DX12 Engine development .
 
NDC2016 프로젝트 A1의 AAA급 캐릭터 렌더링 기술
NDC2016 프로젝트 A1의 AAA급 캐릭터 렌더링 기술NDC2016 프로젝트 A1의 AAA급 캐릭터 렌더링 기술
NDC2016 프로젝트 A1의 AAA급 캐릭터 렌더링 기술
 
NDC2011 - 절차적 지형과 트렌드의 추적자들
NDC2011 - 절차적 지형과 트렌드의 추적자들NDC2011 - 절차적 지형과 트렌드의 추적자들
NDC2011 - 절차적 지형과 트렌드의 추적자들
 
게임 개발에 자주 사용되는 디자인 패턴
게임 개발에 자주 사용되는 디자인 패턴게임 개발에 자주 사용되는 디자인 패턴
게임 개발에 자주 사용되는 디자인 패턴
 
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
 
[0903 구경원] recast 네비메쉬
[0903 구경원] recast 네비메쉬[0903 구경원] recast 네비메쉬
[0903 구경원] recast 네비메쉬
 
김혁, <드래곤 하운드>의 PBR과 레이트레이싱 렌더링 기법, NDC2019
김혁, <드래곤 하운드>의 PBR과 레이트레이싱 렌더링 기법, NDC2019김혁, <드래곤 하운드>의 PBR과 레이트레이싱 렌더링 기법, NDC2019
김혁, <드래곤 하운드>의 PBR과 레이트레이싱 렌더링 기법, NDC2019
 
실시간 게임 서버 최적화 전략
실시간 게임 서버 최적화 전략실시간 게임 서버 최적화 전략
실시간 게임 서버 최적화 전략
 
중앙 서버 없는 게임 로직
중앙 서버 없는 게임 로직중앙 서버 없는 게임 로직
중앙 서버 없는 게임 로직
 
Compute shader DX11
Compute shader DX11Compute shader DX11
Compute shader DX11
 

Similar to 190119 unreal engine c++ 입문 및 팁

Project anarchy로 3d 게임 만들기 part_2_vforge피하기
Project anarchy로 3d 게임 만들기 part_2_vforge피하기Project anarchy로 3d 게임 만들기 part_2_vforge피하기
Project anarchy로 3d 게임 만들기 part_2_vforge피하기Dong Chan Shin
 
191221 unreal engine 4 editor 확장하기
191221 unreal engine 4 editor 확장하기191221 unreal engine 4 editor 확장하기
191221 unreal engine 4 editor 확장하기KWANGIL KIM
 
Project anarchy로 3 d 게임 만들기 part_1
Project anarchy로 3 d 게임 만들기 part_1Project anarchy로 3 d 게임 만들기 part_1
Project anarchy로 3 d 게임 만들기 part_1Dong Chan Shin
 
Project Anarchy(Vision Engine)으로 게임 툴 만들기! part1
Project Anarchy(Vision Engine)으로 게임 툴 만들기! part1Project Anarchy(Vision Engine)으로 게임 툴 만들기! part1
Project Anarchy(Vision Engine)으로 게임 툴 만들기! part1진상 문
 
[0618구경원]초보 게임프로그래머를 위한 c++
[0618구경원]초보 게임프로그래머를 위한 c++[0618구경원]초보 게임프로그래머를 위한 c++
[0618구경원]초보 게임프로그래머를 위한 c++KyeongWon Koo
 
Effective c++ 1~8장
Effective c++ 1~8장 Effective c++ 1~8장
Effective c++ 1~8장 Shin heemin
 
AWS DevDay 실습 가이드 - Rekognition 기반 Twitter봇
AWS DevDay 실습 가이드 - Rekognition 기반 Twitter봇AWS DevDay 실습 가이드 - Rekognition 기반 Twitter봇
AWS DevDay 실습 가이드 - Rekognition 기반 Twitter봇Amazon Web Services Korea
 
Youtube를활용한app만들기
Youtube를활용한app만들기Youtube를활용한app만들기
Youtube를활용한app만들기DaeHee Jang
 
POSTGRES_사칙연산_익스텐션만들기.pdf
POSTGRES_사칙연산_익스텐션만들기.pdfPOSTGRES_사칙연산_익스텐션만들기.pdf
POSTGRES_사칙연산_익스텐션만들기.pdfLee Dong Wook
 
Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005Ryan Park
 
R.java가 사라졌어요 어떻하죠?:Aquery라이브러리와 안드로이드 개발팁
R.java가 사라졌어요 어떻하죠?:Aquery라이브러리와 안드로이드 개발팁R.java가 사라졌어요 어떻하죠?:Aquery라이브러리와 안드로이드 개발팁
R.java가 사라졌어요 어떻하죠?:Aquery라이브러리와 안드로이드 개발팁창규 김
 
Windows os 상에서 효율적인 덤프
Windows os 상에서 효율적인 덤프Windows os 상에서 효율적인 덤프
Windows os 상에서 효율적인 덤프OnGameServer
 
Api design for c++ ch3 pattern
Api design for c++ ch3 patternApi design for c++ ch3 pattern
Api design for c++ ch3 patternjinho park
 
V8 add on with middleware modules
V8 add on with middleware modulesV8 add on with middleware modules
V8 add on with middleware modulesJay Kim
 
리눅스커널-디바이스드라이버_모듈_프로그래밍
리눅스커널-디바이스드라이버_모듈_프로그래밍리눅스커널-디바이스드라이버_모듈_프로그래밍
리눅스커널-디바이스드라이버_모듈_프로그래밍Yunsu Lee
 
Boost 라이브리와 C++11
Boost 라이브리와 C++11Boost 라이브리와 C++11
Boost 라이브리와 C++11OnGameServer
 
Windosw via c 스터디20장.pptx
Windosw via c 스터디20장.pptxWindosw via c 스터디20장.pptx
Windosw via c 스터디20장.pptxHolyTak
 

Similar to 190119 unreal engine c++ 입문 및 팁 (20)

Project anarchy로 3d 게임 만들기 part_2_vforge피하기
Project anarchy로 3d 게임 만들기 part_2_vforge피하기Project anarchy로 3d 게임 만들기 part_2_vforge피하기
Project anarchy로 3d 게임 만들기 part_2_vforge피하기
 
191221 unreal engine 4 editor 확장하기
191221 unreal engine 4 editor 확장하기191221 unreal engine 4 editor 확장하기
191221 unreal engine 4 editor 확장하기
 
Project anarchy로 3 d 게임 만들기 part_1
Project anarchy로 3 d 게임 만들기 part_1Project anarchy로 3 d 게임 만들기 part_1
Project anarchy로 3 d 게임 만들기 part_1
 
Project Anarchy(Vision Engine)으로 게임 툴 만들기! part1
Project Anarchy(Vision Engine)으로 게임 툴 만들기! part1Project Anarchy(Vision Engine)으로 게임 툴 만들기! part1
Project Anarchy(Vision Engine)으로 게임 툴 만들기! part1
 
AWS DevDay 실습 가이드 - 콘테이너
AWS DevDay 실습 가이드 - 콘테이너AWS DevDay 실습 가이드 - 콘테이너
AWS DevDay 실습 가이드 - 콘테이너
 
[0618구경원]초보 게임프로그래머를 위한 c++
[0618구경원]초보 게임프로그래머를 위한 c++[0618구경원]초보 게임프로그래머를 위한 c++
[0618구경원]초보 게임프로그래머를 위한 c++
 
Effective c++ 1~8장
Effective c++ 1~8장 Effective c++ 1~8장
Effective c++ 1~8장
 
AWS DevDay 실습 가이드 - Rekognition 기반 Twitter봇
AWS DevDay 실습 가이드 - Rekognition 기반 Twitter봇AWS DevDay 실습 가이드 - Rekognition 기반 Twitter봇
AWS DevDay 실습 가이드 - Rekognition 기반 Twitter봇
 
Youtube를활용한app만들기
Youtube를활용한app만들기Youtube를활용한app만들기
Youtube를활용한app만들기
 
POSTGRES_사칙연산_익스텐션만들기.pdf
POSTGRES_사칙연산_익스텐션만들기.pdfPOSTGRES_사칙연산_익스텐션만들기.pdf
POSTGRES_사칙연산_익스텐션만들기.pdf
 
Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005
 
R.java가 사라졌어요 어떻하죠?:Aquery라이브러리와 안드로이드 개발팁
R.java가 사라졌어요 어떻하죠?:Aquery라이브러리와 안드로이드 개발팁R.java가 사라졌어요 어떻하죠?:Aquery라이브러리와 안드로이드 개발팁
R.java가 사라졌어요 어떻하죠?:Aquery라이브러리와 안드로이드 개발팁
 
Windows os 상에서 효율적인 덤프
Windows os 상에서 효율적인 덤프Windows os 상에서 효율적인 덤프
Windows os 상에서 효율적인 덤프
 
Eclipse RCP 1/2
Eclipse RCP 1/2Eclipse RCP 1/2
Eclipse RCP 1/2
 
Api design for c++ ch3 pattern
Api design for c++ ch3 patternApi design for c++ ch3 pattern
Api design for c++ ch3 pattern
 
V8 add on with middleware modules
V8 add on with middleware modulesV8 add on with middleware modules
V8 add on with middleware modules
 
12books
12books12books
12books
 
리눅스커널-디바이스드라이버_모듈_프로그래밍
리눅스커널-디바이스드라이버_모듈_프로그래밍리눅스커널-디바이스드라이버_모듈_프로그래밍
리눅스커널-디바이스드라이버_모듈_프로그래밍
 
Boost 라이브리와 C++11
Boost 라이브리와 C++11Boost 라이브리와 C++11
Boost 라이브리와 C++11
 
Windosw via c 스터디20장.pptx
Windosw via c 스터디20장.pptxWindosw via c 스터디20장.pptx
Windosw via c 스터디20장.pptx
 

More from KWANGIL KIM

210320 웹 통신
210320 웹 통신210320 웹 통신
210320 웹 통신KWANGIL KIM
 
191019 Forward / Deferred Rendering
191019 Forward / Deferred Rendering191019 Forward / Deferred Rendering
191019 Forward / Deferred RenderingKWANGIL KIM
 
190720 언리얼 서밋 2일차 리뷰
190720 언리얼 서밋 2일차 리뷰190720 언리얼 서밋 2일차 리뷰
190720 언리얼 서밋 2일차 리뷰KWANGIL KIM
 
190406 신입 클라이언트 프로그래머 1개월차까지 이야기
190406 신입 클라이언트 프로그래머 1개월차까지 이야기190406 신입 클라이언트 프로그래머 1개월차까지 이야기
190406 신입 클라이언트 프로그래머 1개월차까지 이야기KWANGIL KIM
 
181215 MS SQL로 알아보는 데이터베이스
181215 MS SQL로 알아보는 데이터베이스181215 MS SQL로 알아보는 데이터베이스
181215 MS SQL로 알아보는 데이터베이스KWANGIL KIM
 
포트폴리오에서 사용한 모던 C++
포트폴리오에서 사용한 모던 C++포트폴리오에서 사용한 모던 C++
포트폴리오에서 사용한 모던 C++KWANGIL KIM
 
OnePointLesson PriorityQueue 우선순위 큐
OnePointLesson PriorityQueue 우선순위 큐OnePointLesson PriorityQueue 우선순위 큐
OnePointLesson PriorityQueue 우선순위 큐KWANGIL KIM
 

More from KWANGIL KIM (7)

210320 웹 통신
210320 웹 통신210320 웹 통신
210320 웹 통신
 
191019 Forward / Deferred Rendering
191019 Forward / Deferred Rendering191019 Forward / Deferred Rendering
191019 Forward / Deferred Rendering
 
190720 언리얼 서밋 2일차 리뷰
190720 언리얼 서밋 2일차 리뷰190720 언리얼 서밋 2일차 리뷰
190720 언리얼 서밋 2일차 리뷰
 
190406 신입 클라이언트 프로그래머 1개월차까지 이야기
190406 신입 클라이언트 프로그래머 1개월차까지 이야기190406 신입 클라이언트 프로그래머 1개월차까지 이야기
190406 신입 클라이언트 프로그래머 1개월차까지 이야기
 
181215 MS SQL로 알아보는 데이터베이스
181215 MS SQL로 알아보는 데이터베이스181215 MS SQL로 알아보는 데이터베이스
181215 MS SQL로 알아보는 데이터베이스
 
포트폴리오에서 사용한 모던 C++
포트폴리오에서 사용한 모던 C++포트폴리오에서 사용한 모던 C++
포트폴리오에서 사용한 모던 C++
 
OnePointLesson PriorityQueue 우선순위 큐
OnePointLesson PriorityQueue 우선순위 큐OnePointLesson PriorityQueue 우선순위 큐
OnePointLesson PriorityQueue 우선순위 큐
 

190119 unreal engine c++ 입문 및 팁

  • 1. Unreal Engine 4 C++ 입문과 팁 19.1.19 데브루키 언리얼 스터디 쿵쾅(김광일)
  • 2. C++ 클래스 생성하기 파일-새로운 C++ 클래스… 를 눌러 C++클래스를 생성할 수 있다.
  • 5. C++ 클래스 생성하기 엔진에서 컴파일을 실패하더라도 당황하지말고
  • 6. C++ 클래스 생성하기 프로젝트명.sln 파일을 열어서 빌드를 한다. 성공했다면 Ctrl + F5로 실행시키면 엔진이 켜진다.
  • 7. C++ 클래스 생성하기 이제 새로 만든 클래스가 생성되었다.
  • 8. 용어 정리 - 1 UObject: 언리얼 엔진 내에서 고안된 클래스로 다양한 기능을 제공한다. (가비지 컬렉션, 레퍼런스 업데이트, 리플렉션 등 C#, JAVA 같은 타 객체 지향 언어의 기능을 엔진에서 제공하고있다.) AActor: 게임 플레이에 사용되는 클래스. 게임 월드에 존재하는 대부분 오브젝트는 AActor를 상속. UObject를 상속받지만 가비지 컬렉션에서 관리되지 않음. Destroy 함수를 통해 APawn: AActor를 상속받고 Controller에 의해 조작이 가능한 플레이어, AI 캐릭터를 개발할 때 사용되 는 클래스. ACharacter: APawn을 상속받고 Mesh와 CapsuleCollider 충돌체, CharacterMovement 클래스를 기본 으로 가지고 있으며 이동, 점프 등을 기본적으로 구현되어있어 플레이어를 구현하기 위한 구성이 되어 있는 클래스. (APawn과 차이는 이족 보행 캐릭터를 위한 Pawn이 ACharacter이다.)
  • 9. 용어 정리 - 2 UActorComponent: AActor에 다양한 기능을 가지는 부품과 같은 역할을 한다. 디 자인 패턴 중 컴포넌트 패턴이 적용된 클래스로 별도의 동작 방식이 내장되어있고 AActor에 붙이거나 다른 부모 컴포넌트에 붙일 수 있으며 다수의 자식 컴포넌트를 붙일 수 있다. USceneComponent: UActorComponent를 확장한 클래스. Transform을 가지고 있 다. 카메라, 오디오 컴포넌트 등 보이지는 않지만 위치값이 필요한 컴포넌트를 개발 할때 상속받아서 사용한다.
  • 10. C++ 클래스 구조 보기 CDO를 정리하기 전 ACharacter을 상속받은 ABaseEnemy의 구조를 먼저 본다.
  • 11. C++ 클래스 구조 보기 C++ 클래스를 생성하고 include 된 파일중 보면 클래스명.generated.h 라는 파일이 있고 언리얼 클래스에는 UCLASS() 매크로를 작성하고 GENERATED_BODY() 매크로는 세트로 와 야한다.
  • 12. C++ 클래스 구조 보기 참고자료: 언리얼 엔진 프로퍼티 시스템(리플렉션) https://www.unrealengine.com/ko/blog/unreal-property-system-reflection?lang=ko 언리얼 엔진에서 리플렉션이라는 런타임에 클래스의 정보를 알 수 있는 기능이 동작한다. C++ 에는 없는 기능으로 언리얼 엔진에서 제공. 클래스명.generated.h에 리플렉션 데이터를 생성해서 넣는다.
  • 13. C++ 클래스 구조 보기 참고자료: 언리얼 오브젝트 처리 http://api.unrealengine.com/KOR/Programming/UnrealArchitecture/Objects/Optimizations/index.html UCLASS가 선언된 UObject를 상속 받는 언리얼 오브젝트 클래스는 CDO를 유지하는 것 외에 도 가비지 컬렉션, 리플렉션 등 엔진을 위한 다양한 기능을 제공한다. 또 매크로에 인수를 넣는 것으로 추상 클래스 등의 설정이 가능하다.
  • 14. C++ 클래스 구조 보기 참고자료: 언리얼 오브젝트 http://api.unrealengine.com/KOR/Programming/UnrealArchitecture/Objects/ GENERATED_BODY() 아래에 작성되는 변수 및 함수는 접근자가 public이 된다.
  • 15. C++ 클래스 구조 보기 참고자료: 모듈 API 지정자 http://api.unrealengine.com/KOR/Programming/Modules/API/ 클래스 사이의 프로젝트명_API 매크로를 통해 언리얼 엔진 클래스는 DLL로 관리되는 것을 알 수 있습니다. 매크로는 상황에 따라 declspec(dllimport), declspec(dllexport) 또는 공란으로 사 용된다.
  • 16. C++ 클래스 구조 보기 그 다음은 기본 생성자와 게임을 실행하면 최초에 한 번 호출하는 BeginPlay와 매 프레임 호출 하는 Tick가 오버라이딩 되어있습니다.
  • 17. CDO(Class Default Object) UCLASS() 매크로를 통하여 UObject와 관련 클래스의 기본 오브젝트를 하나 유지하는 것 본질적으로 기본 ‘템플릿’ 오브젝트로, 클래스 생성자에 의해 생성된 이후 변경되지 않음
  • 18. C++ 클래스 정리하기 새로 생성한 Enemy와 EnemyController 클래스를 정리하고 싶은데 C++ 클래스에 폴더가 생성이 안됩니다. 드래그 앤 드롭도 안된다. 언리얼 엔진의 클래스는 컴파일 후 CDO라는 것을 생성한다. 런타임에서는 조작불가능.
  • 19. C++ 클래스 정리하기 클래스를 보면서 헤더에서 CDO를 생성하는 것은 보았다. 그럼 정리를 하기 위해서는 직접 Project 폴더의 Source 폴더에서 코드를 정리하는 것 입니다. 언리얼 엔진 스타일로 폴더를 정리 하고 비주얼 스튜디오에도 필터를 만들어서 정리하였다.
  • 20. C++ 클래스 정리하기 그 후 빌드를 해서 엔진을 켜보면 아래와 같이 정리된 것을 볼 수 있습니다. 또 다른 방법으로는 헤더 파일을 옮긴 다음 엔진내에서 컴파일을 진행하면 됩니다.
  • 21. IWYU (Include-What-You-Use) UE4 4.16↑변경사항 4.16 이전버전에서는 CPP파일에 언리얼 엔진의 대부분 모듈이 포함된 Engine.h, UnrealEd.h 헤더 파일을 포함하였으나 엔진이 커지면서 이 부분이 병목이 되었다고 합니다. 4.16버전부터는 CPP파일에 필요한 헤더파일을 추가해야합니다. 참고자료: IWYU 레퍼런스 가이드 http://api.unrealengine.com/KOR/Programming/UnrealBuildSystem/IWYUReferenceGuide/
  • 22. IWYU (Include-What-You-Use) UE4 4.16↑변경사항 현재 사용하고자 하는 클래스의 헤더파일이 어디있는지 모를 때에는 구글링을 한다. 그리고 이어진 문서에서 제일 아래에 가보면 어떤 헤더 파일의 위치를 알 수 있다.
  • 23. 핫 리로드 언리얼 클래스가 DLL로 관리되는 것을 알게되었다. 핫리로드는 소스코드를 수정 후 런타임에서 동작하고있는 엔진에 바로 로드하는 기능이다. 이 기능을 사용하는 것으로 코드에서 수정된 로직 을 바로 테스트해볼 수 있다. 엔진과 비주얼 스튜디오가 모두 켜져있는 상태에서 비주얼 스튜디오에서 빌드 완료하면 아래와 같이 핫 리로드 완료! 라는 창이 뜬다. 비주얼 스튜디오 대신 엔진에서 컴파일 버튼을 눌려서 빌드를 해도 된다.
  • 24. 때때로 핫리로드 보다는 Visual Studio에서 빌드 단 핫리로드를 했을 때 생성자에서 수정한 내용은 적용되지 않습니다.아래와 같은 이유입니다. 그래서 엔진을 끄고 코딩을 한 다음 빌드를 해서 엔진을 켜는 것을 때때로 추천합니다.
  • 25. 적 캐릭터 구현 - HP 적 캐릭터의 HP를 float 형으로 추가하는데 이때 언리얼 변수(UPROPERTY)를 사용하여 에디 터에서 값을 표시하거나 수정할 수 있도록 할 수 있다.
  • 26. 언리얼 변수(UPROPERTY) UPROPERTY에 옵션에 따라 블루프린트 클래스에서 변수를 조작할 수 있다. Visible은 보여주기만하고 Edit은 수정할 수 있다. BaseEnemyChar로 여러 종류의 블루프린트 클래스를 생성 후 각각 다른 메쉬와 다른 체력을 기획자가 설정하여 여러가지 몬스터를 만들어 낼 수 있다. 참고자료: 프로퍼티 http://api.unrealengine.com/KOR/Programming/UnrealArchitecture/Reference/Properties/
  • 27. C++ 클래스의 블루프린트 클래스 C++ 클래스를 기반으로 블루프린트 클래스를 생성하면 메쉬 등 다양한 것을 쉽게 설정할 수 있다.
  • 28. C++ 클래스의 블루프린트 클래스 이렇게 보면서 적 캐릭터의 메쉬의 위치나 머티리얼 등을 설정할 수 있다.
  • 29. 언리얼에서의 캐릭터 조작 언리얼에서는 Pawn이 있고 Controller를 이용하여 Pawn을 조작한다. 플레이어 PlayerController PlayerPawn EnemyPawn AIController EnemyPawn AIController
  • 30. Controller AIController와 PlayerController 각 컨트롤러의 접두사가 A이다. 왠지 컴포넌트일 것 같았는데 아니다.
  • 31. Controller 작명규칙을 보면 AActor를 상속하는 클래스의 접두사 A이다. 컴포넌트는 UObject를 상속하는 UActorComponent가 최상위 부모이다. Controller 클래스가 컴포넌트였다면 UController이었을 것이다. 하지만 풀네임이 AController이고 Actor를 상속받는 것을 알 수 있다. 참고자료: 작명규칙 http://api.unrealengine.com/KOR/Programming/Development/CodingStandard/index.html
  • 32. Controller Controller이 Actor를 상속받는 이유는 Controller이 영혼 같은거라고 생각하면 된다. 그리고 그 영혼이 원하는 Pawn을 찾아서 Possess하여 그 Pawn을 조작한다. 엔진에 보면 빙의라고 표현한다. 컴포넌트의 경우 특정 액터에 붙이면 종속되어버린다. 그래서 Controller은 Actor를 상속받는다. Possess Controller = 영혼 Pawn = 영혼이 없는 몸
  • 33. 적 캐릭터 구현 - AIController AIController를 상속받는 BaseEnemyController 클래스 생성. 모든 클래스 표시를 체크하지 않 으면 표시되지 않는다.
  • 34. 적 캐릭터 컨트롤러 구현 간단하게 플레이어를 쫓아가는 적 캐릭터를 구현해본다. 플레이어를 쫓기 위해서는 플레이어의 정보를 알아야한다. 쫓아갈 대상의 액터를 저장하는 변수를 추가하였다.
  • 35. 플레이어 찾기 BeginPlay에서 플레이어를 찾아서 MoveTargetActor에 넣 어준다. 우선 UGameplayStatics 클래스가 가지는 GetPlayerPawn 함수를 사용하여 현재 게임 월드에서 0번 째 플레이어를 찾아주는 기능으로 구현하였다. Kismet: GamePlayStatics 헤더의 폴더인 Kismet이 무엇인지 궁금할 수 있다. Kismet은 언리얼 3의 비주얼 스크립팅 이름이다. 언리얼 4는 3를 기반으로 만들 면서 Kismet이 블루프린트로 바뀐 것이지만 하위 호환을 위해 이름을 그대로 사 용하고 있다고 한다.
  • 36. 플레이어 쫓기 MoveToActor은 Pawn의 멤버 함수로 대상 액터까지 네비 게이션 메시를 타고 찾아간다. 두번째 인자로는 어느 거리까지 쫓아가느냐를 넘겨준다. 이때 거리 1Unit = 1cm이다. 현재 코드는 100cm까지 타겟 액터를 쫓아가는 코드이다. 유니티는 1Unit = 1m
  • 37. 적 캐릭터 컨트롤러 설정 BaseEnemyChar로 BP_HumanEnemy를 만들었고 방금 작성한 AI Controller Class 를 적용한다. AIController은 Component도 아니고 Actor인데 어떻게 Actor에 붙일수 있는가? Pawn은 멤버 변수로 AI Controller Class를 가지고 있기 때 문에 설정만 해주면 된다.
  • 38. GetPlayerPawn GetPlayerPawn 내부를 본다. GetPlayerController 함수를 호 출하고 그 함수까지 보면 FConstPlayerControllerIterator 이라는 언리얼에서 제공해주는 반복자를 통해 월드의 오브젝 트를 탐색한다. 이는 언리얼에서 제공하는 반 복자에 대한 부분을 이야기하 기 위해 보여주었다.
  • 39. TActorIterator<ActorType> 또 다른 방법으로 플레이어 액터를 찾는다면 EngineUtil.h의 TActorIterator<ActorType>를 사용하여 원 하는 액터 타입으로 찾을 수 있다. 참고자료: UE4 C++ 프로그래밍 입문 → 오브젝트/액터 이터레이터 항목 http://api.unrealengine.com/KOR/Programming/Introduction/index.html
  • 40. Assert check(값), 값이 false일 경우 엔진 크래시를 발생시킨다. 참고자료: 어서트 http://api.unrealengine.com/KOR/Programming/Assertions/
  • 41. UE_LOG 출력 로그에 로그를 남겨주는 매크로