안녕하세요. 언리얼 엔진을 공부하고 있는 마네마네라고 합니다.
챕터1에서는 기본적인 세팅과 프로젝트 생성 방법을 배웠습니다.
이번에는 챕터2 기본적인 액터를 생성해보도록 하겠습니다.
우선 C++에서 사용할 수 있는 액터를 생성해 주도록 합니다.
액터를 생성할 때는 C++을 이용하여 컴포넌트들을 넣을 것이기 때문에
C++ 클래스 폴더에서 생성해 주도록 합니다.
새 액터의 이름은 Fountain으로 클래스 생성을 해줍니다.
클래스가 생성이 되면 비주얼 스튜디오 Fountain.h 파일과 Fountain.cpp 파일이 추가된 모습을
볼 수 있습니다.
다음으로는 생성한 액터에 컴포넌트를 추가해보도록 하겠습니다.
- "EngineMinimal.h" 헤더파일을 추가
- UPROPERTY()
- UStaticMeshComponent* Body
- UPROPERTY()
- UStaticMeshComponent* Water
위에 있는 내용을 작성해주도록 합니다. Fountain 액터에 스태틱메시컴포넌트 Body와 Water를 포인터로
선언해줍니다.
포인터로 선언했으므로 앞으로 구현부에서는 메모리를 동적으로 할당해 대입할 것입니다.
그리고 언리얼 실행 환경이 선언한 객체를 자동으로 관리하게 만들려면 UPROPERTY라는 매크로를 사용해
객체를 지정해 줘야 합니다.
여기서 중요한 점은 헤더 파일을 추가하더라도 .generated.h" 위에 추가해 주어야 합니다.
만약 그 밑에 추가할 경우 컴파일이 되지 않습니다.
헤더 파일에 액터의 선언이 끝났으면 이제 정의 파일 Fountain.cpp 로 이동하여 해당 코드를
작성해 줍니다.
- Body = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("BODY"))
- Water = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("WATER"))
- RootComponent = Body
- Water->SetupAttachment(Body)
이렇게 두 컴포넌트를 생성해주고 각각 이름은 부여합니다.
그리고 그중에서 액터를 대표할 루트 컴포넌트를 지정해야 합니다.
분수대 구조물을 담당할 Body 컴포넌트가 대표성을 띠므로 루트 컴포넌트로 지정하고
Water는 Body의 자식으로 설정합니다.
컴파일을 하고 언리얼 에디터에 들어가보면 컴포넌트가 추가 된 모습을 볼 수 있습니다.
컴포넌트의 속성을 편집하기 위해서는 컴포넌트의 선언에 특별한 키워드를 등록해야 합니다.
VisibleAnywhere 라는 키워드를 추가해주고 컴파일을 합니다.
인리얼 에디터에 들어가보면 이제 편집이 가능해지도록 변한걸 볼 수 있습니다.
그리고 해당 액터에 Body와 Water 스태틱 메시 컴포넌트를 추가해 줬기 때문에 스태틱 메시 애셋을 지정해
각각 분수대와 물을 표현해 주도록 합니다.
- SM_Plins_Castle_Fountain_01
- SM_Plains_Fountain_02
그리고 물의 위치를 맞추기 위해서 z값을 135로 변경해주도록 합니다.
이제 분수대 액터에 조명과 물이 찰랑이는 이펙트를 추가해 분수대를 좀 더 풍성하게 꾸며보도록
하겠습니다.
- #include "Engine/Classes/Particles/ParticleSystemComponent.h"
- UPROPERTY(VisibleAnywhere)
- UPointLightComponent* Light -> 조명
- UPROPERTY(VisibleAnywhere)
- UParticleSystemComponent* Splash -> 물 효과
fountain.cpp 에도 추가해 주도록 합니다.
- Light = CreateDefaultSubobject < UPointLightComponent>(TEXT("LIGHT"))
- Splash = CreateDefaultSubobject<UParticleSystemComponent>(TEXT("SPLASH"))
- Light->SetupAttachment(Body)
- Splash->SetupAttachment(Body)
- Light->SetRelativeLocation(FVector(0.0f, 0.0f, 195.0f))
- Splash->SetRelativeLocation(FVector(0.0f, 0.0f, 195.0f))
액터에 컴포넌트가 추가된 것을 확인할 수 있다.
파티클 효과는 밑에 것을 추가해 주도록 한다.
- P_Water_Fountain_Splash_Base_01
이번에는 멤버 변수를 추가해 보도록 하겠습니다.
ID 라는 이름을 가진 정수 유형의 멤버 변수를 추가합니다.
- UPROPERTY(VisibleAnywhere)
- int32 ID
변수가 추가된 모습을 확인할 수 있다.
하지만 데이터를 변경할 수 없다.
그렇기 때문에 UPROPERTY 키워드를 EditAnywhere,Category=ID 이렇게 바꿔주도록 한다.
그럼 어디서든 수정이 가능하고, 카테고리는 ID를 가지게 된다.
UPROPERTY를 변경하니 언리얼 에디터 안에서도 값을 수정할 수 있게 바뀐 것을 볼 수 있다.
그리고 액터에 스태틱메시를 C++를 통해 지정해주도록 한다.
우선 자신이 액터에 넣을 스태틱메시의 레퍼런스를 알아야한다.
레퍼런스의 주소는 자신이 원하는 스태틱메시의 오른쪽 클릭 > 레퍼런스 복사를 누르면
자동으로 해당 경로가 복사가 된다.
복사가 된 경로를 C++ .cpp 파일에 ConstructHelpers라는 클래스의 FObjectFinder를 사용해
해당 변수를 선언한다.
이 변수에는 경로 값을 전달한다.
그리고 if 문을 이용하여 .Succeeded() 를 통해 해당 경로에 애셋이 있는지를 검사한다. ( bool 값이다. true/false )
만약 있다면 Body 의 스태틱메시를 저장한 경로의 해당 애셋으로 바꿔준다.
코드를 넣고 컴파일하면 언리얼 엔진이 꺼질 수도 있지만 당황하지 않고 그냥 재시작을 시켜주면 된다.
참고로 static으로 선언하는 이유는 에셋의 경로 정보는 게임 실행 중에 변경될 일이 없기 때문에
게임에서 생성자 코드가 여러 번 호출될 때마다 지역 변수를 생성하고 초기화하는 것은 불필요한 작업이라고
할 수 있기 떄문에 가능하다면 해당 지역 변수는 static으로 선언해 처음에 한 번만 초기화하는 것이
바람직하다.
이것은 완성된 코드이다.
모두 경로를 불러와 저장한 다음 지정해 주었다.
여기까지 챕터 2 액터의 설계에 대한 설명이였습니다.
'언리얼 엔진 > [책] 이득우의 언리얼 C++ 게임 개발의 정석' 카테고리의 다른 글
[챕터1] 예제 프로젝트 파일 추가 (0) | 2021.01.23 |
---|---|
[챕터1] 예제 프로젝트 생성 및 예제 패키지 추가 (0) | 2021.01.23 |
[챕터1] 개발 환경 설정 - 비주얼 스튜디오 2019 작업환경 설정 (0) | 2021.01.22 |
[챕터1] 개발 환경 설정 - 언리얼 엔진 4 C++ 프로젝트 생성 (0) | 2021.01.22 |
[챕터1] 개발 환경 설정 - 비주얼 스튜디오 2019 설치 (0) | 2021.01.22 |