μΊλ¦ν°μ μ₯μ°© κ°λ₯ν μμ΄ν μ νλν ν μ°©μ©νλ κ²μ ꡬνν κ²μ΄λ€.
1. μμ΄ν μμ±
λ¨Όμ μ¬λ¬ μ’ λ₯μ μμ΄ν μ κ΄λ¦¬ν Base C++ Classλ₯Ό μμ±νλ€. μ΄ ν΄λμ€μμ μμ΄ν μ νμ , λ 벨, μΆ©λ λ± κ³΅ν΅μΌλ‘ μ¬μ©λ κΈ°λ₯λ€μ κ΄λ¦¬νλ€. κ° μμ΄ν λ§λ€ λ€λ₯΄κ² ꡬνλμ΄μΌ νλ κ²λ€μ λΈλ£¨νλ¦°νΈ ν΄λμ€λ₯Ό μμ±νμ¬ κ·Έ μμμ κ΄λ¦¬λλλ‘ λ°©ν₯μ μ‘μλ€.
μμ΄ν μ νμ μ UENUMμΌλ‘ μ μνλ€.
UENUM(BlueprintType)
enum class EItemType : uint8
{
E_Hat = 0 UMETA(DisplayName = "Hat"),
E_Bag UMETA(DisplayName = "Bag"),
E_Key UMETA(DisplayName = "Key"),
E_Gadget UMETA(DisplayName = "Gadget"),
E_Max UMETA(DisplayName = "Max")
};
νμ , λ 벨μ κ° μμ΄ν μ λ§κ² μμ λμ΄μΌ νκΈ° λλ¬Έμ λΈλ£¨νλ¦°νΈ ν΄λμ€μμ μ¬μ©λ μ μλλ‘ BlueprintReadWrite μ§μ μλ₯Ό μΆκ°νλ€.
μ½κΈ°λ§ ν κ±°λΌ μ²μμ BlueprintReadOnlyλ‘ μ μΈνμ§λ§ κ³μ ν¬λμκ° λ°μνλ©° μΈλ¦¬μΌμ΄ κΊΌμ‘λ€........ κ·Έλμ
BlueprintReadWriteλ‘ λ³κ²½νλλ μλλ 맀μ§! μ μ΄λ°μ§ μμλ λΆ
UPROPERTY(EditAnywhere, BlueprintReadWrite)
EItemType itemType = EItemType::E_Hat;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
int itemLevel = 1;
κ·Έ μΈμλ μ½λ¦¬λλ₯Ό μμ±ν ν Overlap λ°μΈλλ₯Ό νλ€. μ€μ νλ κ³Όμ μ μΊλ¦ν° λ΄ UInventoryComponentλ₯Ό ν΅ν΄ ν κ²μ΄κΈ° λλ¬Έμ Overlap μ ItemBase μ 보λ₯Ό λκΈ°κΈ°λ§ νλλ‘ κ΅¬ννλ€.
void AItemBase::OnBeginOverlap(UPrimitiveComponent* OverlappedComp, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult)
{
AUnderWorldCharacter* character = Cast<AUnderWorldCharacter>(OtherActor);
if (character)
{
character->InventoryComponent->BeginOverlap(this);
}
}
2. μμ΄ν μΆ©λ
ItemBaseλ₯Ό λΈλ£¨νλ¦°νΈ ν΄λμ€λ‘ μμ±νμ¬ Meshλ₯Ό μΆκ°ν ν Meshμ λ§κ² μ½λ¦¬λλ₯Ό μμ ν΄ μ€λ€.
μ΄μ μμ΄ν μ μν μ½λ¦¬μ μ€λΈμ νΈ μ±λμ μΆκ°νκ³ ν리μ λ μΆκ°ν΄μΌ νλ€. μΆκ°λ‘ Pawn ν리μ μ Itemμ OverlapμΌλ‘ μ€μ ν΄μΌ νλ€.
Overlap νμ§λ μμ΄ν μμ νλ―λ‘ Pawn ν리μ κΉμ§ μ€μ νμ§ μμλ μ λμμ νλ€. νμ§λ§ ν¨κ» μ€μ ν΄ μ£Όλ κ²μ΄ μ μ§λ³΄μ μ μ’μ κ² κ°λ€. μΆνμ Pawnμμλ νμ§ν κ²½μ°κ° μμ μκ° μμΌλ..!
- μΊλ¦ν°μλ Overlap μΆ©λμ ν΄μΌ νλ Pawnμ OverlapμΌλ‘ μ€μ νλ€.
- μμ΄ν λΌλ¦¬λ μΆ©λμ νλ©΄ μ λλ Itemμ IgnoreμΌλ‘ μ€μ νλ€.
λΈλ£¨νλ¦°νΈ ν΄λμ€λ‘ λμμ μμ΄ν νμ κ³Ό λ 벨μ μ€μ νκ³ μμ±ν Item μ½λ¦¬μ ν리μ λ³κ²½νλ€. μ¬κΈ°κΉμ§ νλ©΄ μμ΄ν κ³Ό Overlap ν μΊλ¦ν° UInventoryComponentμ μμ΄ν μ 보λ₯Ό λκΈΈ κ²μ΄λ€.
3. μμ΄ν νλ
νΉμ ν€λ₯Ό λλ₯΄λ©΄ μμ΄ν νλμ΄ κ°λ₯νλλ‘ μ λ ₯μ λ°λ Input Actionμ μΆκ°νλ€. ν€λ₯Ό λλ λμ§ μ¬λΆλ§ νμν΄μ bool νμ μΌλ‘ μμ±νλ€.
κ·Έ ν μμΈν μ€μ μ ν΄λΉ κΈμμ νμΈ κ°λ₯νλ€. ν΄λΉ κΈμμλ λΈλ£¨νλ¦°νΈ ν΄λμ€μμ λ°μΈλ©μ μ§ννμ§λ§, μ§κΈμ μΊλ¦ν° C++ ν΄λμ€μμ ꡬνμ΄ νμνλ C++ ν΄λμ€μ λ°μΈλ©μ νλ€.
EnhancedInputComponent->BindAction(ItemPickAction, ETriggerEvent::Started, this, &AUnderWorldCharacter::ItemPick);
μ΄μ νΉμ ν€λ₯Ό μ λ ₯νλ©΄ λ°μΈλ©λ ν¨μκ° νΈμΆλ κ²μ΄λ€. Overlap λ μμ΄ν μ 보λ UInventoryComponentμ μμΌλ―λ‘ μ λ ₯μ΄ λ°μν ν UInventoryComponentμ νλμ΄ κ°λ₯νμ§ μμ²νλ€. trueλ‘ λ°νλλ€λ©΄ νλμ΄ κ°λ₯νλ€λ κ²μΌλ‘ νλ¨νλ€.
// Header
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FXFDele);
class AUnderWorldCharacter : public ACharacter
{
public:
UPROPERTY(BlueprintAssignable)
FXFDele OnInputItemPick;
};
// C++
void AUnderWorldCharacter::ItemPick(const FInputActionValue& Value)
{
if (InventoryComponent->Input())
{
IsAnimStateLand = false;
OnInputItemPick.Broadcast();
}
}
- IsAnimStateLand: WASD μ λ ₯μ΄ λ€μ΄μμ λ κ±Έμ μ μλμ§ νλ¨νλ λ³μλ‘ μμ΄ν νλ λ± κ³ μ λ μμΉμμ μ λλ©μ΄μ μ΄ νμν λ falseλ‘ μ€μ νλ€.
- OnInputItemPick: μμ΄ν νλ μ λλ©μ΄μ μ 보μ¬μ£ΌκΈ° μν λ³μλ‘ Broadcast() νΈμΆ μ λ°μΈλ©λ μ΄λ²€νΈκ° νΈμΆλλ€.
μ λλ©μ΄μ μ΄μΌκΈ°κ° λμμΌλ μμ΄ν νλμ μν μ λλ©μ΄μ μ μ€μ ν κ²μ΄λ€. λ¨Όμ μ λλ©μ΄μ μ΄λ²€νΈ κ·Έλνμμ OnInputItemPick μ΄λ²€νΈ λ°μΈλ©μ΄ νμνλ€. μ΄ μ΄λ²€νΈλ₯Ό νΈμΆνλ©΄ Stateλ₯Ό 1λ‘ λ³κ²½νλλ°, Stateλ CustomμΌλ‘ μΆκ°ν λ³μλ‘ 0μ΄ κ±·κΈ°, λ°κΈ°, μμκΈ°μ κ°μ Land μ λλ©μ΄μ μ΄κ³ 1μ΄ μμ΄ν νλ μ λλ©μ΄μ μ΄λ€.
νμ¬ μ λλ©μ΄μ μ΄ μ€ν μ€μ΄μ΄λ λ°λ‘ λ€λ₯Έ μ λλ©μ΄μ μ μ€νν μ μλλ‘ Aliasλ₯Ό μ΄μ©νμ¬ κ° Stateλ₯Ό κ΄λ¦¬νλ€. μμ΄ν νλ ν€ μ λ ₯μ΄ λ€μ΄μ€λ©΄ Stateκ° 1λ‘ λ³κ²½λκ³ μμ΄ν νλ μ λλ©μ΄μ μ΄ μ€νλ κ²μ΄λ€.
μμ΄ν νλ μ λλ©μ΄μ μ΄ λλ ν λ€μ Stateκ° 0μΌλ‘ λμκ°μΌ νλ―λ‘ μμ΄ν νλ μ λλ©μ΄μ λμ Notify μΆκ°κ° νμνλ€.
ItemPickEnd Notifyκ° νΈμΆλλ©΄ Stateλ₯Ό 0μΌλ‘ μ€μ νκ³ IsAnimStateLandλ trueλ‘ λ³κ²½νλ€.
4. μμ΄ν μ₯μ°©
UInventoryComponent λ΄λΆμμ μμ΄ν νλ ν μ₯μ°© μμ΄ν μ΄λ©΄ μΊλ¦ν°μκ² μ₯μ°© μμ²μ νλ€. μ΄ μμ μ Meshλ₯Ό λ³κ²½ν΄μΌ νλ―λ‘ λΈλ£¨νλ¦°νΈ ν΄λμ€μμ κ°λ₯νλ€. κ·Έλμ μ₯μ°© μμ² ν¨μλ₯Ό BlueprintImplementableEvent μ§μ μλ‘ μ€μ νμ¬ C++μμ λΈλ£¨νλ¦°νΈ ν¨μλ₯Ό νΈμΆν μ μλλ‘ νλ€.
UFUNCTION(BlueprintImplementableEvent)
void ItemPutOn(EItemType type, int level);
ItemPutOnλ₯Ό νΈμΆνλ©΄ μλ λΈλ£¨νλ¦°νΈ μ΄λ²€νΈκ° μμ²λλ€. κ° νμ , λ 벨μ λ°λΌ μΊλ¦ν°μ μ₯μ°©ν΄ λ Meshμ Visible, Matarialμ λ³κ²½ν΄ μ€λ€. μΊλ¦ν° λ΄ μμ΄ν Meshλ Socketμ ν΅ν΄ μμΉ, νμ , μ€μΌμΌ λ± μ€μ μ΄ νμνλ€.
5. μλ£
μμ΄ν κ·Όμ²μμ ν€λ₯Ό λλ₯΄λ©΄ ν΄λΉ μμ΄ν μ μ°©μ©νλ€.
μΈμ¬νλ κ² κ°μ 보μ΄μ§λ§ μμ΄ν μ€λ μ λλ©μ΄μ μ λλ€.