Mail - osy9611/ProjectPT GitHub Wiki
ν΄λΉ λ¬Έμλ λΆκ΄΄ μ€νλ μΌμ μ°νΈ μμ€ν μ λͺ¨μν λ΄μ©μ κΈ°λ‘ν λ¬Έμμ΄λ€.
νμ¬ μλ² μ°λμ΄ μλ μνμμ ν΄λΌμ΄μΈνΈκ° μμμ μΌλ‘ μ²λ¦¬νκ³ μμΌλ©°, ν₯ν μλ² μΆκ° μ μμ λ ꡬ쑰λ₯Ό κ³ λ €νμ¬ μ€κ³κ° λμλ€.

μ£Όμ κΈ°λ₯
-
λ©μΌ 리μ€νΈ λ·°
-
λ°μ λ©μΌμ 리μ€νΈ ννλ‘ νμΈ κ°λ₯
-
μλ²μμ ν λ²μ λ§μ λ©μΌμ 보λ΄λ κ²μ λ°©μ§νκΈ° μν΄ λΆν μμ²μ μ²λ¦¬
-
μ€ν¬λ‘€ νΉμ μμΉ λλ¬ μ μλ‘μ΄ λ©μΌ λ°μ΄ν°λ₯Ό μμ²νμ¬ μΆκ°μ μΈ ν¨ν· λ‘λλ₯Ό μ΅μν
-
μλ²μμ λ°μ λ©μΌ κ°μλ₯Ό μ΄κ³Όνλ©΄ λ μ΄μ μμ²νμ§ μλλ‘ κ΅¬ν
-
μλ² μμ² νλ¦(ν₯ν μλ² μ°λ μ)
- μ€ν¬λ‘€μ΄ 70% μ΄μ λ΄λ €κ°λ©΄ λ©μΌ μΆκ° μμ²
- μλ²μμ μΆκ° λ©μΌ λ°μ΄ν°λ₯Ό λ°ν
- κΈ°μ‘΄ 리μ€νΈμμ μλ‘μ΄ λ©μΌμ μΆκ°
- λ§μ½ μλ²μμ βλ μ΄μ λ©μΌ μμβ μλ΅μ λ°μΌλ©΄ μΆκ° μμ² μ€μ§
μλ² μμ² λ€μ΄μ΄κ·Έλ¨ (μμ)
[μ€ν¬λ‘€ νΉμ μμΉ λλ¬] β [μλ²μ μΆκ° λ©μΌ μμ²] β [μλ² μλ΅ μμ ] β [UI μ λ°μ΄νΈ]
-
-
λ©μΌ μμΈ νμ
- μ νν λ©μΌμ μ λͺ©, λ°μ μ, λ΄μ©, μ²¨λΆ λ³΄μ λ±μ νμΈ κ°λ₯
-
보μ μλ Ή λ° λ©μΌ μμ
- 보μ μλ Ή ν μμ κ°λ₯ (νμ¬λ ν΄λΌμ΄μΈνΈμμ μμ μ²λ¦¬)
- ν₯ν μλ² μΆκ° μ μμ² - μλ΅μ κΈ°λ°μΌλ‘ μμ λ°©μ λ³κ²½ μμ
μ°νΈ λ°μ΄ν° ꡬ쑰
-
μ΄μν΄μμ μμ±λ λ©μΌκ³Ό μμ€ν λ©μΌμ ꡬλΆ
- μ΄μν΄μμ μ§μ μμ±νλ λ©μΌκ³Ό κ²μ μμ€ν μμ μλ λ°μ‘νλ λ©μΌμ λΆλ¦¬νμ¬ κ΄λ¦¬
- μλ²μμ λ°μ λ°μ΄ν°μ ν μ΄λΈ IDκ° 0μ΄λ©΄ μ΄μν΄μμ μμ±ν λ©μΌλ‘ κ°μ£Ό
-
λ°μ΄ν° ꡬ쑰
tableNo MailType MailName MailDesc int MailType string string
μλ² μ°λ λ° νμ₯μ±
-
λ©μΌ λ°μ΄ν° μμ² νλ¦
- λ©μΌ UI μ€ν¬λ‘€ νΉμ μμΉ(70%)μ λλ¬νλ©΄ μΆκ° μμ² λ°μ
- μλ²μμ μλ‘μ΄ λ°μ΄ν°λ₯Ό κ°μ Έμ΄
- μλ²μμ λ°μ μ μλ μ΅λ λ©μΌμ μ΄κ³Όνλ©΄ μΆκ° μμ² μ€μ§
-
μλ²κ° μΆκ°λλ©΄ μμ λ‘μ§ λ³κ²½
- νμ¬λ ν΄λΌμ΄μΈνΈμμ μ¦μ μμ λμ§λ§ μλ² μ°λ νμλ μμ² ν¨ν·μ 보λ΄κ³ μλ΅μ λ°μ ν μμ λλλ‘ λ³κ²½λ μμ
UI/UI κ³ λ € μ¬ν
-
RedDot μ²λ¦¬
- 보μμ λ°μ§ μμ λ©μΌμ λ λλ· νμλ₯Ό ν΅ν΄ λ―ΈνμΈ λ©μΌμμ λͺ νν ν¨
- μ κ· λ©μΌ λμ°© μ λ‘λΉμ λ©μΌ UIμλ λ λλ· νμ±ν
-
λ©μΌ 리μ€νΈ μ
λ°μ΄νΈ μ΅μ ν
- μ 체 λ°μ΄ν°λ₯Ό λ§€λ² μ¬μμ±νλ λμ , κΈ°μ‘΄ λ°μ΄ν° μ λ°μ΄νΈ, μ κ· λ°μ΄ν° μΆκ°, λΆνμν λ°μ΄ν° μμ λ₯Ό ν΅ν΄ μ±λ₯ μ΅μ ν
μλ² λ°μ΄ν° μ²λ¦¬
-
μλ²μμ λ°μ΄ν°λ₯Ό λ°λλΌλ, ν΄λΌμ΄μΈνΈλ λ§λ£λ λ©μΌμ νμ¬ μκ°κ³Ό λΉκ΅νμ¬ μμ
-
μ£Όμ μ½λ
// λ§λ£λ λ©μΌ μλ μμ (μλ² ν΅μ μ λ¨κ³μμ μ 리) MailDatas.RemoveAll([](const FMailData& MailData) { return MailData.ExpireDate.GetTicks() < FDateTime::Now().GetTicks(); });
λ©μΌ μ λ°μ΄νΈ κ°±μ λ° λ λλ· μ²λ¦¬
-
보μμ μμ§ λ°μ§ μμ λ©μΌμ΄ μλ κ²½μ° λ λλ·μ νμ±ν
-
μ£Όμ μ½λ
void UPTPlayerDataSubsystem::UpdateMails() { bool RedDotActive = MailDatas.ContainsByPredicate([](const FMailData& MailData) { return MailData.ReceivedDate.GetTicks() == 0; }); UpdateContentRedDot(ERedDotType::Mail, RedDotActive); const FPTGameplayTags& GameplayTags = FPTGameplayTags::Get(); UGameplayMessageSubsystem& MessageSubsystem = UGameplayMessageSubsystem::Get(this); FUIUpdateMailMessage Message; MessageSubsystem.BroadcastMessage(GameplayTags.UI_Event_MailUpdate, Message); }
λ©μΌ 리μ€νΈ μ λ°μ΄νΈ λ° μλ² λΆν μμ²
-
μ€ν¬λ‘€ νΉμ μμΉ(70%) λλ¬ μ μλ‘μ΄ λ©μΌ λ°μ΄ν°λ₯Ό μμ²
-
μ£Όμ μ½λ
void UPTMailWidget::RegisterGetMailDataCallback() { // νμ¬ μμΉμ 70% μ λκ° λλ©΄ λ©μΌ μ λ°μ΄νΈ μμ²μ μ§ν int32 NumItems = MailListView->GetNumItems(); int32 Index = FMath::FloorToInt(NumItems * RecieveScrollPercent); Index = FMath::Clamp(Index, 0, NumItems - 1); UObject* Target = MailListView->GetItemAt(Index); if (UPTMailCellData* CellData = Cast<UPTMailCellData>(Target)) { CellData->OnGetMailDataCallback = [this]() { RequesetRecieveMailData(); }; } }
λ©μΌ μμ
-
μλ²κ° μκΈ° λλ¬Έμ ν΄λΌμ΄μΈνΈμμ μμ λ₯Ό μμ μ²λ¦¬νμ§λ§, ν₯ν μλ²μμ μλ΅ ν μμ νλλ‘ λ³κ²½ μμ
-
μλ² μ°λ νμλ μμ²μ 보λ΄κ³ μλ΅μ λ°μ ν μ€μ μμ κ° μ΄λ£¨μ΄μ§λ λ°©μμΌλ‘ λ³κ²½
-
νμ¬λ ν΄λΌμ΄μΈνΈμμ μ¦μ μμ νμ§λ§, ν₯ν μλ² κ²μ¦ ν μμ μ μ©
-
μ£Όμ μ½λ
void UPTPlayerDataSubsystem::RequestDeleteMail(FGameplayTag InChannel, const FDeleteMailMessage& InMessage) { TArray<FMailData> RemoveMails = MailDatas.FilterByPredicate([InMessage](const FMailData& MailData) { bool CanRemove = MailData.ReceivedDate.GetTicks() > 0 || MailData.ExpireDate.GetTicks() < FDateTime::Now().GetTicks(); return CanRemove && InMessage.Pids.Contains(MailData.Pid); }); if (!RemoveMails.IsEmpty()) { //ν΄λΉ λΆλΆμ μλ²κ° μλ€λ©΄ μλ²μμ λ°μ λ°μ΄ν° μ²λ¦¬λ₯Ό νκ³ UpdateMails()λ₯Ό νΈμΆνλ€. MailDatas.RemoveAll([InMessage](const FMailData& MailData) { bool CanRemove = MailData.ReceivedDate.GetTicks() > 0 || MailData.ExpireDate.GetTicks() < FDateTime::Now().GetTicks(); return CanRemove && InMessage.Pids.Contains(MailData.Pid); }); UpdateMails(); } }
λ©μΌ 보μ
-
보μ λ―Έ μλ Ή λ©μΌμ λν΄ ν΄λΌμ΄μΈνΈμμ 보μ μμ²μ μ²λ¦¬νκ³ , UI νμ μ ν΅ν΄ 보μ λ΄μμ νμ
-
μ£Όμ μ½λ
void UPTPlayerDataSubsystem::RequestReceiveReward(FGameplayTag InChannel, const FRecieveRewardMessage& InMessage) { UE_LOG(PTLog, Error, TEXT("[PTPlayerDataSubsystem] RequestReceiveReward")); if (InMessage.Pids.IsEmpty()) return; TArray<FMailData> MergeRewardDatas; FDateTime CurrentTime = FDateTime::Now(); for (const FString& Pid : InMessage.Pids) { FMailData* MailData = MailDatas.FindByPredicate([Pid](const FMailData& MailData) { return MailData.Pid == Pid; }); if (!MailData) continue; MailData->ReceivedDate = CurrentTime; MergeRewardDatas.Add(*MailData); } if (!MergeRewardDatas.IsEmpty()) { TArray<FItemReward> ItemRewards = MergeRewardData(MergeRewardDatas); UPTUIManagerSubsystem* UIManager = GetWorld()->GetGameInstance()->GetSubsystem<UPTUIManagerSubsystem>(); UIManager->ShowItemRewardPopup(ItemRewards); } UpdateMails(); }