Hide Widget
Item을 쳐다보지 않거나, 일정거리 이상 멀어지면 위젯을 비활성화 하도록 하겠습니다.
마지막으로 쳐다본 아이템의 정보를 저장할 TraceHitItemLastFrame을 만들겠습니다.
ShooterCharacter.h
// The AItem we hit last frame
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Items, meta = (AllowPrivatieAccess = true))
class AItem *TraceHitItemLastFrame;
기존의 TraceForItems()에 TraceHitItemLastFrame을 설정하고, nullptr이 아니고, 현재 쳐다보는 대상이 아니라면 보이지 않게 설정합니다.
ShooterCharacter.cpp
void AShooterCharacter::TraceForItems()
{
if (bShouldTraceForItems)
{
...
if (ItemTraceResult.bBlockingHit)
{
...
// We hit an AItem last frame
if (TraceHitItemLastFrame)
{
if (HitItem != TraceHitItemLastFrame)
{
// We are hitting a different AItem this frame form last frame
// Or AItem is null.
TraceHitItemLastFrame->GetPickupWidget()->SetVisibility(false);
}
}
// Store a reference to HitItem for next frame
TraceHitItemLastFrame = HitItem;
}
}
}
추가로 겹치는 Item이 없을 때 TraceHitItemLastFrame에 해당하는 위젯을 비활성화합니다. (거리가 멀어졌을 때)
void AShooterCharacter::TraceForItems()
{
if (bShouldTraceForItems)
{
...
}
else if (TraceHitItemLastFrame)
{
// No longer overlapping any items,
// Item last frame should not show widget
TraceHitItemLastFrame->GetPickupWidget()->SetVisibility(false);
}
}
유저가 창을 띄우다니 이거 완전 상태창
Bind Item Name
Item의 이름에 맞게 Widget의 이름이 바뀌도록 설정할것 입니다.
Item에 이름을 저장할 변수를 만들어 줍니다.
Item.h
// The name which appears on the Pickup Widget
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Item Properties", meta = (AllowPrivateAccess))
FString ItemName;
Item.cpp
AItem::AItem() : ItemName(FString("Default"))
BP_PickupWidget으로 와서 ITem Name Text > Content > Text 에서 Create Binding을 누른다.
Get Item Name Text Text 창에서 Item의 Reference 변수를 선언해 줍니다.
위에서 선언한 Item Ref 변수를 초기화 하기 위해서 BP_BaseWeapon의 BeginPlay에서 로직을 작성해 줍니다.
BP_PickupWidget으로 돌아와서 Get Item Name Text를 수정해주면 완성 됩니다.
World에 있는 객체의 ItemName을 바꾸면 다른 이름을 적용할 수 있습니다.
Bind Item Count
Bellyn Font를 다운로드하고 Widget의 이름 폰트를 변경해 주었습니다.
Item에서 ItemName 때와 같이 count를 저장할 변수를 만들고 초기화 합니다.
Item.h
// Item count (ammo, etc)
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Item Properties", meta = (AllowPrivateAccess))
int32 ItemCount;
Item.cpp
AItem::AItem() : ItemName(FString("Default")),
ItemCount(0)
컴파일 후 BP_PickupWidget으로 돌아와서 Item Box > Text > Create Binding을 눌러줍니다.
아래와 같이 만들어주시면 됩니다.
초기값은 0이고 바꾸고 싶다면 객체의 변수(ItemCount)를 수정하면 됩니다.
Bind Star Opacity
등급에따른 별의 투명도(Opacity)를 조절할것 입니다.
Item.h에서 등급 Enum class를 만들어 줍니다.
Item.h
UENUM(BlueprintType)
enum class EItemRarity : uint8
{
EIR_Damaged UMETA(DisplayName = "Damaged"),
EIR_Common UMETA(DisplayName = "Common"),
EIR_Uncommon UMETA(DisplayName = "Uncommon"),
EIR_Rare UMETA(DisplayName = "Rare"),
EIR_Legendary UMETA(DisplayName = "Legendary"),
EIR_MAX UMETA(DisplayName = "DefaultMax")
};
- UENUM(BlueprintType): UENUM 매크로는 이 열거형이 블루프린트에서 사용될 수 있도록 정의합니다. BlueprintType 매개변수는 이 열거형을 블루프린트에서 직접 사용할 수 있게 해 줍니다.
- enum class EItemRarity : uint8: C++11에서 도입된 스코프가 있는 열거형(enum class)을 사용하여 EItemRarity라는 이름의 열거형을 정의합니다. uint8은 이 열거형의 기본 유형이며, 열거형의 각 값은 8비트 부호 없는 정수로 표현됩니다.
- 열거형 값:
- EIR_Damaged, EIR_Common 등은 열거형의 멤버로, 아이템의 희귀도를 나타냅니다.
- UMETA(DisplayName = "..."): 각 열거형 멤버에 UMETA 매크로를 사용하여 블루프린트 에디터에서 표시될 이름을 지정합니다. 예를 들어, EIR_Damaged는 에디터에서 "Damaged"로 표시됩니다.
추가로 Item이 가질 등급의 변수를 만들고 초기화 해줍니다.
// Item rerity - determines number of stars in Pickup Widget
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Item Properties", meta = (AllowPrivateAccess))
EItemRarity ItemRarity;
Item.cpp
AItem::AItem() : ItemName(FString("Default")),
ItemCount(0),
ItemRarity(EItemRarity::EIR_Common)
별의 투명도를 정해줄 배열을 선언해 주고, 이를 초기화할 함수를 만들어 줍니다.
Item.h
// Sets the ActiveStarts array of bools based on rarity
void SetActiveStars();
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Item Properties", meta = (AllowPrivateAccess))
TArray<bool> AtiveStars;
Item.cpp
// Called when the game starts or when spawned
void AItem::BeginPlay()
{
...
SetActiveStars();
}
void AItem::SetActiveStars()
{
for (int32 i = 0; i < 5; i++)
{
if (i <= (int)ItemRarity)
{
ActiveStars.Add(true);
}
else
{
ActiveStars.Add(false);
}
}
}
컴파일 후 BP_PickupWidget으로 돌아와서 첫 번째 별을 클릭하고 Appearance > Color and Opacity >Create binding 을 눌러줍니다.
우선 그래프를 아래와 같이 만들어 줍니다.
이후 편의성을 위하여 Visible Alpha, Hidden Alpha 변수를 만듭니다.
그리고 각자의 별에 같은 값을 가지면 안되니, 지역변수 ReturnAlpha를 하나 만들어 줍니다.
이어서 그래프를 완성시켜 줍니다.
모든 별 Widget에 이와 같은 작업을 해야함으로, 재사용성을 위해 모두 선택하여 Function으로 만들어줍니다. (Collapse to Function)(함수 이름은 Get Star Opacity)
이후 Detail창에서 Inputs를 int로 생성해줍니다. (int ActiveStar)
Outputs에선 StarAlpha를 Linear Color로 만들어줍니다. (LinearColor StarAlpha)
이후 블루프린트를 아래와 같이 만들고 GetStarOpacity함수 내부로 진입합니다.
함수로 만들면 오류가 뜨는데, ReturnAlpha를 Local Variables로 다시 생성해줍니다.
이후 아래와 같이 만드어줍니다.
다른 별들도 이 같이 설정해 주되 함수의 ActiveStarIndex 매개변수의 값을 바꿔줍니다.
Rare인 아이템의 별이 4개만 보이게 완성
Spawn Default Weapon
'Unreal 공부 > Unreal Engine 4 C++ The Ultimate Shooter' 카테고리의 다른 글
The Weapon - 2 (1) | 2024.01.09 |
---|---|
The Weapon - 1 (0) | 2024.01.05 |
Aiming and Crosshairs - 3 (0) | 2024.01.04 |
Aiming and Crosshairs - 2 (1) | 2024.01.04 |
Aiming and Crosshairs - 1 (0) | 2023.12.31 |