언리얼 5

231024 언리얼을 활용한 2D Game 제작 (움직임, 정적 카메라, 타일맵)

슬뷔 2023. 10. 25. 10:06

* 부모에 영향을 받지 않게 스프라이트의 스케일 부분을 절대 스케일로 변경한다.

계층 구조이기 때문에, 캡슐 밑에 자식으로 스프라이트 오브젝트가 있어서 캡슐 컴포넌트의 스케일을 줄이면 스프라이트 오브젝트도 줄어든다.

2DGame 폴더 -> Input -> IA_Move 생성

* 2D 이기 때문에, 값 타입을 Axis 1D(float) 으로 설정

 

2DGame 폴더 -> Input -> IA_Jump 생성

값 타입을 bool 으로 설정

 

2DGame 폴더 -> Input -> IMC_Character2D 생성

1. IA_Move

(1)

방향키 <- (좌)

Modifiers => Negate

Trigger => Down

 

(2)

방향키  -> (우)

Trigger => Down

 

2. IA_Jump

스페이스

Trigger => 눌림

 

Character2D_Base IMC, Move, Jump 액션 바인딩 C++ 작성

void ACharacter2D_Base::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
	Super::SetupPlayerInputComponent(PlayerInputComponent);

	UEnhancedInputComponent* InputCom = Cast<UEnhancedInputComponent>(PlayerInputComponent);
	if (nullptr == InputCom)
		return;
		
	if (!MoveAction.IsNull())
	{
		InputCom->BindAction(MoveAction.LoadSynchronous(), ETriggerEvent::Triggered, this, &ACharacter2D_Base::MoveFunc);
	}

	if (!JumpAction.IsNull())
	{
		InputCom->BindAction(JumpAction.LoadSynchronous(), ETriggerEvent::Triggered, this, &ACharacter2D_Base::JumpFunc);		
	}
}


BPC_Link 입력 설정

Character2D_Base 에 Move, Jump 함수 제작

UCLASS()
class UNREAL_3TH_API ACharacter2D_Base : public APaperCharacter
{
	GENERATED_BODY()
	// Input Action
public:
	void MoveFunc(const FInputActionInstance& _Instance);
	void JumpFunc(const FInputActionInstance& _Instance);
}

==========================================================================================

void ACharacter2D_Base::MoveFunc(const FInputActionInstance& _Instance)
{
	//LOG(Player, Log, TEXT("Move"));
	float fInput = _Instance.GetValue().Get<float>();		

	// 입력 키에 따른 캐릭터 상태 및 방향 변경
	if (1 == fInput)
	{
		ChangeState(EPLAYER2D_STATE::MOVE, EPLAYER2D_DIR::RIGHT);		
	}
	else if (-1 == fInput)
	{
		ChangeState(EPLAYER2D_STATE::MOVE, EPLAYER2D_DIR::LEFT);		
	}

	// 캐릭터 이동
	AddMovementInput(FVector(1.f, 0.f, 0.f), fInput);
}

void ACharacter2D_Base::JumpFunc(const FInputActionInstance& _Instance)
{
	//LOG(Player, Log, TEXT("Jump"));
	Jump();
}

Character2D_Base 의 Tick 함수에서 Velocity 가 0 일 때, Idle State로 전환

void ACharacter2D_Base::Tick(float _DT)
{
	Super::Tick(_DT);

	if (GetMovementComponent()->Velocity.IsZero())
	{
		ChangeState(EPLAYER2D_STATE::IDLE, CurDir);
	}
}

* 애니메이션 속도가 빠르거나 느리다면 Flipbook 들어가서 디테일에 초당 프레임 조절하기.

 

정적 카메라(카메라 강제 고정)

=> 특정 트리거를 지나가면 cctv 화면 전환하는 것처럼 카메라 view가 전환되는 방식.

https://docs.unrealengine.com/5.0/ko/using-a-static-camera-in-unreal-engine/

 

스태틱 카메라 사용하기

스태틱 카메라를 사용하여 여러 플레이어 시점을 블렌딩하는 방법에 대한 하우투 가이드입니다.

docs.unrealengine.com

 

액터 배치 -> 카메라 액터 추가

디테일 -> 카메라 세팅 

투영 모드 Orthographic

* 편집 -> 에디터 개인설정 -> preview 검색 -> 카메라 프리뷰 크기 3 으로 키움!

 

Character2D_Base 에 카메라 액터 멤버변수 추가

class UNREAL_3TH_API ACharacter2D_Base : public APaperCharacter
{
	GENERATED_BODY()
private:
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Component, meta = (AllowPrivateAccess = "true"))
	UCameraActor*		CamActor;
}

BPC_Link 에 생성된 CamActor 멤버 변수 선택

Character2D_Base 의 BeginPlay 에서 카메라 시점 옮겨보기

* 시점을 이동시킬 때 쓸 수 있는 함수가 controller 가 가지고 있다.

void ACharacter2D_Base::BeginPlay()
{
	Super::BeginPlay();

	// 카메라의 시점 옮겨보기
	if (IsValid(CamActor))
	{		
    		// 5초에 걸쳐서 시점 이동
		pController->SetViewTargetWithBlend(CamActor, 5.f);
	}
}

 

* 카메라 클릭 -> 우클릭 -> CameraActor 파일럿 (Ctrl + Shift + P) 클릭 

=> 현재 이 카메라가 바라 보는 시점을 볼 수 있다.

 

Lock 걸고 싶은 지점에 Trigger Box 생성해서 카메라 전환 

 

타일맵 생성

2DGame 폴더 -> TILE 텍스쳐 우클릭 -> 스프라이트 액션 -> 타일 시트 생성

TILE 폴더 생성해서 TILE_TileSet 넣기

 

우클릭 -> 페이퍼 2D -> 타일맵 생성 -> TileMap

TileMap 을 눌러서 TILE_TileSet 을 넣어준다.

TILE_TileSet 

타일 1칸 64px * 64px

충돌처리를 하고 싶다면 박스 추가를 눌러서 저장

* 콜리전 데이터를 누르면, 박스 추가를 했기 때문에 셰이프에 BOX 가 생성되어 있다.

이를 삭제하면, 충돌(?)이 사라지게 된다.

 

* TileMap -> 채우기 버튼 누르면 전체 그림판의 페인트처럼 다 채워진다.

수풀 -> 충돌체 X , 돌 -> 충돌체 O / 디테일 -> 콜리전 -> 콜리전 두께

* 콜리전 두께가 어느 정도 두꺼워야지만 캐릭터가 그 위로 올라설 수 있다.

 

* 캐릭터 Blueprint (BPC_Link) 가 사용하는 기본 재질 광원 적용되게 변경

셰이딩 모델 Unlit -> Default Lit 로 변경해서, 광원 연산 받을 수 있게 설정하고 이미시브 컬러 -> 베이스컬러로 변경