언리얼엔진 학습 및 과제

액터 리플리케이션을 이용한 게임 제작 (2)

park94128 2025. 12. 17. 23:56

● 일단 내가 작업할 환경을 만들자

미리 만들어진 템플릿을 참고하여 나만의 작업 환경을 만들기로 했다. 작업하다가 잘못되거나 모르는 것이 있다면 원본 코드를 참고하여 만들기 위해서다.

제공된 3인칭 맵을 다른 이름으로 저장하고, 지형을 내가 생각한 방향대로 만들었다. 넓게 만들고 경사로와 장애물을 모두 제거했다. 그후 초록색 머티리얼을 사용하는 박스를 네 모서리에 배치했다.

미리 만들어진 캐릭터, 게임모드, 플레이어 컨트롤러를 복사하여 새로운 코드를 생성했다.

블루프린트도 복제했다. 그 다음 내가 생성한 코드를 부모 클래스로 지정했다. 코드를 그대로 복사한 클래스라서 부모 클래스 교체에 실패할 수가 없다.

 

기존 캐릭터가 사용한 애니메이션 블루프린트도 복제했다. 다만 얘는 부모 클래스인 코드가 따로 없어서  C++로 새로 만든 애니메이션 인스턴스를 상속받게 만들었다.

애니메이션 블루프린트를 복제했으니 복제한 캐릭터 블루프린트의 메시에서도 애니메이션을 복제한 것으로 교체한다.

 

● 불필요 요소 제거

언리얼 엔진에서 제공하는 템플릿은 여러 플랫폼에서 사용할 수 있도록 다양한 기능이 추가된 상태다. 예를 들어 미리 제공되는 캐릭터 블루프린트는 모바일 환경에서도 동작할 수 있도록 이벤트 그래프가 미리 완성된 상태다.

 

protected:

	/** Jump Input Action */
	UPROPERTY(EditAnywhere, Category="Input")
	UInputAction* JumpAction;

	/** Move Input Action */
	UPROPERTY(EditAnywhere, Category="Input")
	UInputAction* MoveAction;

	/** Look Input Action */
	UPROPERTY(EditAnywhere, Category="Input")
	UInputAction* LookAction;

	/** Mouse Look Input Action */
	UPROPERTY(EditAnywhere, Category="Input")
	UInputAction* MouseLookAction;

코드에서 예시를 들자면, 작성된 캐릭터의 코드를 보면 여러 개의 인풋 액션이 있는데 LookAction이 터치를 통한 입력이다.

 

protected:
	//점프 입력
	UPROPERTY(EditAnywhere, Category="Input")
	UInputAction* JumpAction;

	//이동 입력
	UPROPERTY(EditAnywhere, Category="Input")
	UInputAction* MoveAction;

	//카메라 방향 (마우스 이동) 입력
	UPROPERTY(EditAnywhere, Category="Input")
	UInputAction* MouseLookAction;

그래서 내가 만든 코드에서는 해당 인풋 액션이 존재하지 않는다.

 

void AMainGameCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
	//입력에 대한 바인딩
	if (UEnhancedInputComponent* EnhancedInputComponent = Cast<UEnhancedInputComponent>(PlayerInputComponent)) {
		
		//점프
		EnhancedInputComponent->BindAction(JumpAction, ETriggerEvent::Started, this, &ACharacter::Jump);
		EnhancedInputComponent->BindAction(JumpAction, ETriggerEvent::Completed, this, &ACharacter::StopJumping);

		//이동
		EnhancedInputComponent->BindAction(MoveAction, ETriggerEvent::Triggered, this, &AMainGameCharacter::Move);

		//카메라
		EnhancedInputComponent->BindAction(MouseLookAction, ETriggerEvent::Triggered, this, &AMainGameCharacter::Look);
	}
	else
	{
		UE_LOG(LogHiddenThief, Error, TEXT("'%s' : 인풋 컴포넌트에 문제가 있습니다."), *GetNameSafe(this));
	}
}

변수를 삭제했으니 그 변수를 사용하는 코드도 삭제한다.

 

 

이처럼 오로지 PC환경에만 집중할 수 있게 나에게 필요하지 않는 부분을 제거했다. 하지만 그러다가 문제가 하나 발생했는데 마우스를 통한 카메라 회전이 먹히질 않았다.

private:
	/** Input Mapping Contexts */
	UPROPERTY(EditAnywhere, Category ="Input|Input Mappings")
	TArray<UInputMappingContext*> DefaultMappingContexts;

	/** Input Mapping Contexts */
	UPROPERTY(EditAnywhere, Category="Input|Input Mappings")
	TArray<UInputMappingContext*> MobileExcludedMappingContexts;

문제가 무엇인가 했는데 플레이어 컨트롤러에 있었다. 처음부터 제공된 에셋 중 인풋 매핑 컨트롤러는 키보드 입력과 마우스 입력이 서로 다른 파일로 존재한다. 그래서 플레이어 컨트롤러는 인풋 매핑 컨텍스트 변수가 2개 있다. 그런데 마우스 입력에 대한 변수의 이름에 'Mobile'이라는 단어가 있다. 그래서 코드를 정리할 때 이 변수가 불필요하다고 생각하여 삭제한 것이 문제였다.

 

private:
	//인풋 매핑 컨텍스트
	UPROPERTY(EditAnywhere, Category = "Input|Input Mappings", meta = (AllowPrivateAccess = true))
	TArray<class UInputMappingContext*> MyInputMappingContexts;

평소에 인풋 매핑 컨텍스트를 1개만 쓰는 나는 이게 헷갈려서 그냥 1개로 통합한 새 인풋 매핑 컨트롤러를 만들었다. 인풋 액션은 그냥 있던거 사용했다.

여기까지 나만의 작업 공간을 만들었다. 마우스도 다시 잘 먹히고, 처음 실행한 것처럼 여전히 액터 및 애니메이션 동기화가 잘 된다.