16번 할 차례, 포스트프로세싱 하이라이팅까지 완료함.

This commit is contained in:
2025-03-04 18:51:09 +09:00
parent 20e7000ae5
commit bca83f6a9c
21 changed files with 237 additions and 13 deletions

View File

@@ -46,6 +46,7 @@ r.DynamicGlobalIlluminationMethod=1
r.ReflectionMethod=1 r.ReflectionMethod=1
r.Shadow.Virtual.Enable=1 r.Shadow.Virtual.Enable=1
r.DefaultFeature.AutoExposure.ExtendDefaultLuminanceRange=True r.DefaultFeature.AutoExposure.ExtendDefaultLuminanceRange=True
r.CustomDepth=3
[/Script/WorldPartitionEditor.WorldPartitionEditorSettings] [/Script/WorldPartitionEditor.WorldPartitionEditorSettings]
CommandletClass=Class'/Script/UnrealEd.WorldPartitionConvertCommandlet' CommandletClass=Class'/Script/UnrealEd.WorldPartitionConvertCommandlet'

Binary file not shown.

Binary file not shown.

BIN
Content/Blueprints/Character/BP_EnemyBase.uasset (Stored with Git LFS) Normal file

Binary file not shown.

Binary file not shown.

BIN
Content/Blueprints/Game/BP_AuraGameMode.uasset (Stored with Git LFS) Normal file

Binary file not shown.

BIN
Content/Blueprints/Player/BP_AuraPlayerController.uasset (Stored with Git LFS) Normal file

Binary file not shown.

BIN
Content/Maps/StartupMap.umap (Stored with Git LFS)

Binary file not shown.

View File

@@ -8,7 +8,7 @@ public class Aura : ModuleRules
{ {
PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs; PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore" }); PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "EnhancedInput" });
PrivateDependencyModuleNames.AddRange(new string[] { }); PrivateDependencyModuleNames.AddRange(new string[] { });

View File

@@ -4,3 +4,4 @@
#include "CoreMinimal.h" #include "CoreMinimal.h"
#define CUSTOM_DEPTH_RED 250

View File

@@ -3,3 +3,16 @@
#include "Character/AuraCharacter.h" #include "Character/AuraCharacter.h"
#include "GameFramework/CharacterMovementComponent.h"
AAuraCharacter::AAuraCharacter()
{
GetCharacterMovement()->bOrientRotationToMovement = true;
GetCharacterMovement()->RotationRate = FRotator(0.f, 400.f, 0.f);
GetCharacterMovement()->bConstrainToPlane = true;
GetCharacterMovement()->bSnapToPlaneAtStart = true;
bUseControllerRotationPitch = false;
bUseControllerRotationYaw = false;
bUseControllerRotationRoll = false;
}

View File

@@ -3,3 +3,23 @@
#include "Character/AuraEnemy.h" #include "Character/AuraEnemy.h"
#include "Aura/Aura.h"
AAuraEnemy::AAuraEnemy()
{
GetMesh()->SetCollisionResponseToChannel(ECC_Visibility, ECR_Block);
}
void AAuraEnemy::HighlightActor()
{
GetMesh()->SetRenderCustomDepth(true);
GetMesh()->SetCustomDepthStencilValue(CUSTOM_DEPTH_RED);
Weapon->SetRenderCustomDepth(true);
Weapon->SetCustomDepthStencilValue(CUSTOM_DEPTH_RED);
}
void AAuraEnemy::UnHighlightActor()
{
GetMesh()->SetRenderCustomDepth(false);
Weapon->SetRenderCustomDepth(false);
}

View File

@@ -0,0 +1,5 @@
// Copyright HappyTanuki
#include "Game/AuraGameModeBase.h"

View File

@@ -0,0 +1,6 @@
// Copyright HappyTanuki
#include "Interaction/EnemyInterface.h"
// Add default functionality here for any IEnemyInterface functions that are not pure virtual.

View File

@@ -2,8 +2,106 @@
#include "Player/AuraPlayerController.h" #include "Player/AuraPlayerController.h"
#include "EnhancedInputSubsystems.h"
#include "EnhancedInputComponent.h"
#include "Interaction/EnemyInterface.h"
AAuraPlayerController::AAuraPlayerController() AAuraPlayerController::AAuraPlayerController()
{ {
bReplicates = true; bReplicates = true;
} }
void AAuraPlayerController::PlayerTick(float DeltaTime)
{
Super::PlayerTick(DeltaTime);
CursorTrace();
}
void AAuraPlayerController::BeginPlay()
{
Super::BeginPlay();
check(AuraContext); //블루프린트에서 입력이 설정이 되지 않았다면 그대로 멈춘다 왜?:입력이 안 먹으면 안 되기 때문
UEnhancedInputLocalPlayerSubsystem* Subsystem = ULocalPlayer::GetSubsystem<UEnhancedInputLocalPlayerSubsystem>(GetLocalPlayer());
check(Subsystem);
Subsystem->AddMappingContext(AuraContext, 0);
bShowMouseCursor = true;
DefaultMouseCursor = EMouseCursor::Default;
FInputModeGameAndUI InputModeData;
InputModeData.SetLockMouseToViewportBehavior(EMouseLockMode::DoNotLock);
InputModeData.SetHideCursorDuringCapture(false);
SetInputMode(InputModeData);
}
void AAuraPlayerController::SetupInputComponent()
{
Super::SetupInputComponent();
UEnhancedInputComponent* EnhancedInputComponent = CastChecked<UEnhancedInputComponent>(InputComponent);
EnhancedInputComponent->BindAction(MoveAction, ETriggerEvent::Triggered, this, &AAuraPlayerController::Move);
}
void AAuraPlayerController::Move(const FInputActionValue& InputActionvalue)
{
const FVector2d InputAxisVector = InputActionvalue.Get<FVector2d>();
const FRotator Ratation = GetControlRotation();
const FRotator YawRotation(0.f, Ratation.Yaw, 0.f);
const FVector ForwardDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::X);
const FVector RightDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::Y);
if (APawn* ControlledPawn = GetPawn<APawn>())
{
ControlledPawn->AddMovementInput(ForwardDirection, InputAxisVector.Y);
ControlledPawn->AddMovementInput(RightDirection, InputAxisVector.X);
}
}
void AAuraPlayerController::CursorTrace()
{
FHitResult CursorHit;
GetHitResultUnderCursor(ECC_Visibility, false, CursorHit);
if (!CursorHit.bBlockingHit) return;
LastActor = ThisActor;
ThisActor = CursorHit.GetActor(); //자동 캐스팅됨, Cast<IEnemyInterface>()생략됨.
/**
* 각 상황에 따른 분류:
* A. LastActor == nullptr && ThisActor == nullptr
* - NOP
* B. LastActor == nullptr && ThisActor != nullptr
* - ThisActor 하이라이팅하기
* C. LastActor != nullptr && ThisActor == nullptr
* - LastActor 하이라이트 끄기
* D. LastActor != nullptr && ThisActor != nullptr && LastActor != ThisActor
* - LastActor 하이라이트 끄고 ThisActor 하이라이팅하기
* E. LastActor != nullptr && ThisActor != nullptr && LastActor == ThisActor
* - NOP
**/
if (LastActor == nullptr)
{
if (ThisActor == nullptr) return; //A
ThisActor->HighlightActor(); //B
}
else if (ThisActor == nullptr)
{
//C
LastActor->UnHighlightActor();
}
else if (LastActor != ThisActor)
{
//D
LastActor->UnHighlightActor();
ThisActor->HighlightActor();
}
else
{
//E
}
}

View File

@@ -13,5 +13,6 @@ UCLASS()
class AURA_API AAuraCharacter : public AAuraCharacterBase class AURA_API AAuraCharacter : public AAuraCharacterBase
{ {
GENERATED_BODY() GENERATED_BODY()
public:
AAuraCharacter();
}; };

View File

@@ -4,14 +4,19 @@
#include "CoreMinimal.h" #include "CoreMinimal.h"
#include "Character/AuraCharacterBase.h" #include "Character/AuraCharacterBase.h"
#include "Interaction/EnemyInterface.h"
#include "AuraEnemy.generated.h" #include "AuraEnemy.generated.h"
/** /**
* *
*/ */
UCLASS() UCLASS()
class AURA_API AAuraEnemy : public AAuraCharacterBase class AURA_API AAuraEnemy : public AAuraCharacterBase, public IEnemyInterface
{ {
GENERATED_BODY() GENERATED_BODY()
public:
AAuraEnemy();
virtual void HighlightActor() override;
virtual void UnHighlightActor() override;
}; };

View File

@@ -0,0 +1,17 @@
// Copyright HappyTanuki
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/GameModeBase.h"
#include "AuraGameModeBase.generated.h"
/**
*
*/
UCLASS()
class AURA_API AAuraGameModeBase : public AGameModeBase
{
GENERATED_BODY()
};

View File

@@ -0,0 +1,27 @@
// Copyright HappyTanuki
#pragma once
#include "CoreMinimal.h"
#include "UObject/Interface.h"
#include "EnemyInterface.generated.h"
// This class does not need to be modified.
UINTERFACE(MinimalAPI)
class UEnemyInterface : public UInterface
{
GENERATED_BODY()
};
/**
*
*/
class AURA_API IEnemyInterface
{
GENERATED_BODY()
// Add interface functions to this class. This is the class that will be inherited to implement this interface.
public:
virtual void HighlightActor() = 0;
virtual void UnHighlightActor() = 0;
};

View File

@@ -6,6 +6,11 @@
#include "GameFramework/PlayerController.h" #include "GameFramework/PlayerController.h"
#include "AuraPlayerController.generated.h" #include "AuraPlayerController.generated.h"
class UInputMappingContext;
class UInputAction;
struct FInputActionValue;
class IEnemyInterface;
/** /**
* *
*/ */
@@ -15,6 +20,22 @@ class AURA_API AAuraPlayerController : public APlayerController
GENERATED_BODY() GENERATED_BODY()
public: public:
AAuraPlayerController(); AAuraPlayerController();
virtual void PlayerTick(float DeltaTime) override;
protected: protected:
virtual void BeginPlay() override; virtual void BeginPlay() override;
virtual void SetupInputComponent() override;
private:
UPROPERTY(EditAnywhere, Category = "Input")
TObjectPtr<UInputMappingContext> AuraContext;
UPROPERTY(EditAnywhere, Category = "Input")
TObjectPtr<UInputAction> MoveAction;
void Move(const FInputActionValue& InputActionvalue);
void CursorTrace();
TScriptInterface<IEnemyInterface> LastActor;
TScriptInterface<IEnemyInterface> ThisActor;
}; };