[Unreal] 16.캐릭터 선택
본 문서는 어소트락 언리얼엔진 게임프로그래머 양성과정의 강의를 토대로 필기한 내용입니다
캐릭터 선택
마우스로 플레이할 직업을 선택 가능하게 구현
캐릭터 선택 제작 순서_애니메이션 이후
SelectAnimInstance를UAnimInstance상속 받아 생성ESelectAnim구조체 클래스 타입으로 만들고 Idle, Select로 선언- 애니메이션 블루프린트 템플릿 ABPT_Select 생성
- 블렌드 포지즈
ESelectAnim을 만들고 각 Sequence Player를 해당 Pose 타입으로 연결 해줌
- 블렌드 포지즈
- 클릭했을 때, GameStart 애니메이션 재생 되게 구현
- ABPT_SelectCharacter를 만들고, Animation Default, Idle, Select Player Sequence를 각각 지정
- 애님 인스턴스 cpp를 만들고, 위 ABPT을 생성자에서 가지고 각각의 직업에 맞는 애니메이션 재생할 수 있게 세팅
- AnimNotify를 이용해서 GameStart 애니메이션이 끝나면 Idle 상태 애니메이션 재생되게 변경
- 클릭 시, 클릭한 캐릭터로 카메라 이동 하는 연출 구현
- 캐릭터 별로 각각 카메라를 배치
- SelectPawn의 카메라를 각각 캐릭터의 카메라(액터)로 타겟을 이동한다
- Controller의
SetViewTargetWithBlend()함수 이용 SetViewTargetWithBlend(AActor*, blendTime, 뷰타겟 블렌드 함수, - , -)- 클릭한 액터가 유효한 경우 카메라 이동, 아닌 경우(맨 땅 클릭) 다시 시작 카메라 포지션으로 변경
mSelectTimer를 만들고 타이머가 다 동작하지아
- Controller의
UI
게임모드에 위젯 코드를 작성하면 안된다! -> 서버 연동을 진행할 때, 사용을 할 수 없다
팔레트 : 스크린에 배치할 수 있는 위젯이 배치되어 있음
- 패널 : 레이아웃 설정에 사용
- 가로 / 세로 박스
- 균등 그리드 패널 : 공간 균등 분일 패널
- 그리드 패널 :
- 랩 박스 : 왼쪽에서 오른쪽 혹은 위에서 아래로 배치, 랩 사이즈가 넘어서면 다음 줄에 배치
- 스케일박스: 원래의 크기로 컨텐츠를 배치하고 상자의 영역에 맞게 스케일링
- 스크롤 박스 : 스크롤 가능한 위젯 모음. 가상화를 지원하지 않음
- 캔버스 패널 : 캔버스를 통해 수동 레이아웃을 설정할 수 있는 패널. 위젯을 임의의 위치에 배치하고 앵커링할 수 있으며, 캔버스의 다른 자식들와 z 순서로 배치 가능
- 패널 : 레이아웃 설정에 사용
Slate UI
언리얼의 커스텀 UI 프로그래밍 프레임워크
- 구현 플로우
UserWidget을 상속 받아서SelectWidget클래스 생성UIInfo헤더파일 생성 : UI Info에 관련된 자료 정리- 위젯 블루프린트 생성
- 캔버스 패널 사용
- 위젯 클래스 타입(mWidgetClass)을 사용할 Actor에서 가지고 있고, 실제 생성될 위젯 인스턴스(mWidget)를 하나 멤버변수로 가짐
- 생성자에서 위젯 클래스를 클래스 파인더로 찾아내고, 에셋 로드한 정보 mWidgetClass 변수에 할당
- 사용할 코드에서 mWidgetClass 유효하다면, mWidget을 생성해 내고, 뷰 포트에 생성
UIInfo에서 Button 관련 헤더Components/Button.hincludeSelectWidget- 버튼 포인터타입 멤버변수 하나 선언
NativePreConstruct()가상항수 오버라이딩해서 생성자 생성 이전에 함수 동작- 버튼 Widget 블루프린트에서 지정한 이름으로 가져와서
UButton타입으로 형변환 후 할당 SetStartButtonEnable()함수 : 기본은 비활성화이다가 캐릭터를 클릭하면 버튼 활성화를 시킬 수 있는 함수- UFUNCTION() 타입으로
StartButtonClick()함수 생성 -> 버튼 클릭될 때 실행할 내용 작성 EPlayerJob구조체를 변수로 가짐 : 버튼활성화 시키면서StartButtonEnable함수 실행,
SelectWidget.h
#include "../GameInfo.h"
#include "UIInfo.h"
class UE20241_API USelectWidget : public UUserWidget
{
GENERATED_BODY()
protected:
UButton* mStartButton;
EPlayerJob mSelectJob;
public:
void SetSelectJob(EPlayerJob Job)
{
mSelectJob = Job;
}
public:
void SetStartButtonEnable(bool Enable);
protected:
UFUNCTION()
void StartButtonClick();
};
SelectWidget.cpp
void USelectWidget::NativePreConstruct()
{
Super::NativePreConstruct();
UE_LOG(UE20241, Warning, TEXT("NativePreConstruct"));
mStartButton = Cast<UButton>(GetWidgetFromName(TEXT("StartButton")));
mStartButton->OnClicked.AddDynamic(this, &USelectWidget::StartButtonClick);
}
void USelectWidget::SetStartButtonEnable(bool Enable)
{
mStartButton->SetIsEnabled(Enable);
}
void USelectWidget::StartButtonClick()
{
FString Option = FString::Printf(TEXT("Job=%d"),
(int32)mSelectJob);
UGameplayStatics::OpenLevel(GetWorld(), TEXT("TestLevel"), true, Option);
}
UIInfo.h
#include "Components/Button.h"
- DPI Scaling
UMG(Unreal Motion Graphic)
프로젝트.Build.cs파일에UMG모듈 추가해서 사용