Unreal Engine 4 프로그래밍 c++/기능

Unreal RecoilSystem c++ 적용하기. (CurveVector를 이용한 방법.)

코닥쿠 2022. 12. 16. 16:51
반응형

CurveVector를 이용하여 시스템에 적용시킨 방법입니다.

 

RecoilSystem.h

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "Components/ActorComponent.h"
#include "RecoilComponent.generated.h"

//CurveVector를 이용하기 위해서는 아래와 같이 추가해줘야 사용이 가능함.//
class UCurveVector;

UCLASS( ClassGroup=(Custom), meta=(BlueprintSpawnableComponent) )
class PROJECT_API URecoilComponent : public UActorComponent
{
	GENERATED_BODY()

public:	
	// Sets default values for this component's properties
	URecoilComponent();

public:	
	// Called every frame
	virtual void TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override;

private:
	//총의 작용이 끝난후 작용시키기위해 사용함//
	FTimerHandle RecoilTimer;

	//CurveVector의 값을 가져오면 FVector가 반환되기 때문에 선언해줌.//
	FVector RecoilCurve_Vector;
    //CurveVector의 키값을 가져오기 위해서는 정확한 값이 필요하기때문에 선언.//
	float Recoil_Index = 0;

	ACharacter* Player;

public:
	//타이머 시간.//
	float WaitTime = 0.15f;

public:
	//호출할 함수들.//
	void SetPlayer(ACharacter* Owner) { Player = Cast<ACharacter>(Owner); }
	void UpdateRecoil();
	void ApplyRecoil(UCurveVector* CurveVector);
	void StopRecoil();
	void ResetRecoil();
};

RecoilSystem.cpp

#include "RecoilComponent.h"
#include "GameframeWork/Character.h"
#include "Curves/CurveVector.h"	//CurveVector함수를 사용하기 위해 추가시켜줘야함.//
#include "Kismet/GameplayStatics.h"

// Sets default values for this component's properties
URecoilComponent::URecoilComponent()
{
	// Set this component to be initialized when the game starts, and to be ticked every frame.  You can turn these features
	// off to improve performance if you don't need them.
	PrimaryComponentTick.bCanEverTick = true;

	// ...
}

// Called every frame
void URecoilComponent::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction)
{
	Super::TickComponent(DeltaTime, TickType, ThisTickFunction);

	// ...
    //계속 업데이트하는 함수.//
	UpdateRecoil();
}
//컨트롤러의 pitch, yaw를 이용한 반동효과 업데이트 함수//
void URecoilComponent::UpdateRecoil()
{
	Player->AddControllerPitchInput(RecoilCurve_Vector.Y);
	Player->AddControllerYawInput(RecoilCurve_Vector.Z);
}

//Curve를 이용한 값가져와 적용시키기//
void URecoilComponent::ApplyRecoil(UCurveVector* CurveVector)
{
	//인덱스에 해당하는 키값을 가져옴//
	Recoil_Index++;
	RecoilCurve_Vector = CurveVector->GetVectorValue(Recoil_Index);

	//타이머를 사용해 총의 상호작용을 멈췄을때 호출되는거임//
	GetWorld()->GetTimerManager().SetTimer(RecoilTimer, this, &URecoilComponent::StopRecoil, WaitTime);
}

//총이 발사를 멈췄을때 잠깐 총이 아래로 내려가게 0.1f값을 줘서 내려오게 만듬//
void URecoilComponent::StopRecoil()
{
	//GEngine->AddOnScreenDebugMessage(-1, 3.f, FColor::White, __FUNCTION__);
	//RecoilCurve_Vector = FVector(0);
	Recoil_Index = 0;
	RecoilCurve_Vector = FVector(0.f, 0.1f, 0.f);
    
    //그렇게 타이머가 지나면 ResetRecoil을 호출함//
	GetWorld()->GetTimerManager().SetTimer(RecoilTimer, this, &URecoilComponent::ResetRecoil, WaitTime);
}

//Vector값을 완전히 0.f로 만들어 멈추게 만듬//
void URecoilComponent::ResetRecoil()
{
	RecoilCurve_Vector = FVector(0);
}

FirstPerson(일인칭)같은경우에는 메쉬가 카메라에 붙어있기때문에 RInterp를 이용하여 반동을 이용할수 있지만.

ThirdPerson(삼인칭)같은 Pawn은 메쉬가 있고 카메라가 붙어있기때문에 따로 움직인다. 그래서 ControllerRot을 이용하여

Player->AddControllerPitchInput(RecoilCurve_Vector.Y);
Player->AddControllerYawInput(RecoilCurve_Vector.Z);

부드럽게 위로 이동시켜줍니다.

**AddController***Input같은경우에는 값이 0일경우 아무런 작용이 안이루어짐.**

 

c++ UCurve+ (Vector, float, LinearColor) 사용하기.

Curve는 다양하게 적용이 가능하다 Timeline으로 이용한 커브로도 사용할수 있으며 자신이 원하는 값도 사용할 수 있다. .h UCurveFloat* CurveFloat; UCurveVector* CurveVector; UCurveLinearColor* CurveLinearColor; .cpp #inc

codakcoo.tistory.com

전에 업로드한 커브에셋 이용하는 방법.

반응형