Payback 0.0.1
CK Graduation Project
로딩중...
검색중...
일치하는것 없음
CardWidget.h
이 파일의 문서화 페이지로 가기
1// Fill out your copyright notice in the Description page of Project Settings.
2
3#pragma once
4
5#include "CoreMinimal.h"
6#include "UI/UserWidgetBase.h"
7#include "CardWidget.generated.h"
8
9enum class ESituationTag : uint8;
10
11class UWrapBox;
12class UCardTagWidget;
13class UButton;
14class UImage;
15class UCardWidget;
16class USituationBase;
17class UTextBlock;
18class UTexture2D;
19
20
21DECLARE_MULTICAST_DELEGATE_OneParam(FOnSituationCardChosen, UCardWidget* /*Card*/);
22
29UCLASS()
30class CK_UE_API UCardWidget : public UUserWidgetBase
31{
32 GENERATED_BODY()
33
34public:
35 void SetupCard(USituationBase* InSituation, UTexture2D* InIllustration);
36
37public:
38 // 아래 세 개는 USituationBase 의 완전한 형식이 필요해 .cpp 에서 정의한다.
39 USituationBase* GetSituation() const;
40
41 // 상황이 비어 있으면 NAME_None.
42 FName GetSituationID() const;
43
44 // 이 카드의 방송 태그. 상황이 비어 있으면 ESituationTag::None.
45 ESituationTag GetBroadcastTags() const;
46
47public:
48 // SetupCard 로 받은 아이콘. 선택 진행 표시가 같은 그림을 그대로 쓰기 위해 노출한다.
49 FORCEINLINE UTexture2D* GetIconTexture() const
50 {
51 return IconTexture;
52 }
53
54protected:
55 virtual void NativeConstruct() override;
56 virtual void NativeTick(const FGeometry& MyGeometry, float InDeltaTime) override;
57 virtual void NativeOnMouseEnter(const FGeometry& InGeometry, const FPointerEvent& InMouseEvent) override;
58 virtual void NativeOnMouseLeave(const FPointerEvent& InMouseEvent) override;
59 virtual FReply NativeOnMouseMove(const FGeometry& InGeometry, const FPointerEvent& InMouseEvent) override;
60 virtual FReply NativeOnMouseButtonDown(const FGeometry& InGeometry, const FPointerEvent& InMouseEvent) override;
61 virtual FReply NativeOnMouseButtonUp(const FGeometry& InGeometry, const FPointerEvent& InMouseEvent) override;
62
63protected:
64 UFUNCTION(BlueprintImplementableEvent, Category = "UI|Situation")
65 void OnCardSetup();
66
67 UFUNCTION()
68 void HandleChooseClicked();
69
70 // 상황이 가진 방송 태그를 CardTags 에 나열한다.
71 void SetupCardTags();
72
73protected:
74 // 커서 위치를 카드 중심 기준 -1 ~ 1 로 정규화해 보관한다.
75 void UpdateCursorOffset(const FGeometry& InGeometry, const FPointerEvent& InMouseEvent);
76
77 // 목표 변형값을 현재 값으로 부드럽게 따라가게 한다. 매 프레임 호출.
78 void UpdateHoverTransform(float InDeltaTime);
79
80public:
81 FOnSituationCardChosen OnCardChosen;
82
83protected:
84 UPROPERTY(BlueprintReadOnly, Category = "UI|Situation", meta = (BindWidget))
85 TObjectPtr<UImage> SituationIcon;
86
87 UPROPERTY(BlueprintReadOnly, Category = "UI|Situation", meta = (BindWidget))
88 TObjectPtr<UImage> SituationIllustration;
89
90 UPROPERTY(BlueprintReadOnly, Category = "UI|Situation", meta = (BindWidget))
91 TObjectPtr<UTextBlock> SituationNameText;
92
93 UPROPERTY(BlueprintReadOnly, Category = "UI|Situation", meta = (BindWidget))
94 TObjectPtr<UWrapBox> CardTags;
95
96 UPROPERTY(BlueprintReadOnly, Category = "UI|Situation", meta = (BindWidget))
97 TObjectPtr<UTextBlock> SituationDescriptionText;
98
99protected:
100 // 커서를 올렸을 때 카드가 커지는 배율.
101 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "UI|Situation|Hover")
102 float HoverScale = 1.08f;
103
104 // 커서가 카드 좌우 끝에 있을 때의 최대 회전각(도).
105 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "UI|Situation|Hover")
106 float MaxTiltAngle = 6.0f;
107
108 // 커서의 세로 위치로 만드는 최대 기울임(도). 카드가 앞뒤로 눕는 듯한 입체감을 준다.
109 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "UI|Situation|Hover")
110 float MaxShearAngle = 4.0f;
111
112 // 커서가 멈춰 있어도 계속 도는 좌우 흔들림의 진폭(도)과 속도.
113 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "UI|Situation|Hover")
114 float IdleSwayAngle = 1.5f;
115
116 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "UI|Situation|Hover")
117 float IdleSwaySpeed = 2.5f;
118
119 // 목표값을 따라가는 속도. 클수록 즉각적이고 작을수록 늘어진다.
120 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "UI|Situation|Hover")
121 float TransformInterpSpeed = 12.0f;
122
123protected:
124 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "UI|Situation")
125 TSubclassOf<UCardTagWidget> CardTagClass;
126
127 // 표 행 사본 대신 상황 인스턴스를 든다.
128 // 카드가 떠 있는 동안 후보가 GC 되지 않게 강참조로 잡는다.
129 UPROPERTY(Transient, BlueprintReadOnly, Category = "UI|Situation")
130 TObjectPtr<USituationBase> Situation;
131
132 // 표시 중인 아이콘 텍스처. 브러시에서 되꺼내지 않고 받은 그대로 들고 있는다.
133 UPROPERTY(Transient, BlueprintReadOnly, Category = "UI|Situation")
134 TObjectPtr<UTexture2D> IconTexture;
135
136protected:
137 // 카드 중심을 0 으로 둔 커서 위치. 좌상단이 (-1, -1), 우하단이 (1, 1).
138 FVector2D CursorOffset = FVector2D::ZeroVector;
139
140 // 지금 화면에 적용 중인 변형. 매 프레임 목표값으로 보간한다.
141 FVector2D CurrentScale = FVector2D::UnitVector;
142 FVector2D CurrentShear = FVector2D::ZeroVector;
143 float CurrentAngle = 0.0f;
144
145 // 흔들림 위상. 카드마다 다르게 시작해 세 장이 한 몸처럼 움직이지 않게 한다.
146 float SwayTime = 0.0f;
147
148 uint8 bHovered : 1 = false;
149};
DECLARE_MULTICAST_DELEGATE_OneParam(FOnSituationCardChosen, UCardWidget *)
ESituationTag
Definition SituationTag.h:17
Definition CardTagWidget.h:16
Definition CardWidget.h:31
FORCEINLINE UTexture2D * GetIconTexture() const
Definition CardWidget.h:49
Definition SituationBase.h:31
Definition UserWidgetBase.h:33