[UE5]툰 탱크-2

칼든개구리·2024년 12월 9일
0

[언리얼TO리얼]

목록 보기
10/42


베이스 폰 클래스에 컴포넌트가 필요하다는 것을 알게 되었다!
탱크와 포탑 아랫부분의 베이스 메시가 필요하며 윗 부분의 매시도 있어야 한다.
콜리전을 처리할 캡슐과 발사체 스폰 포인트도 있어야 한다.

BasePawn을 기반으로 탱크를 만들고 똑같이 베이스 폰을 기반으로 하는 타워를 만들면 된다!
탱크는 기본적으로 베이스 메시, 포탑 메시, 캡슐, 발사체 스폰 포인트를 가질 수 있다(타워또한)

	UPROPERTY()
	UCapsuleComponent* CapsuleComp;

UCapsuleComponent는 포인터로 선언한다. 포인터는 가볍고 주소뿐이고 더 효율적이다.
UPROPERTY()는 언리얼 엔진이 이 변수를 언리얼 엔진 리플렉션 시스템에 참여할 수 있게 한다.
리플렉션 시스템을 사용하면 이 변수를 블루프린트에 노출시키고 가비지 컬렉션에 참여하도록 하는 등의 작업을 할 수 있게 한다.
UCapsuleComponent를 헤더파일에 인식 시키려고 하니, 헤더파일에 데리고 오면 이것과 관련된 주석과 모든 것을 이 파일에 붙여넣는다고 한다. 결과적으로 여기에 포함된 파일의 모든 내용을 이 파일에 붙여넣었기 때문에 파일이 커진다.
해결방법은 전방선언이다!-> 클래스 키워드를 사용해 UCapsuleComponent 타입을 전방선언한다.
타입의 포인터를 전방선언하여 헤더파일이 필요하지 않도록 할 수 있다.

전방 선언 하는 이유?
UCapsuleComponent의 포인터 변수가 있어야 하는 BasePawn이라는 클래스가 있다고 한다.
UCapsuleComponent는 CapsuleComponent.h 헤더파일 안에 있고 UCapsuleComponent 타입의 프로젝트를 생성할 때 BasePawn의 타입을 사용하려 한다.
BasePawn.h에서 실제로 필요한 것은 UCapsuleComponent 타입의 포인터 뿐이다,

사실 BasePawn.h에는 캡슐 컴포넌트 클래스의 구현 디테일이 필요하지 않다.
다시 말해 함수가 어떠허게 정의되는지, 캡슐 컴포넌트 클래스가 얼마나 큰지도 알 필요가 없다.
캡슐 컴포넌트의 포인터는 다른 포인터와 크기가 같다
BasePawn 클래스에서는 캡슐 컴포넌트를 생성하고자 한다. 이 오브젝트를 만드는데 필요한 메모리를 계획하려면 캡슐 컴포넌트의 크기를 알아야 한다. BasePawn.h에는 캡슐 컴포넌트 헤더가 굳이 필요하지 않지만 BasePawn.cpp에는 필요하다. 필요할 때만 헤더를 포함하는 것이 좋은 프로그래밍이다.
BasePawn.h의 UCapsuleComponent 포인터 타입의 포인터를 선언하지 않고 구현 세부 사항이 필요한 CapsuleComponent.h를 포함할 수 있는데 이는 지금 캡슐 컴포넌트를 생성하고 있으며 메모리 UCapsuleComponent의 크기를 알아야 한다.
헤더 파일은 다른 파일에 포함되도록 디자인 되었다. -> 파일이 커지고 컴파일 시간이 매우 늘어남

말이 많았지만 전방 선언도 메모리 관리를 위한 한편의 방법이라는 것을 배우고 간다~!~

profile
메타쏭이

0개의 댓글