▶️ 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;
}
=> 실행하면 마우스 휠 쓰면 줌/아웃이 정상적으로 작동함
'Unreal Engine5 > KDT 2024' 카테고리의 다른 글
[UE5 KDT2024] 21. 애니메이션 블랜드 2 - 열거형 이용 (0) | 2025.03.05 |
---|---|
[UE5 KDT2024] 20. 애니메이션 블랜드 - 열거형 이용 (0) | 2025.03.04 |
[UE5 KDT2024] 18. 애니메이션 동기화 (0) | 2025.03.02 |
[UE5 KDT2024] 17. 애니메이션 몽타주2 (0) | 2025.03.01 |
[UE5 KDT2024] 16. 애니메이션 몽타주 (0) | 2025.02.28 |
댓글