본문 바로가기
Unreal Engine5/KDT 2024

[UE5 KDT2024] 19. 에임오프셋

by 유잉유잉유잉 2025. 3. 3.
728x90

 

 

▶️ HasAuthority() : 서버인지 확인해서 bool값 반환 

auto gameMode = GetWorld()->GetAuthGameMode();

bool isServer = HasAuthority();//  서버인지 확인하는 함수

둘 다 사용 가능. 




 

1. 에임 오프셋 마무리 

 

1) PlayerKnight에서 RotationAction override

header

..
virtual void RotationAction ( const struct FInputActionValue& value ) override;

 

cpp

#include "InputActionValue.h"
..
void APlayerKnight::RotationAction ( const FInputActionValue& value )
{
	FVector axis = value.Get<FVector> ();

	// GetDeltaSeconds() : 델타타임 얻어오는 함수 
	// 상 - 하 회전
	float PitchDelta	= axis.Y * 90.f * GetWorld ()->GetDeltaSeconds ();
	// 좌 - 우 회전
	float YawDelta		= axis.X * 90.f * GetWorld ()->GetDeltaSeconds ();

	mCameraRotator.Pitch	+= PitchDelta;
	mCameraRotator.Yaw		+= YawDelta;

	// 카메라 회전 각도 제한- 좌, 우 
	if ( mCameraRotator.Yaw < -180.f )
		mCameraRotator.Yaw += 360.f ;
	else if( mCameraRotator.Yaw > 180.f )
		mCameraRotator.Yaw -= 360.f;

	// 카메라 회전 각도 제한 - 상, 하
	// 짐벌락 현상 방지를 위해
	if ( mCameraRotator.Pitch < -89.9f )
		mCameraRotator.Pitch = -89.9f;
	else if ( mCameraRotator.Pitch > 89.9f )
		mCameraRotator.Pitch = 89.9f;

	mArm->SetRelativeRotation ( mCameraRotator );
}

 

 

2) 위 값을 기준으로 에임오프셋 기준 잡기 - AO_PlayerKnight_Idle 에디터 이동 

좌우제한 -180 ~ 180

상하회전 -89 ~ 89

89로 넣는 이유는 짐벌락 현상 때문에

 

 

(1) 가로 축, 세로축 값 수정 

- 에셋에서 그리드에 스냅 체크하면 애니 잘 불러붙음

 

(2)

에셋브라우저에서 배치

 

idlc_CO_CU idle_AO_LU idlc_CO_CU idlc_CO_RU idlc_CO_CU

idle_CO_CC idle_AO_LC idle_CO_CC idlc_CO_RC idle_CO_CC

idlc_CO_CD idle_AO_LD idlc_CO_CD idlc_CO_RD idlc_CO_CD

 

(3) AnimBase에서 에임오프셋 연결하기 

header

UPROPERTY ( VisibleAnywhere, BlueprintReadOnly )
float mPitch;

UPROPERTY ( VisibleAnywhere, BlueprintReadOnly )
float mYaw;
..
void SetIdleA0Data(float Yaw, float Pitch);

cpp

void UAnimBase::SetIdleA0Data ( float Yaw, float Pitch )
{
	mPitch	= Pitch;
	mYaw	= Yaw;
}

 

 

(4) 블루프린트에서 IDLE 상태 애니일때 에임 오프셋 연결 

 

1) BPA_AnimKnight 애님 그래프 - 로코모션 - idle 스테이트에서 

추가, 연결

 

2) 추가된 AimOffset 선택 후 디테일창에서 yaw에 mYaw연결, pitch 에 mPitch연결 



(5) PlayerKnight.RotationAction()에서 회전값 적용

void APlayerKnight::RotationAction ( const FInputActionValue& value )
{
	..
	if( IsValid( mAnim ) )
		mAnim->SetIdleA0Data ( mCameraRotator.Yaw, mCameraRotator.Pitch );
}

 

=> 실행하면 뒤쪽에서 마우스 회전방향으로 고개가 돌아가있음




 

2. 마우스 휠로 줌/아웃 구현

 

1) 블프/input폴더에 - 입력 - 입력액션 - IA_Zoom 추가

(1) 값타입 Axis1D

 

2) IA_Context에 IA_Zoom 매핑추가 , 마우스 휠 축 



3) 코드 추가 

UDefaultInputSystem.h

UPROPERTY ( EditAnywhere, BlueprintReadWrite )
class UInputAction* mZoom;

 

생성자

..
static ConstructorHelpers::FObjectFinder<UInputAction>
	zoomAction ( L"/Script/EnhancedInput.InputAction'/Game/Blueprint/Input/IA_Zoom.IA_Zoom'" );
if ( zoomAction.Succeeded () )
	mZoom = zoomAction.Object;

 

PlayerBase.h

..
UPROPERTY ( VisibleAnywhere )
float mArmLengthMin;

UPROPERTY ( VisibleAnywhere )
float mArmLengthMax;
..
UFUNCTION ()
virtual void ZoomAction ( const struct FInputActionValue& value );

ㄴ 카메라 최대,최소 거리 멤버변수로 분리 및 적용 

 

cpp

APlayerBase::APlayerBase()
{
..	
	mArmLengthMin = 100.f;
	mArmLengthMax = 500.f;
	mArm->TargetArmLength = mArmLengthMax;
..
}

void APlayerBase::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
..
	inputCp->BindAction( mDefaultInput->mZoom, ETriggerEvent::Triggered, this, &APlayerBase::ZoomAction );
}


void APlayerBase::ZoomAction ( const FInputActionValue& value )
{
	FVector zoomVal = value.Get<FVector> ();

	mArm->TargetArmLength += zoomVal.X * 1000.f * GetWorld ()->GetDeltaSeconds ();

	if ( mArm->TargetArmLength > mArmLengthMax )
		mArm->TargetArmLength = mArmLengthMax;

	else if ( mArm->TargetArmLength < mArmLengthMin )
		mArm->TargetArmLength = mArmLengthMin;
}

=> 실행하면 마우스 휠 쓰면 줌/아웃이 정상적으로 작동함 

 

728x90

댓글