[UE5]툰 탱크-8

칼든개구리·2024년 12월 10일
0

[언리얼TO리얼]

목록 보기
18/42

이번 시간에는 탱크를 움직이는 것을 해보려고 한다
탱크를 움직이게 하려면 일종의 오프셋을 써야 하는데 언리얼 엔진에서 오프셋을 설정할 때는 어디에 설정하느냐를 정해야 한다. 로컬이냐 월드 스페이스냐?


우리가 맵에서 탱크를 클릭할 때 나오는 기즈모는 화면의 왼쪽 하단에 표시되는 모양과 비슷하다
기즈모의 색은 각각 다른 축을 의미한다. 빨강은 X축, 초록은 Y축, 파랑은 Z죽을 의미한다.
계속해서 회전시켜보면 화면 좌측 하단에 있는 기즈모는 같이 회전한다. 왜냐면 월드의 방향은 바뀌지 않기 때문이다.
지금까지 본게 월드 스페이스 좌표이다. 월드 안에 각 액터는 각자의 로컬 좌표란 게 있다.
언리얼 에디터 화면의 상단에 보면 지구본 같은 것이 존재 하는데, 이는 기즈모 좌표 시스템을 전환해주는 역할을 한다. 월드 좌표계와 로컬 좌표계를 전환해준다.

로컬좌표계로 바꾸게 되면 하단의 기즈모는 여전히 월드 스페이스 기준이고, 폰은 자신만의 축을 가지게 된다.

이번에 알게 된 건, 월드 안에 있는 어떤 액터든 자신만의 좌표계가 있다는 것이다. 로컬 좌표계는 월드 좌표계와 같을 수도, 다를 수도 있다. 그래서 객체를 움직일 때 유의해야 한다.
언리얼 엔진에는 객체를 이동시키는 함수가 있는데, 월드를 위한 것과 로컬을 위한 것이 별도로 존재한다.
AddActorLocalOffset: 이 함수는 액터를 액터의 로컬 좌표계를 기준으로 이동시킨다. 오프셋을 적용한다고 하는데 이건 단일 이동을 의미한다. 어떤 방향으로 얼만큼 움직이라고 명시하면 함수는 대상을 1회 이동시킨다. 즉 탱크를 움직이고 싶은 프레임마다 이 함수를 호출해줘야 한다.
탱크의 로컬 x축은 탱크의 전방이 된다. 로컬 오프셋을 추가할 때 이용할 대상 축이다.

AddActorLocalOffset은 루트 컴포넌트가 널이 아니면 이동 시키는데 루트 컴포넌트에는 다른 컴포넌트들도 붙어있다 즉, 로컬 오프셋을 추가하면 루프 컴포넌트를 이동시키고 다른 컴포넌트도 함께 이동한다는 점을 알아야 한다.

void ABasePawn::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);

	FVector DeltaLocation(0.f);
	DeltaLocation.X = 2.f;
	AddActorLocalOffset(DeltaLocation);

}

BasePawn의 Tick 함수에서 실험을 해볼건데 먼저 FVector을 만들어주고 AddActorLocation함수를 만드는데 첫번째 인수인 FVector을 제외한 3가지는 선택사항이므로 FVector만 채워준다.

실행시켜보면 탱크만 움직이는게 아니라 터렛도 움직이는데 이유는 부모인 basepawn의 tick함수에서 작성했기 때문이다. 중요한 점은 터렛과 탱크가 각각의 x축을 기준으로 움직이고 있다. 이는 각자의 로컬 좌표계를 기준으로 움직인다는 것을 알 수 있다.

마지막으로 탱크만 움직여보기 위해서 탱크의 Move 함수에서

void ATank::Move(float Value) // 매 프레임마다 value값과 호출된다
{
	FVector DeltaLocation = FVector::ZeroVector;
	DeltaLocation.X = Value;
	AddActorLocalOffset(DeltaLocation);
}

x축으로만 왔다갔다 하기 위해서 DeltaLocation.X= Value를 사용했고 결과로는 w누르면 앞으로, s를 누르면 뒤로 잘간다!

profile
메타쏭이

0개의 댓글