[UE5] TIL - 13 <AddActorLocalRotation, AddActorLocalOffset>

ChangJin·2024년 4월 1일
0

Unreal Engine5

목록 보기
40/114
post-thumbnail

2024-04-01

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

느낀점
AddActorLocalOffset의 bSweep에서 목적지 위치로 가는 도중에 중첩을 발생시킬지, 아니면 충돌검사를 해서 충돌했을때 멈추게 할지를 정할 수 있었다. AddActorLocalRotation으로 물체를 회전하는 방법에 대해서 배웠다. FRotator를 쓰는 방법과 FQuat을 쓰는 방법이 있는데 FRotator를 사용해보았다.

TIL

  • AddActorLocalOffset
  • AddActorLocalRotation
  • Roll, Pitch, Yaw

AddActorLocalOffset

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


  • 로컬 레퍼런스 프레임에서 이 구성요소의 위치에 델타값을 추가할 수 있다. 매개변수는 총 3개이며, 다음과 같다. bSweep같은 경우에는 true, false로 나타내는 bool 타입이다!
이름설명
DelatLocation로컬 공간에서의 위치 변화.
bSweep목적지 위치로 쓸어갈 것인지, 도중에 중첩을 발생시킬 것인지, 무엇인가에 의해 막혔을 때 목표물에 도달하지 못한 채 멈출 것인지 여부. 루트 구성요소만 스윕되어 충돌 차단을 확인하고, 하위 구성요소는 스윕 없이 이동합니다. 충돌이 꺼져 있으면 아무 효과가 없습니다.
bTeleport물리 상태를 순간 이동할지 여부(이 개체에 대해 물리 충돌이 활성화된 경우). true인 경우 이 개체의 물리적 속도는 변경되지 않습니다(따라서 봉제 인형 부분은 위치 변경에 영향을 받지 않습니다). false인 경우 물리 속도는 위치 변화에 따라 업데이트됩니다(래그돌 부품에 영향을 미침). CCD가 켜져 있고 순간 이동하지 않는 경우 전체 스윕 볼륨을 따라 개체에 영향을 미칩니다.
  • 기존의 Move 함수에서 다음처럼 매개변수를 추가해주면 충돌 판정이 되어 물체에 부딪치게 된다!

void ATank::Move(float Value)
{
	FVector DeltaLocation = FVector::ZeroVector;
	double deltaTime = UGameplayStatics::GetWorldDeltaSeconds(this);
	DeltaLocation.X = Value * deltaTime * moveSpeed;
	// 2번째 매개변수는 bSweep이고 물체가 부딪치게끔 해준다
	AddActorLocalOffset(DeltaLocation, true);
}


AddActorLocalRotation

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

  • 물체에 회전을 추가한다. FRotator를 사용하는 방법이 있고 FQuat을 사용하는 방법이 있다. 이번에는 FRotator를 사용해서 구현했다.

  • 다음처럼 헤더파일에 turnRate 변수와 Turn 함수를 선언해주었다.
private:
	UPROPERTY(VisibleAnywhere, Category = "components")
	class USpringArmComponent* springarm;

	UPROPERTY(VisibleAnywhere, Category = "components")
	class UCameraComponent* camera;

	UPROPERTY(EditAnywhere, Category = "Movement")
	float moveSpeed = 800.0f;

	UPROPERTY(EditAnywhere, Category = "Movement")
	float turnRate = 80.0f;

	void Move(float Value);
	void Turn(float Value);

  • 다음처럼 cpp 파일에는 Turn 함수를 만들었고 turnRate 변수를 사용했다.
void ATank::Turn(float Value)
{
	FRotator DeltaRotation = FRotator::ZeroRotator;
	// Yaw = Value * DeltaTime * TurnRate
	double deltaTime = UGameplayStatics::GetWorldDeltaSeconds(this);
	DeltaRotation.Yaw = Value * deltaTime * turnRate;
	AddActorLocalRotation(DeltaRotation, true);
}

void ATank::Move(float Value)
{
	FVector DeltaLocation = FVector::ZeroVector;
	double deltaTime = UGameplayStatics::GetWorldDeltaSeconds(this);
	DeltaLocation.X = Value * deltaTime * moveSpeed;
	AddActorLocalOffset(DeltaLocation);
}


Roll, Pitch, Yaw

https://blog.naver.com/milkysc/221754450137

  • Roll
    - 물체의 X축을 기준으로 회전반경을 나타낸다

  • Pitch
    - 물체의 Y축을 기준으로 회전반경을 나타낸다

  • Yaw
    - 물체의 Z축을 기준으로 회전반경을 나타낸다

profile
게임 프로그래머

0개의 댓글