Garbage Collection : 기본적으로 C++에서 메모리 관리는 프로그래머의 책임이다. UObject를 상속받은 경우 UPROPERTY 매크로를 사용하고 상속받지 않은 경우는 스마트 포인터로 관리한다.
Reference Updating
Reflection : 런타임에 어떤 클래스의 정보를 알고 싶다면? -> C++에는 Reflection이 없어서 못한다. 다만 언리얼 엔진에서는 억지로 만들었다.
Serialization (직렬화) : *별첨
Automatic Updating of Default Property Changes
Automatic Property Initialization
Automatic Editor Integration
Type Information Available at Runtime : C++에서의 RTTI는 dynamic_cast가 있다. 언리얼에서는 UObject를 상속 시, 타입 정보 관리가 추가되어서 Cast<>를 사용할 수 있다.
Network Replication : Client/Server 구조의 100명 이하의 게임을 만들 때 (특히 FPS) 유용하다. 온라인 게임에서는 동기화가 가장 큰 이슈이다. 하지만 UObject를 상속 받으면 Replication을 지원한다. 참고로 MMORPG를 만든다면 개념이 완전히 달라져서 Replication을 쓸 수 없다. 그때는 별도의 서버를 사용해야 한다.
Serialization (직렬화)
메모리를 디스크에 저장하고나 네트워크 통신에 사용하기 위한 형식으로 변환하는 것. (일종의 파싱)
참조 형식 데이터는 사용할 수 없고 값 형식 데이터만 사용할 수 있다.
참조 형식 데이터는 실제 데이터가 아닌 메모리 번지 주소를 가지고 있기 때문이다.
Actor
Actor를 상속 받으면 SRT(Scale, Rotation, Translation)좌표가 생기는것은 아니다.
SRT좌표는 씬 컴포넌트가 담당한다.
Actor를 상속받으면 컴포넌트를 붙일 수 있다는 것이 가장 중요한 특징이다.
Unity에서 GameObject를 만들어서 컴포넌트를 조립하는 것과 비슷하다.
Pawn
병졸..?
Controller
영혼이라고 보면 된다.
Character
캐릭터는 폰을 상속받는다.
Character Movement라는 컴포넌트를 제공한다. 캡슐 기반의 간단한 이동이 가능하지만 꼭 사용할 필요는 없다.
참고로 UE3에서는 폰만 있다.
Pawn과 Controller를 따로 분리한 이유
행동이라는 개념을 별도의 Controller로 관리하면 코드 재사용성이 증가한다.
Behavior Tree 등 언리얼에서 제공하는 AI 기능을 이용할 수 있다.
통상적으로 말하는 MVC 개념과도 비슷하다. (Model: Pawn, View: Component, Controller: Controller)
타겟을 탐지하고(서비스:SearchTarget) -> 200만큼 범위안에 들어왔는지 체크하고(데코레이터:CanAttack) -> 공격
이 순서로 작동하게 될 것이다.
다만 현재는 태스크 실행시 Attack 함수를 호출하여 애니메이션 몽타주를 재생하고 bIsAttacking을 true로 변경하는 것은 있지만 다시 false로 되돌리는 부분이 없다.
그럼 공격이 끝난 시점은 어떻게 구분하면 되는가?
일전에 MyCharacter에서도 공격 시작시 애니메이션 몽타주가 재생되면서 IsAttacking이 true로 설정되었다가 몽타주 재생이 끝나면 OnAttackMontageEnded 함수에 의해 false로 되돌리는 부분이 있었다. 그것을 OnMontageEnded 델리게이트에 등록함으로써 몽타주 종료시 호출되게끔 했었다.
그것과 마찬가지로 델리게이트에 등록해서 몽타주 재생이 끝날 시 호출하면 될 것이다. 다만 직접 호출은 아니고 공격 모션이 끝나면 bIsAttacking을 false로 변경하는 함수를 구독시키고 Broadcast로 쏴줄 것이다.