[Unreal Engine 4 C++] TimeStop (시공단열/초산 회피)

2023. 8. 2. 18:04· Unreal Engine/C++

https://lykanstudio.tistory.com/84

 

[Unreal Engine 4 Blueprint] TimeStop (시공단열/초산 회피)

몇몇 액션 게임에선 적을 공격을 알맞은 타이밍에 회피하면 시간이 멈춘 것처럼 캐릭터가 멈추거나 느리게 행동합니다. 이런 기능을 언리얼 엔진으로 만드는 법은 다음과 같습니다. ActorComponent

lykanstudio.tistory.com

 위의 포스팅으로 구현 블루프린트를 C++로 구현한 글입니다.

 

// TimeStopSystemComponent.h

UCLASS()
class PROJECTREPLICA_API UTimeStopSystemComponent : public UActorComponent
{
	GENERATED_BODY()

public:
	UTimeStopSystemComponent();

public:
	/** TimeStop을 실행하는 함수입니다. */
	UFUNCTION(BlueprintCallable, Category = "TimeStop")
	void ActivateTimeStop();

	/** TimeStop을 비활성화하는 함수입니다. */
	UFUNCTION(BlueprintCallable, Category = "TimeStop")
	void DeactivateTimeStop();

protected:
	/**
	 * 입력받은 값으로 PostProcessSettings의 MotionBlurAmount 값을 설정하는 함수입니다.
	 *
	 * @param PostProcessSettings MotionBlurAmount 값을 설정할 PostProcessSettings입니다.
	 * @param NewMotionBlurAmount 설정할 MotionBlurAmount 값입니다. 
	 */
	UFUNCTION(BlueprintCallable, Category = "TimeStop")
	void ChangeMotionBlurAmount(UPARAM(ref) FPostProcessSettings& PostProcessSettings, float NewMotionBlurAmount);

protected:
	/** TimeStop의 실행을 나타내는 변수입니다. */
	UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = "TimeStop")
	bool bActivate;

	/** TimeStop 실행시 적용할 시간 흐름 속도입니다. */
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "TimeStop")
	float TimeStopDilation;

	/** Owner의 시간 흐름 속도입니다. */
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "TimeStop")
	float OwnerTimeDilation;

	/** TimeStop 실행시 화면의 블러 현상을 조절하기 위한 MotionBlur의 강도입니다. */
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "TimeStop")
	float BaseMotionBlurIntensity;
};

 

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


#include "Components/TimeStopSystemComponent.h"
#include "Camera/CameraComponent.h"
#include "GameFramework/Character.h"
#include "Kismet/GameplayStatics.h"
#include "Kismet/KismetSystemLibrary.h"

UTimeStopSystemComponent::UTimeStopSystemComponent()
{
	TimeStopDilation = 0.0001f;
	OwnerTimeDilation = 1.0f;
	BaseMotionBlurIntensity = 0.5f;
}

void UTimeStopSystemComponent::ActivateTimeStop()
{
	if(IsValid(GetOwner()) == true)
	{
		bActivate = true;

		// 카메라의 모션블러를 설정합니다.
		ACharacter* PlayerCharacter = UGameplayStatics::GetPlayerCharacter(GetWorld(), 0);
		if(PlayerCharacter != nullptr)
		{
			UCameraComponent* CameraComponent = Cast<UCameraComponent>(PlayerCharacter->GetComponentByClass(UCameraComponent::StaticClass()));
			ChangeMotionBlurAmount(CameraComponent->PostProcessSettings, TimeStopDilation * BaseMotionBlurIntensity);
		}
        
		UGameplayStatics::SetGlobalTimeDilation(GetWorld(), TimeStopDilation);
		
		float NewOwnerTimeDilation = OwnerTimeDilation / TimeStopDilation;
		FTimerHandle TimerHandle;
		FTimerDelegate TimerDelegate = FTimerDelegate::CreateUObject(this, &UPRTimeStopSystemComponent::SetOwnerCustomTimeDilation, NewOwnerTimeDilation);
		// Delay함수와 달리 타이머는 글로벌 시간 흐름 속도(Global Time Dilation)의 영향을 받습니다.
		// 이미 앞선 코드로 인해 클로벌 시간 흐름 속도가 줄어들었으므로 Delay시간을 배로 설정합니다.
		GetWorld()->GetTimerManager().SetTimer(TimerHandle, TimerDelegate, TimeStopDilation * TimeStopDilation, false);
		
	}
}

void UTimeStopSystemComponent::DeactivateTimeStop()
{
	if(IsValid(GetOwner()) == true)
	{
		bActivate = false;

		// 모션 블러의 양을 초기화합니다.
		ACharacter* PlayerCharacter = UGameplayStatics::GetPlayerCharacter(GetWorld(), 0);
		if(PlayerCharacter != nullptr)
		{
			UCameraComponent* CameraComponent = Cast<UCameraComponent>(PlayerCharacter->GetComponentByClass(UCameraComponent::StaticClass()));
			ChangeMotionBlurAmount(CameraComponent->PostProcessSettings, 0.5f);
		}
			
		// 글로벌 시간 흐름 속도를 초기화합니다.
		UGameplayStatics::SetGlobalTimeDilation(GetWorld(), 1.0f);
		// UI사운드를 제외한 모든 사운드의 시간 흐름 속도 초기화합니다.
		UGameplayStatics::SetGlobalPitchModulation(GetWorld(), 1.0f, 0.0f);
		// Owner의 시간 흐름 속도를 초기화합니다.
		GetPROwner()->CustomTimeDilation = 1.0f;
	}
}

void UTimeStopSystemComponent::SetOwnerCustomTimeDilation(float NewCustomTimeDilation)
{
	if(IsValid(GetOwner()) == true)
	{
		GetOwner()->CustomTimeDilation = NewCustomTimeDilation;
	}
}

void UTimeStopSystemComponent::ChangeMotionBlurAmount(FPostProcessSettings& PostProcessSettings, float NewMotionBlurAmount)
{
	// true로 설정해야 변경된 MotionBlurAmount 값으로 설정됩니다.
	PostProcessSettings.bOverride_MotionBlurAmount = true;
	PostProcessSettings.MotionBlurAmount = NewMotionBlurAmount;
}
저작자표시 (새창열림)

'Unreal Engine > C++' 카테고리의 다른 글

[Unreal Engine C++] C++에서 인터페이스 변수 사용하기  (0) 2024.01.12
[Unreal Engine C++] Widget Animation Delegate  (1) 2024.01.09
[Unreal Engine 4 C++] UObject에서 Tick함수 사용하는 법  (0) 2023.07.10
[Unreal Engine 4 C++] C++에서 참조 인자를 가진 함수를 블루프린트에서 호출할 때 출력이 아닌 입력으로 참조 인자 사용하기  (0) 2023.01.10
[Unreal Engine 4 C++] UENUM을 USTRUCT에서 변수로 사용하기  (0) 2022.12.31
'Unreal Engine/C++' 카테고리의 다른 글
  • [Unreal Engine C++] C++에서 인터페이스 변수 사용하기
  • [Unreal Engine C++] Widget Animation Delegate
  • [Unreal Engine 4 C++] UObject에서 Tick함수 사용하는 법
  • [Unreal Engine 4 C++] C++에서 참조 인자를 가진 함수를 블루프린트에서 호출할 때 출력이 아닌 입력으로 참조 인자 사용하기
한돌이
한돌이
GameProgramer 취업준비 중 onestone3647@gmail.com
한돌이
Lykan Studio
한돌이
전체
오늘
어제
  • 분류 전체보기 (100)
    • Daily Life (0)
    • Project (14)
      • Replica (9)
      • CE (1)
      • T (4)
    • Unreal Engine (73)
      • C++ (40)
      • Blueprint (5)
      • AI (5)
      • Effect (3)
      • UMG (2)
      • Error (2)
      • etc. (15)
    • Study (8)
      • C++ (2)
      • Algorithm (0)
      • API (4)
      • Git (2)
    • etc. (4)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • UnrealEngine4
  • project
  • ETC
  • Unreal Engine4 Effect
  • Project T
  • etc.
  • c++
  • Study
  • ADB
  • Unreal Engine 4 Error
  • API
  • Unreal Engine
  • 오류
  • daily life
  • Unreal Engine4
  • ProjectReplica
  • GIT
  • Unreal Engine 4
  • Unreal Engine 5
  • ProjectT
  • Unreal Engine etc.
  • Project Replica
  • 자소서
  • error
  • Unreal Engine 4 C++
  • threadsafe
  • .etc

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
한돌이
[Unreal Engine 4 C++] TimeStop (시공단열/초산 회피)
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.