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
전에 업로드한 커브에셋 이용하는 방법.
반응형