[UE5] TIL - 11 <Possession, AddActorLocalOffset>

ChangJin·2024년 3월 24일
0

Unreal Engine5

목록 보기
38/114
post-thumbnail

2024-03-24

깃허브!
https://github.com/ChangJin-Lee/ARproject
https://github.com/ChangJin-Lee/ToonTank

느낀점
Possession에 대해서 배웠다. 월드에서 폰을 제어하고 어떤 폰에 카메라를 부착하여 플레이어로만들어야 하는지 알게 되었다. 그리고 Axis Mapping을 통해 플레이어의 움직임을 제어하는 방법에 대해 배웠다. 이전에는 블루프린트로 연결해서 구현했는데 이번에는 C++ 코드를 써서 구현한다! 매우 흥미롭다. 그리고 AddActorLocalOffset으로 월드 기즈모가 아니라 로컬 기즈모의 움직임에 대해서 배웠다. FVector에 FVector::ZeroVector가 있다는 것도 알게 되었다.

TIL

  • Possession
  • Axis Mappings
  • AddActorLocalOffset

Possession

https://dev.epicgames.com/documentation/ko-kr/unreal-engine/possessing-pawns-in-unreal-engine?application_version=5.3

  • 월드 안에서 폰을 제어하는 방법이다. 한글로는 폰 빙의라고 한다.
  • 캐릭터 전환, 캐릭터가 비히클에 탑승하거나, 별도로 제어되는 다른 폰을 제어하게 하려는 경우에 입력 정보를 전달하기 위해 그 캐릭터 또는 폰을 빙의한다.


  • 위와 같이 auto Possess player를 선택해주면 해당 폰이 플레이어가 되어 카메라를 통해 볼 수 있게 된다!
  • 월드에 플레이어는 1명이어야 하므로 player0은 한 명만 해주면 된다.
  • 만약 여러 폰에 palyer0을 설정하면 엔진이 어떤 폰을 player0로 설정해야할지 몰라서 랜덤하게 줘버린다.
  • player1을 추가하면 화면이 2개로 나뉘어서 보인다. 즉 여기서 보이는 player0 ~ 9는 멀티플레이에서의 그 플레이어들이 아니라 1개의 pc에서 여러 사용자가 사용하는 방법이다. 예전에 오락실에서 2인용으로 게임하던 그 방법이라고 생각하면 된다.

Axis Mappings

https://docs.unrealengine.com/4.27/ko/ProgrammingAndScripting/ProgrammingWithCPP/CPPTutorials/FirstPersonShooter/2/2/

  • 축 매핑에 대해서 배웠다. 프로젝트 세팅에서 Input으로 제어하는 그 방법이다.

  • w, s 키가 매핑되어 매 프레임마다 Move 함수를 계속해서 호출하면서 float Value 값을 넘겨준다.

  • Move( float Value) 요 함수가 계속해서 실행된다. 콜백 함수를 만들어서 우리가 직접 값을 가지고 처리를 할 수 있다!

  • 가상 함수를 오버라이드한 SetupPlayerInputComponent가 있는 SetupPlayerInputComponent 함수의 부모 버전을 호출해 주는 거라서 인풋을 넘겨야한다.

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

	// 문자열 리터럴(축 이름), 함수를 바인드하는 대상 객체의 포인터(게임 안에 있는 폰 탱크), 함수의 주소 
	PlayerInputComponent->BindAxis(TEXT("MoveForward"), this, &ATank::Move);
}

AddActorLocalOffset

https://dev.epicgames.com/documentation/en-us/unreal-engine/API/Runtime/Engine/GameFramework/AActor/AddActorLocalOffset?application_version=5.3

  • AddActorLocalOffset을 사용해서 탱크의 로컬 기즈모를 이동시킬 수 있다.

  • FVector를 FVector(0.0f,0.0f,0.0f) 로 초기화해서 사용했는데 FVector에는 FVector::ZeroVector라는 녀석이 이미 있었다.

  • 그리고 움직임은 Tank만 하고 있으니 Tank.h, Tank.cpp에서 움직임을 제어할 수 있게끔 코딩해야한다. BasePawn에서는 움직임은 없애면 됨.

void ATank::Move(float Value)
{
	// UE_LOG(LogTemp, Display, TEXT("Value : %f"), Value);
	// FVector DeltaLocation;
	// DeltaLocation = FVector(0.0f,0.0f,0.0f);
	
	FVector DeltaLocation = FVector::ZeroVector;
	DeltaLocation.X = Value;
	AddActorLocalOffset(DeltaLocation);
}
  • 앞으로는 이동속도 제어와 회전 제어를 배울 차례다!
profile
게임 프로그래머

0개의 댓글