728x90
CS
모던 객체 지향 설계 원칙
- 유지보수와 유연함, 확장성 향상을 위한 객체 지향 프로그래밍 원칙(SOLID)
- Single responsibility principle
- 하나의 클래스는 하나의 책임만 가져야 한다.
- Open/closed principle
- 클래스 설계를 변경하지 않고 동작을 확장할 수 있어야 한다.
- Liskov subsititution principle
- 작고 명확한 인터페이스들로 분리해 관리해야 한다.
- Dependency inversion principle
- 구현을 배제시킨 상위 정책을 바라보며 설계해야 한다.
- Single responsibility principle
상위 언어의 기능
- 인터페이스(interface)
- 객체 설계의 틀을 제공하는 추상 클래스
- 리플렉선(Reflection)
- 런타임에서 객체의 구조를 파악하고 객체에 메타데이터를 부여한다.
- 델리게이트(Delegate)
- 프로그램에서 발생한 이벤트를 다수의 객체에 효과적으로 전달하는데 활용한다.
UE5
언리얼 오브젝트
- 언리얼 엔진이 설계한 새로운 시스템의 단위 오브젝트(객체)
- 기존 C++ 오브젝트에 모던 객체 지향 설계를 위해 다양한 기능을 추가한 오브젝트
- 일반 C++ 오브젝트와 언리얼 오브젝트의 두 객체 모두 사용가능
- C++ 오브젝트는 F, 언리얼 오브젝트는 접두사 U를 사용한다.
- 각 오브젝트의 사용 용도
- C++ 오브젝트
- 저수준의 빠른 처리를 위한 기능 구현에 사용한다.
- 언리얼 오브젝트
- 콘텐츠 제작에 관련된 복잡한 설계 구현에 사용한다.
- C++ 오브젝트
- 언리얼 오브젝트가 되기위해 선언해야하는 헤더
- #include "CoreMinimal.h" #include "UObject/NoExportTypes.h"
UCLASS 매크로
- UClass 매크로는 UObject 에게 자신의 언리얼에서 기반으로 삼은 유형에 대해 설명해 주는 UClass 로의 레퍼런스를 넘겨준다. 각 UClass 는 Class Default Object, 줄여서 CDO라 불리는 오브젝트를 하나 유지한다. CDO는 본질적으로 기본 템플릿 오브젝트로, 클래스 생성자에 의해 생성된 이후 변경되지 않는다.
- UClass 에는 클래스를 정의하는 프로퍼티와 함수 세트가 들어있다. 이들은 네이티브 코드에서 사용할 수 있는 일반 C++ 함수와 변수이지만, 오브젝트 시스템 안에서의 동작을 제어하는 언리얼 전용 메타데이터가 붙어 있다.
오브젝트 생성
- new UObject 인스턴스는 물론 그 표준 new 연산자를 만드는 데도 사용할 수 있는 함수가 여럿 있으며, 각각의 용례는 다음과 같다.
메서드 설명
NewObject<class>() | 자동 생성되는 이름으로 새 인스턴스를 만듭니다. 단순한 클래스를 생성할 때 자주 쓰이는 방법입니다. |
NewNamedObject<class>() | 지정된 이름과 함께 약간의 파라미터 옵션으로 새 인스턴스를 만듭니다. 이름이 새 인스턴스의 Outer 와 충돌하는 경우 어서트가 발생합니다. |
ConstructObject<class>() | 가능한 모든 생성 옵션으로 새 인스턴스를 만듭니다. 유연성이 필요한 때만 사용합니다. |
new | 생성자가 인수를 필요로 할 때와 같이, 특정 로우 레벨 환경에서 오브젝트를 생성할 때 사용합니다. |
UObject에 제공되는 함수성
- 모든 경우에 이 시스템을 사용하는 것이 필수적이지도 심지어 적절하지도 않지만, 그렇게 하면 다음과 같은 장점이 있다.
- 가비지 컬렉션
- 레퍼런스 업데이트
- 리플렉션
- 시리얼라이제이션
- 디폴트 프로퍼티 변경사항 자동 업데이트
- 자동 프로퍼티 초기화
- 자동 에디터 통합
- 실행시간에 유형 정보 사용가능
- 네트워크 리플리케이션
언리얼 헤더 툴
- UObject 파생 유형에 제공되는 함수성을 활용하기 위해서, 해당 유형에 대해 헤더 파일에서 전처리 단계를 거쳐 줘야 필요한 정보를 수집할 수 있다. 이러한 전처리 단계는 Unreal Header Tool(언리얼 헤더 툴), UHT에서 이루어진다.
헤더 파일 포맷
- 소스 파일의 UObject 구현이 다른 C++ 클래스와 똑같이 이루어지기는 하지만, 헤더 (.h) 파일의 정의는 특정 기본 구조를 준수해야 언리얼 엔진 4 에서 정상 작동한다. 에디터의 "새 C++ 클래스" 명령이 제대로 된 포맷의 헤더 파일을 구성하기에 가장 쉬운 방법이다. UObject 파생 클래스에 대한 기본 헤더 파일은, UObject 의 파생형이 UMyObject 이고, MyProject 라는 프로젝트에서 생성되었다 가정할 때, 다음과 같아 보일 것인다
#pragma once
#include 'Object.h'
#include 'MyObject.generated.h'
/**
*
*/
UCLASS()
class MYPROJECT_API UMyObject : public UObject
{
GENERATED_BODY()
};
- 이에 대한 언리얼쪽 부분은 다음과 같다.
#include "MyObject.generated.h"
- MyProject 가 UMyObject 클래스를 다른 모듈에 노출시키고자 한다면, MYPROJECT_API 지정이 필수이다. 게임 프로젝트에 포함시킬 모듈이나 플러그인에 가장 좋으며, 의도적으로 다수의 프로젝트에 클래스를 노출시켜 기동성있는 자체 독립적인 함수성을 제공하고자 하는 경우에도 좋다.
class MYPROJECT_API UMyObject : public UObject
- GENERATED_BODY 매크로는 인수를 받지 않으나, 클래스가 엔진에 필요한 인프라 스트럭처를 지원하도록 구성한다. 모든 UCLASS 에 필수이다. 참고로 GENERATED_BODY 매크로는 현재 엔진 버전에서 멤버 액세스 레벨을 언어 기본값인 private 으로 설정하기 보다는 public 으로 설정한다.
오브젝트 업데이트
- Tick (틱)이란 언리얼 엔진에서 오브젝트가 어떻게 업데이트되는지를 일컫는다. 모든 오브젝트는 매 프레임마다 틱 가능해서, 필요한 동작이나 계산을 업데이트할 수 있다.
- Object 에는 내장된 업데이트 기능이 없습니다만, inherits 클래스 지정자를 사용하여 FTickableGameObject 클래스를 상속받음으로써 필요에 따라 추가시킬 수는 있습니다. 그런 다음 Tick() 함수를 구현하면 엔진에 의해 매 프레임마다 호출됩니다. 참고로 대부분의 게임내 오브젝트는 일 것이므로, 프레임당 한 번이 아닌 사용자 설정 최소 간격마다 틱이 가능합니다.
참조
728x90
'Study > TIL(Today I Learned)' 카테고리의 다른 글
24.10.21 UE5 (0) | 2024.10.22 |
---|---|
24.10.18 UE5 (0) | 2024.10.18 |
24.10.14 게임 서버 (0) | 2024.10.14 |
24.10.11 게임 서버 (0) | 2024.10.11 |
24.10.10 게임서버 (4) | 2024.10.10 |