Aiming Pose
이번 시간에는 Aiming 포즈를 설정해 보겠습니다.
ABP_ShooterCharacter > AnimGraph 를 수정해 줍니다.
1. New Save cached Poss를 만들고
2. 이름을 Cached Ground Loco With Fire로 수정합니다.
에이밍 된 자세(RMB_AO_CC)를 찾아서 Animation폴더에 복사해 줍니다.
이후 가져온 애니메이션의 이름을 바꾸고(AimingPose), Additive Anim Type을 No additive로 변경합니다.
Additive Anim Type은 애니메이션 시스템에서 사용하는 용어로, 언리얼 엔진과 같은 게임 엔진에서 볼 수 있는 애니메이션의 속성 중 하나입니다. 이는 기본 애니메이션에 추가적인 애니메이션 효과를 합산(Add)하는 방식을 나타냅니다. 즉, 기존의 애니메이션에 덧붙여 추가적인 움직임이나 변화를 적용할 수 있도록 하는 기능입니다.
No Additive, Local Space, 그리고 Mesh Space는 애니메이션에서 사용되는 서로 다른 Additive 애니메이션 타입을 나타냅니다. 각각의 타입은 애니메이션 데이터가 어떻게 처리되고 적용되는지에 대한 규칙을 정의합니다. 이들을 구분하는 것은 애니메이션의 행동과 적용 방식을 이해하는 데 중요합니다.
- No Additive: 'No Additive'는 추가적인 애니메이션을 적용하지 않는 것을 의미합니다. 즉, 이 타입의 애니메이션은 그 자체로 완전한 애니메이션으로 작동하며, 다른 애니메이션과 결합되거나 수정되지 않습니다. 'No Additive' 애니메이션은 주로 캐릭터의 기본적인 동작, 예를 들어 걷기, 뛰기, 점프하기 등에 사용됩니다.
- Local Space: 'Local Space' Additive 애니메이션은 기본 애니메이션에 상대적으로 적용됩니다. 이는 애니메이션 데이터가 캐릭터의 로컬 좌표계(즉, 캐릭터 자체의 위치와 방향을 기준으로 하는 좌표계)를 기준으로 처리되는 것을 의미합니다. Local Space 애니메이션은 캐릭터의 특정 부분(예: 상체만)에만 영향을 미치는 부가적인 움직임을 추가할 때 유용합니다.
- Mesh Space: 'Mesh Space' Additive 애니메이션은 캐릭터의 스켈레탈 메시 좌표계를 기준으로 적용됩니다. 이는 애니메이션 데이터가 메시의 전역 좌표계에 따라 처리되며, 캐릭터의 전체적인 구조에 영향을 미치는 애니메이션을 생성할 때 사용됩니다. Mesh Space 애니메이션은 캐릭터 전체에 영향을 주는 복잡한 동작이나 상호작용을 표현하는 데 적합합니다.
ABP_ShooterCharacter로 돌아와서 State Machine 노드를 만들어 줍니다. (Aiming Upper Body)
안으로 들어와서 AimingPose를 AssetBrowser에서 드래그해서 빠르게 State를 만들 수 있습니다.
이후 AnimGraph로 나와서 아래와 같이 만들어 줍니다.
이후 아래와 같이 Output Pose를 만들어 줍니다.
Layered blend per bone의 Details는 전에 작성한 것과 같이 Branch Filters를 하나 추가하여 spine_01 자식들에게만 적용합니다.
Branch Filters는 다음과 같은 변수들로 구성됩니다
- Bone Name: 이 변수는 애니메이션 레이어가 적용될 뼈의 이름을 지정합니다. 이 뼈를 중심으로 위쪽(부모 방향) 또는 아래쪽(자식 방향)에 있는 뼈들에 대해 애니메이션 레이어가 적용됩니다.
- Blend Depth: Blend Depth는 Bone Name에서 몇 단계의 자식 뼈까지 혼합이 적용될지를 결정합니다. 예를 들어, Blend Depth가 1이면 지정된 뼈와 그 직접적인 자식 뼈에만 애니메이션 레이어가 적용됩니다. Blend Depth가 높을수록 더 많은 자식 뼈에 애니메이션 레이어가 적용됩니다.
이렇게 하면 상반신이 흔들리지 않는다는 문제점이 생깁니다. 따라서 Blend Weights를 0.7로 조정해 줍니다.
Aiming State Machine
게임 플레이시 항상 조준을 하고 있는 상태로 되어 있는데, 이를 고칠것입니다.
ShooterAnimInstance코드로 가서 ShooterCharacter의 isAiming을 받아올 수 있게 구현해 봅시다.
우선 ShooterAnimInstance에 에임여부를 저장할 bool 타입 변수를 선언해 주고, ShooterCharacter에 Getter함수를 만들어 줍니다. 이후 ShooterAnimInstance.cpp 에서 UpdateAnimationProperties함수에서 매 프레임마다 bAiming을 캐릭터와 같게 동기화 해줍니다.
ShooterAnimInstance.h
UPROPERTY(VisivleAnywhere, BlueprintReadOnly, Category = Movement, meta = (AllowPrivateAccess = "true"))
bool bAiming;
ShooterCharacter.h
public:
FORCEINLINE bool GetAiming() const {return bAiming};
- FORCEINLINE : C++ 프로그래밍 언어에서 사용되는 매크로로, 컴파일러에게 특정 함수를 가능한 한 인라인(inline)으로 처리하도록 강제하는 지시어입니다.
ShooterAnimInstance.cpp
// ShooterAnimInstance.cpp
void UShooterAnimInstance::UpdateAnimationProperties(float Deltatime)
{
...
if (ShooterCharacter)
{
...
bAiming = ShooterCharacter->GetAiming();
}
컴파일 후 State Machine으로 새로 상태를 만들어 주고(Hip to Aim), Hip to Aim 안에서 아래와 같이 만들어 줍니다.
Aim에 쓰기 위한 Cache를 아래처럼 만들어 줍니다. (존재하던거 사용)
Hip에는 Cached Ground Loco With Fire을 넣어주고, Aim에는 Ground Loco With Fire을 넣어 줍니다.
전환 조건(rule)은 Aiming에 상태에 따라 설정해 주었다. (언리얼 규칙에 따라 b가 빠져있다.)
전환 조건의 Details에서 Duration을 0.1로 조정해 빠른 전환을 해줍니다.
이후 Output Pose와 연결해서 완료합니다.
Aim Look Sensitivity
Zoom을 했을때의 감도를 다르게 설정하기 위한 작업을 합니다.
Enhanced Input 으로 인한 변경으로 인해 넘겨주세요
Hip, Aim상태의 감도를 저장할 변수를 선언해주고 생성자에서 초기화 해줍니다.
ShooterCharacter.h
// Trun rate while not aiming
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = Camera, meta = (AllowPrivateAccess = "true"))
float HipTurnRate;
// Look up rate shen not aiming
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = Camera, meta = (AllowPrivateAccess = "true"))
float HipLookUpRate;
// Turn rate when aiming
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = Camera, meta = (AllowPrivateAccess = "true"))
float AimingTurnRate;
// Look up rate when aiming
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = Camera, meta = (AllowPrivateAccess = "true"))
float AimingLookUpRate;
ShooterCharacter.cpp
// Sets default values
AShooterCharacter::AShooterCharacter() : // Base rates for turning/looking up
BaseTrunRate(45.f),
BaseLookUpRate(45.f),
// Trun rates for Aiming/not
HipTurnRate(90.f),
HipLookUpRate(90.f),
AimingTurnRate(20.f),
AimingLookUpRate(20.f),
// Camera field of view values
CameraDefaultFOV(0.f),
CameraZoomedFOV(35.f),
CameraCurrentFOV(0.f),
ZoomInterpSpeed(20.f),
bAiming(false)
// Called every frame
void AShooterCharacter::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
CameraInterpZoom(DeltaTime);
if (bAiming)
{
BaseTurnRate = AimingTurnRate;
BaseLookUpRate = AimingLookUpRate;
}
else
{
BaseTurnRate = HipTurnRate;
BaseLookUpRate = HipLookUpRate;
}
}
SetLookRates 함수를 만들어서 TurnRate를 제어해줍시다.
ShooterCharacter.h
// Set BaseTurnRate and BaseLookUpRate based on aiming
void SetLookRates();
ShooterCharacter.cpp
void AShooterCharacter::SetLookRates()
{
if (bAiming)
{
BaseTurnRate = AimingTurnRate;
BaseLookUpRate = AimingLookUpRate;
}
else
{
BaseTurnRate = HipTurnRate;
BaseLookUpRate = HipLookUpRate;
}
}
// Called every frame
void AShooterCharacter::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
CameraInterpZoom(DeltaTime);
// Change look sensitivity based on aiming
SetLookRates();
}
이후 컴파일하면, 게임패드는 적용이 되지만 마우스는 적용이 되지 않는 문제점을 가지는데...
사실 Enhanced Input을 쓰면서 지금까지 쓴 변수들을 쓰지 않았다!
ShooterCharacter.h
// Scale factor for mouse look sensitivity. Turn rate when not aiming
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = Camera, meta = (AllowPrivateAccess = "true"))
float MouseHipTurnRate;
// Scale factor for mouse look sensitivity. Look up rate when not aiming
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = Camera, meta = (AllowPrivateAccess = "true"))
float MouseHipLookUpRate;
// Scale factor for mouse look sensitivity. Turn rate when aiming
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = Camera, meta = (AllowPrivateAccess = "true"))
float MouseAimingTurnRate;
// Scale factor for mouse look sensitivity. Look up rate when aiming
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = Camera, meta = (AllowPrivateAccess = "true"))
float MouseAimingLookUpRate;
ShooterCharacter.cpp
// Sets default values
AShooterCharacter::AShooterCharacter() : // Base rates for turning/looking up
BaseTurnRate(45.f),
BaseLookUpRate(45.f),
// Trun rates for Aiming/not
HipTurnRate(90.f),
HipLookUpRate(90.f),
AimingTurnRate(20.f),
AimingLookUpRate(20.f),
// Mouse Look sensitivity
MouseHipTurnRate(1.f),
MouseHipLookUpRate(1.f),
MouseAimingTurnRate(0.3f),
MouseAimingLookUpRate(0.3f),
// Camera field of view values
CameraDefaultFOV(0.f),
CameraZoomedFOV(35.f),
CameraCurrentFOV(0.f),
ZoomInterpSpeed(20.f),
bAiming(false)
void AShooterCharacter::Look(const FInputActionValue &Value)
{
FVector2D LookAxisVector = Value.Get<FVector2D>();
float TurnScaleFactor{}, LookUpScaleFactor{};
if (bAiming)
{
TurnScaleFactor = MouseAimingTurnRate;
LookUpScaleFactor = MouseAimingLookUpRate;
}
else
{
TurnScaleFactor = MouseHipTurnRate;
LookUpScaleFactor = MouseHipLookUpRate;
}
if (Controller != nullptr)
{
AddControllerYawInput(LookAxisVector.X * TurnScaleFactor);
AddControllerPitchInput(LookAxisVector.Y * LookUpScaleFactor);
}
}
0와 1사이의 값만을 지정할 수 있도록 meta를 통해서 변수에 제한을 걸어줄 수 있습니다.
UPROPERTY(meta = (ClampMin = "0.0", ClampMax = "1.0", UIMin = "0.0", UIMax = "1.0"))
- ClampMin = "0.0"와 ClampMax = "1.0": 이 설정은 프로퍼티의 값이 0.0과 1.0 사이로 제한되도록 합니다. 즉, 이 변수의 값은 0.0 이하로 내려가거나 1.0을 초과할 수 없습니다.
- UIMin = "0.0"와 UIMax = "1.0": 이 설정은 언리얼 엔진의 에디터 내에서 사용자 인터페이스(UI)를 통해 이 변수를 조정할 때 표시되는 최소값과 최대값을 지정합니다. 사용자는 에디터에서 이 변수의 값을 0.0과 1.0 사이로만 조정할 수 있습니다.
// Scale factor for mouse look sensitivity. Turn rate when not aiming
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = Camera, meta = (AllowPrivateAccess = "true"), meta = (ClampMin = "0.0", ClampMax = "1.0", UIMin = "0.0", UIMax = "1.0"))
float MouseHipTurnRate;
// Scale factor for mouse look sensitivity. Look up rate when not aiming
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = Camera, meta = (AllowPrivateAccess = "true"), meta = (ClampMin = "0.0", ClampMax = "1.0", UIMin = "0.0", UIMax = "1.0"))
float MouseHipLookUpRate;
// Scale factor for mouse look sensitivity. Turn rate when aiming
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = Camera, meta = (AllowPrivateAccess = "true"), meta = (ClampMin = "0.0", ClampMax = "1.0", UIMin = "0.0", UIMax = "1.0"))
float MouseAimingTurnRate;
// Scale factor for mouse look sensitivity. Look up rate when aiming
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = Camera, meta = (AllowPrivateAccess = "true"), meta = (ClampMin = "0.0", ClampMax = "1.0", UIMin = "0.0", UIMax = "1.0"))
float MouseAimingLookUpRate;
Crosshair Spread Velocity
모든 FPS게임은 움직이거나 줌을 할 때 상황에 맞추어 Crosshair가 움직입니다.
이를 설정하기 위해 코드를 작성합니다.
ShooterCharacter.h
void CalculateCrosshairSpread(float Deltatime);
// Interp speed for zooming when aiming
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Crosshairs, meta = (AllowPrivateAccess = "true"))
float CrosshairSpreadMultiplier;
// Velocity component for crosshairs spread
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Crosshairs, meta = (AllowPrivateAccess = "true"))
float CrosshairVelocityFactor;
// In air component for crosshairs spread
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Crosshairs, meta = (AllowPrivateAccess = "true"))
float CrosshairInAirFactor;
// Aim Component for crosshairs spread
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Crosshairs, meta = (AllowPrivateAccess = "true"))
float CrosshairAimFactor;
// Shooting component for crosshairs spread
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Crosshairs, meta = (AllowPrivateAccess = "true"))
float CrosshairShootingFactor;
Character의 이동 속도는 0~600으로 설정되어 있는데, 이를 0~1.0으로 변환하는 작업이 필요하다.
ShooterCharacter.cpp
void AShooterCharacter::CalculateCrosshairSpread(float Deltatime)
{
FVector2D WalkSpeedRange{0.f, 600.f};
FVector2D VelocityMultiplierRange{0.f, 1.f};
FVector Velocity{GetVelocity()};
Velocity.Z = 0.f;
CrosshairVelocityFactor = FMath::GetMappedRangeValueClamped(WalkSpeedRange, VelocityMultiplierRange, Velocity.Size());
CrosshairSpreadMultiplier = 0.5f + CrosshairVelocityFactor;
}
- 속도 범위 정의: WalkSpeedRange는 캐릭터의 걷기 속도 범위를 나타냅니다. 이 예제에서는 0에서 600까지의 범위를 사용합니다.
- 속도에 따른 크로스헤어 확산 범위 정의: VelocityMultiplierRange는 캐릭터의 속도에 따라 조정되는 크로스헤어 확산의 범위입니다. 이 범위는 0에서 1까지입니다.
- 캐릭터의 현재 속도 계산: GetVelocity() 함수를 통해 캐릭터의 현재 속도를 얻고, Z 축 속도(수직 속도)를 0으로 설정합니다. 이는 수평 이동 속도만 고려하기 위함입니다.
- 크로스헤어 확산도 계산: CrosshairVelocityFactor는 캐릭터의 현재 속도에 기반하여 계산됩니다. FMath::GetMappedRangeValueClamped 함수는 캐릭터의 현재 속도(Velocity.Size())를 WalkSpeedRange에서 VelocityMultiplierRange로 매핑합니다. 이는 캐릭터의 이동 속도에 따라 크로스헤어의 확산도가 얼마나 변할지를 결정합니다.
- 최종 크로스헤어 확산도 설정: CrosshairSpreadMultiplier는 최종적으로 크로스헤어의 확산도를 결정합니다. 이 값은 기본값(여기서는 0.5)에 CrosshairVelocityFactor를 더하여 계산됩니다. 이는 캐릭터가 빠르게 움직일수록 크로스헤어가 더 많이 확산되도록 하는 로직입니다.
Spreading the Crosshairs
저번 시간에 만든CalculateCrosshairSpread를 Tick에 넣어줍니다.
ShooterCharacter.cpp
// Called every frame
void AShooterCharacter::Tick(float DeltaTime)
{
...
// Calculate crosshair spread multiplier
CalculateCrosshairSpread(DeltaTime);
}
HUD에서 CrosshairSpreadMultiplier를 사용하기 위해서 BlueprintCallable 함수를 작성합니다.
ShooterCharacter.h
public:
UPROPERTY(BlueprintCallable)
float GetCrosshairSpreadMultiplier() const;
ShooterCharacter.cpp
float AShooterCharacter::GetCrosshairSpreadMultiplier() const
{
return CrosshairSpreadMultiplier;
}
HUD로 넘어와서 지금 사용하고 있는 Cross_Q_9을 보면 4개의 네모가 하나로 이루어져 있는데, Spread를 위해 각자 하나의 네모를 통해 새로 그려줄 것이다.
이동속도별 스프레드(CrosshairSpreadMultiplier)를 받기 위해서 BP_ShooterCharacter 변수를 만들어줍니다.
BeginPlay에서 ShooterCharacter를 받아오도록 아래와 같이 만들어 줍니다.
Draw Texture의 연결을 끊고 잠시 구석으로 치워 줍니다.
CrosshairSpreadMultiplier를 저장해 줄 변수를 만들어 줍니다.
아래와 같이 작성하여 유효한지 검사한 수 Get Crosshair Spread Multiplier로 CrosshairSpreadMultiplier변수에 값을 지정해 줍니다.
Float 변수( CrosshairSpreadMax )를 하나 만들어 줍니다. (Default : 16 으로 설정)
그리고 치워놓았던 Draw Texture를 연결해 줍니다. 우리는 하나의 Crosshair를 4개의 Crosshair로 만들어 줄것입니다.
우선 Bottom먼저 작업하겠습니다. Texture를 바꿔줍니다. (Crosshair_Quad_9)
지금까지는 중앙의 위치를 받아 이를 반으로 나눠서 배치하였는데요
Vector2D 변수를 만들어 주고 아래와 같이 BP를 고쳐줍니다.
- Crosshair Spread Max의 값이 크면 클수록 넓어지는 상한이 증가합니다. (사실상 Multiplier아닌가)
Crosshair_Quad_9_Top의 경우 Add를 Sub로 바꿔주면 된다.
Left, Right도 X, Y를 바꾸어서 적용해주면된다.
Crosshair In Air Factor
점프를 할때도 Crosshair는 벌어져야 한다. 이를 CrosshairSpreadMultiplier에 CrosshairInAirFactor를 더해서 구현할것이다.
※ 추가로, 전의 코드에서 DeltaTime을 잘못 작성하여 수정하였다
ShooterCharacter.cpp
void AShooterCharacter::CalculateCrosshairSpread(float DeltaTime)
{
FVector2D WalkSpeedRange{0.f, 600.f};
FVector2D VelocityMultiplierRange{0.f, 1.f};
FVector Velocity{GetVelocity()};
Velocity.Z = 0.f;
CrosshairVelocityFactor = FMath::GetMappedRangeValueClamped(WalkSpeedRange, VelocityMultiplierRange, Velocity.Size());
// Calculate crosshair in air factor
if (GetCharacterMovement()->IsFalling())
{
// Spread the crosshairs slowly while in air
CrosshairInAirFactor = FMath::FInterpTo(CrosshairInAirFactor, 2.25f, DeltaTime, 2.25f);
}
else // Character is on the ground
{
// Shrink the crosshairs rapidly while on the ground
CrosshairInAirFactor = FMath::FInterpTo(CrosshairInAirFactor, 0.f, DeltaTime, 30.f);
}
CrosshairSpreadMultiplier = 0.5f + CrosshairVelocityFactor + CrosshairInAirFactor;
}
- GetCharacterMovement()->IsFalling() : 캐릭터가 현재 공중에 있는지 (즉, 떨어지고 있는지) 여부를 확인하는 함수입니다.
- FMath::FInterpTo(CrosshairInAirFactor, 2.25f, DeltaTime, 2.25f) : 하나의 값에서 다른 값으로 부드럽게 보간하는 데 사용됩니다.
- CrosshairInAirFactor : 보간할 대상
- 2.25f : 보간의 목표
- DeltaTime : 작동을 위한 Deltatime
- 2.25f : 보간 속도
- 지면에 닿을때의 보간 속도를 빠르게 설정합니다.
Crosshair Aim Factor
점프 Crosshair의 연장선으로 Aim(zoom)을 했을때 CrosshairSpreadMultiplier를 감소시키는 것을 구현하였다.
ShooterCharacter.cpp
// Calculate crosshair aim factor
if (bAiming) // Are we aiming?
{
CrosshairAimFactor = FMath::FInterpTo(CrosshairAimFactor, 0.6f, DeltaTime, 30.f);
}
else // Not aiming
{
CrosshairAimFactor = FMath::FInterpTo(CrosshairAimFactor, 0.0f, DeltaTime, 30.f);
}
CrosshairSpreadMultiplier = 0.5f + CrosshairVelocityFactor + CrosshairInAirFactor - CrosshairAimFactor;
}
추가로 Crosshaif 변수들을 생성자에서 초기화하도록 코드를 보완합니다.
// Sets default values
AShooterCharacter::AShooterCharacter() :
...
// Crosshair spread factors
CrosshairSpreadMultiplier(0.f),
CrosshairVelocityFactor(0.f),
CrosshairInAirFactor(0.f),
CrosshairAimFactor(0.f),
CrosshairShootingFactor(0.f)
Bullet Fire Aim Factor
총을 쏘면 일정 시간동안 Crosshair가 벌어지는것을 구현할 것입니다.
우선 헤더에 변수를 선언합니다.
ShooterCharacter.h
float ShootTimeDuration;
bool bFiringBullet;
FTimerHandle CrosshairShootTimer;
- ShootTimeDuration : Crosshair가 벌어지는 시간
- bFiringBullet : 총의 격발 여부
- FTimerHandle : 타 이머 기능을 위한 클래스입니다. 이 클래스는 타이머를 구별하고 관리하는 데 사용되는 핸들(handle)을 나타냅니다. 간단히 말해, FTimerHandle은 특정 타이머를 식별하고 참조하는 데 사용되는 고유한 식별자입니다.
- ※ FTimerHandle을 사용하기 위한 함수는 UFUNCTION이어야 합니다.
FTimerHandle를 사용하는 기본적인 방법은 다음과 같습니다:
- 타이머 핸들 선언: FTimerHandle 객체를 선언합니다. 이 객체는 나중에 타이머를 설정하고, 타이머의 상태를 검사하거나, 타이머를 제어할 때 사용됩니다.
- 타이머 설정: UWorld::GetTimerManager().SetTimer 함수를 사용하여 타이머를 설정합니다. 이 함수는 FTimerHandle 객체, 호출될 함수, 타이머의 지속 시간, 타이머가 반복될지 여부 등을 인자로 받습니다.
- 타이머 제어: FTimerHandle을 사용하여 타이머를 중지, 재시작 또는 파기할 수 있습니다. 예를 들어, UWorld::GetTimerManager().ClearTimer 함수는 특정 FTimerHandle에 연결된 타이머를 중지하고 제거합니다.
cpp 생성자에서 선언한 변수들을 초기화 해줍니다.
ShooterCharacter.cpp
AShooterCharacter::AShooterCharacter() : ...
// Bullet fire timer variables
ShootTimeDuration(0.05f),
bFiringBullet(false)
bFiringBullet을 다루어줄 Setter 메소드를 두개 만듭니다.
ShooterCharacter.h
UFUNCTION()
void StartCrosshairBulletFire();
UFUNCTION()
void FinishCrosshairBulletFire();
ShooterCharacter.cpp
void AShooterCharacter::StartCrosshairBulletFire()
{
bFiringBullet = true;
GetWorldTimerManager().SetTimer(CrosshairShootTimer,
this,
&AShooterCharacter::FinishCrosshairBulletFire,
ShootTimeDuration);
}
void AShooterCharacter::FinishCrosshairBulletFire()
{
bFiringBullet = false;
}
- GetWorldTimerManager().SetTimer : 지정된 시간이 지난 후 특정 함수를 자동으로 호출하도록 설정하는 데 사용됩니다
- CrosshairShootTimer: 타이머를 식별하는 데 사용되는 FTimerHandle 객체입니다. 이 핸들을 통해 나중에 타이머를 참조하거나 수정할 수 있습니다.
- this: 타이머가 완료될 때 호출될 함수가 있는 객체를 가리킵니다. 여기서는 AShooterCharacter 클래스의 인스턴스를 나타냅니다.
- &AShooterCharacter::FinishCrosshairBulletFire: 타이머가 완료될 때 호출될 멤버 함수의 포인터입니다. 이 경우 AShooterCharacter 클래스의 FinishCrosshairBulletFire 함수가 타이머가 끝날 때 호출됩니다.
- ShootTimeDuration: 타이머가 실행될 시간(초)입니다. 이 시간이 지나면 설정한 함수가 호출됩니다.
void AShooterCharacter::StartCrosshairBulletFire()을 FireWeapon(Enhanced Input) 함수에 넣어줍니다.
void AShooterCharacter::FireWeapon(const FInputActionValue &Value)
{
...
StartCrosshairBulletFire();
}
그리고 CalculateCrosshairSpread 함수 마지막에 bFiringBullet 여부를 검사하여서 Multiplier 연산에 추가합니다.
void AShooterCharacter::CalculateCrosshairSpread(float DeltaTime)
{
...
// True 0.05 second after firing
if (bFiringBullet)
{
CrosshairShootingFactor = FMath::FInterpTo(CrosshairShootingFactor, 0.3f, DeltaTime, 60.f);
}
else
{
CrosshairShootingFactor = FMath::FInterpTo(CrosshairShootingFactor, 0.0f, DeltaTime, 60.f);
}
CrosshairSpreadMultiplier = 0.5f + CrosshairVelocityFactor + CrosshairInAirFactor - CrosshairAimFactor + CrosshairShootingFactor;
}
'Unreal 공부 > Unreal Engine 4 C++ The Ultimate Shooter' 카테고리의 다른 글
The Weapon - 1 (0) | 2024.01.05 |
---|---|
Aiming and Crosshairs - 3 (0) | 2024.01.04 |
Aiming and Crosshairs - 1 (0) | 2023.12.31 |
Animation - 5 (1) | 2023.12.31 |
Animation - 4 (1) | 2023.12.31 |