[Unreal] 16.캐릭터 선택

본 문서는 어소트락 언리얼엔진 게임프로그래머 양성과정의 강의를 토대로 필기한 내용입니다

캐릭터 선택

마우스로 플레이할 직업을 선택 가능하게 구현

캐릭터 선택 제작 순서_애니메이션 이후

  • SelectAnimInstanceUAnimInstance 상속 받아 생성
    • 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를 만들고 타이머가 다 동작하지아

UI

  • 게임모드에 위젯 코드를 작성하면 안된다! -> 서버 연동을 진행할 때, 사용을 할 수 없다

  • 팔레트 : 스크린에 배치할 수 있는 위젯이 배치되어 있음

    • 패널 : 레이아웃 설정에 사용
      • 가로 / 세로 박스
      • 균등 그리드 패널 : 공간 균등 분일 패널
      • 그리드 패널 :
      • 랩 박스 : 왼쪽에서 오른쪽 혹은 위에서 아래로 배치, 랩 사이즈가 넘어서면 다음 줄에 배치
      • 스케일박스: 원래의 크기로 컨텐츠를 배치하고 상자의 영역에 맞게 스케일링
      • 스크롤 박스 : 스크롤 가능한 위젯 모음. 가상화를 지원하지 않음
      • 캔버스 패널 : 캔버스를 통해 수동 레이아웃을 설정할 수 있는 패널. 위젯을 임의의 위치에 배치하고 앵커링할 수 있으며, 캔버스의 다른 자식들와 z 순서로 배치 가능

Slate UI

언리얼의 커스텀 UI 프로그래밍 프레임워크

  • 구현 플로우
    • UserWidget을 상속 받아서 SelectWidget 클래스 생성
    • UIInfo 헤더파일 생성 : UI Info에 관련된 자료 정리
    • 위젯 블루프린트 생성
      • 캔버스 패널 사용
    • 위젯 클래스 타입(mWidgetClass)을 사용할 Actor에서 가지고 있고, 실제 생성될 위젯 인스턴스(mWidget)를 하나 멤버변수로 가짐
    • 생성자에서 위젯 클래스를 클래스 파인더로 찾아내고, 에셋 로드한 정보 mWidgetClass 변수에 할당
    • 사용할 코드에서 mWidgetClass 유효하다면, mWidget을 생성해 내고, 뷰 포트에 생성
    • UIInfo에서 Button 관련 헤더 Components/Button.h include
    • SelectWidget
      • 버튼 포인터타입 멤버변수 하나 선언
      • 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 모듈 추가해서 사용


© 2023 Jinsoo Lee. All rights reserved.

Powered by Hydejack v9.1.6