inflearn logo
강의

Khóa học

Chia sẻ kiến thức

Lập trình hệ thống Unity Pt.1 - Gói tất cả trong một về các hệ thống cốt lõi để hiện thực hóa trò chơi thương mại

Hệ thống Thành tựu/Nhiệm vụ Pt.3 (ClearChapterUI, InGameManager)

업적/미션 Pt.3에서 OnClickClaimBtn 호출 시 Sort 부분 호출 동작

Đã giải quyết

107

kts122601976

3 câu hỏi đã được viết

0

 public void OnClickClaimBtn()
    {
        if(!m_AchievementItemData.IsAchieved || m_AchievementItemData.IsRewardClaimed)
        {
            return;
        }

        var userAchievementData = UserDataManager.Instance.GetUserData<UserAchievementData>();
        if(userAchievementData == null)
        {
            Logger.LogError("UserAchievementData does not exist.");
            return;
        }

        var achievementData = DataTableManager.Instance.GetAchievementData(m_AchievementItemData.AchievementType);
        if(achievementData == null)
        {
            Logger.LogError("AchievementData does not exist.");
            return;
        }

        var userAchievedData = userAchievementData.GetUserAchievementProgressData(m_AchievementItemData.AchievementType);
        if(userAchievedData != null)
        {
            var userGoodsData = UserDataManager.Instance.GetUserData<UserGoodsData>();
            if(userGoodsData != null)
            {
                userAchievedData.IsRewardClaimed = true;
                userAchievementData.SaveData();
                m_AchievementItemData.IsRewardClaimed = true;

                switch (achievementData.AchievementRewardType)
                {
                    case GlobalDefine.RewardType.Gold:
                        userGoodsData.Gold += achievementData.AchievementRewardAmount;
                        var goldUpdateMsg = new GoldUpdateMsg();
                        goldUpdateMsg.isAdd = true;
                        Messenger.Default.Publish(goldUpdateMsg);
                        userAchievementData.ProgressAchievement(AchievementType.CollectGold, achievementData.AchievementRewardAmount);
                        break;
                    case GlobalDefine.RewardType.Gem:
                        userGoodsData.Gem += achievementData.AchievementRewardAmount;
                        var gemUpdateMsg = new GemUpdateMsg();
                        gemUpdateMsg.isAdd = true;
                        Messenger.Default.Publish(gemUpdateMsg);
                        break;
                    default:
                        break;
                }

                userGoodsData.SaveData();
            }
        }
    }

이 부분에서 8:17초 부분 보시면 보상 받고 바로 UI Sort가 호출되는게 OnAchievementProgressed가 호출 돼서 그런거 같은데 저 OnClickClaimBtn 함수 내에선 찾아봐도 OnAchievementProgressed가 호출 될 수 있는 부분이 안보여서 질문드립니다. 제 동작 역시 보상을 받고 Sort는 일어나지 않습니다.

저 userGoodsData.SaveData(); 밑에

var achievementProgressMsg = new AchievementProgressMsg(); Messenger.Default.Publish(achievementProgressMsg); 를 호출해야하나요..?

 

다시 확인해보니 골드업적이 깨지기 전이면 골드 업적 갱신부분에서 Sort가 호출되서 그러는거 같은데 이미 골드 업적을 깬 상태면 Sort가 발생하지 않습니다. 

 

 

C# unity 객체지향 game-programming

Câu trả lời 1

0

burningcarrot

안녕하세요! BurningCarrot입니다. 문의해 주신 내용에 답변 드립니다.

혹시 AchievementUI 스크립트에 아래 코드가 포함되어 있을까요? 해당 코드가 있어야 OnAchievementProgressed 함수가 작동합니다.

public class AchievementUI : BaseUI
{
    //...
    private void OnEnable()
    {
        Messenger.Default.Subscribe<AchievementProgressMsg>(OnAchievementProgressed);
    }

    private void OnDisable()
    {
        Messenger.Default.Unsubscribe<AchievementProgressMsg>(OnAchievementProgressed);
    }
    //...
}

 

0

kts122601976

네 있습니다 강사님과 동일한 환경일 때 강사님의 코드는 업적 받기 버튼을 누를 때 골드획득 시 호출되는 Messenger.Default.Publish함수가 실행되어 다시 Sort가 되는거 같은데 골드를 받지 않는 골드 달성 업적과 같은 업적은 클리어가 돼도 바로 Sort가 실행되지 않는거 같습니다.

0

burningcarrot

아 그렇다면 해당 코드를 누락하신 것 같습니다. 당연히 AchievementType.CollectGold 인수는 새로운 달성 업적에 맞는 값을 지정해 주셔야 합니다. 이 코드 내부에서 AchievementProgressMsg 발행 처리를 해 주기 때문입니다.

userAchievementData.ProgressAchievement(AchievementType.CollectGold, achievementData.AchievementRewardAmount);

이 코드로 해결이 되셨을까요?

0

kts122601976

거듭된 질문 죄송합니다. 현재 코드가 OnClickClaimBtn()함수에서

image.png

위 Switch문에서 보상이 골드일 때 userAchievementData.ProgressAchievement(AchievementType.CollectGold, achievementData.AchievementRewardAmount);
가 실행되면서 UserAchievementData 스크립트에서

image.png

위 함수가 실행되며 만약 골드업적을 이미 달성한 상태라면,

if (!userAchievementProgressData.IsAchieved)

위 조건문으로 들어가지 못하고 함수가 끝나서

var achievementProgressMsg = new AchievementProgressMsg();
Messenger.Default.Publish(achievementProgressMsg);

이 메세지가 보내지지 않아 Sort가 안되지 않나요?

제 질문은 요약하자면,

  1. 이미 골드 업적을 클리어한 상태에서 업적 보상으로 골드를 받았을 때, Messenger.Default.Publish(achievementProgressMsg); 가 실행되는 부분이 없기 때문에 업적 창에서 보상획득 버튼을 눌러도 Sort가 실행되지 않지 않나요?

  2. 만약 업적 보상이 젬이라면 마찬가지로 Messenger.Default.Publish(achievementProgressMsg); 가 실행되는 부분이 없기 때문에 업적 창에서 보상획득 버튼을 눌러도 Sort가 실행되지 않지 않나요?

이 두 질문입니다. 혹시나 제가 이해를 잘못했다거나 이해를 못한 부분이 있을거 같아서 거듭된 질문 드립니다... 감사합니다.

0

burningcarrot

안녕하세요! BurningCarrot입니다.

자세한 질문 감사 드립니다.

질문 1,2번 모두 수강생 분이 이해하신 것이 맞습니다. 코드를 보니 ProgressAchievement 함수 마지막 부분이 아래와 같이 변경되어야 이미 업적을 클리어한 상태에서 보상을 받았을 때 Sort가 이루어질 것 같네요. 이게 원래 기대하신 로직 처리가 맞으실까요?

image.png

 

0

kts122601976

맞습니다 !

1번 질문은 위와 같은 형태로 가능한데 저 구조로는 2번 질문에 대한 답인 젬 보상 업적 클리어 시 Sort 적용인데, 그냥 OnclickClaimbtn 함수 내에서

스크린샷 2025-11-13 오후 12.01.00.png

위 사진처럼 수정하는게 맞을까요 ? 아니면 좀 더 효율적인 방법이 있을까요 ?

 

0

burningcarrot

image.png

 

image.png

이렇게 해보시겠어요? ProgressAchivement를 제일 아래로 끌어내리고 switch문에서 관련 업적 달성이 있다면 AchievementType을 세팅해주는 방식으로 바꿨습니다. 이렇게 하시면 Gem업적 달성 처리 그리고 그외에 다른 업적을 추가하셔도 동일하게 처리될 것입니다.

0

kts122601976

위 방식이 제가 원하는 방식에 가장 가까운 방식입니다만, 하나 궁금한것이

if (achievementType != AchievementType.None)
{
    userAchievementData.ProgressAchievement(achievementType, achievementData.AchievementRewardAmount);
}

이 방식으로 했을 때, 만약 업적의 보상이 리워드타입과 다르거나 업적 데이터테이블에 적용되어 있지않은 장비나 기타 다른 보상이라면 위 함수가 실행되지 않아서 AchievementProgressMsg를 보낼 수 없어서 그런 상황에서는 따로 AchievementProgressMsg만 보낼 수 있게 구현하는 것이 좋을까요 ?

0

burningcarrot

네 그럴 경우에는 따로 AchievementProgressMsg를 보낼 수 있게 구현하면 됩니다. ProgressAchievement 함수가 아닌 새로운 함수를 만들어서 거기에 기타 다른 보상에 대한 처리를 구현을 해주시면 되겠습니다.

싱글턴패턴

0

11

1

LobbyUIController의 백키가 사라졌는데 왜그런건가요?

0

42

2

무조건 타이틀 씬부터 시작해야하나요?

0

41

1

BaseUI, UIManager

0

51

3

3d프로젝트에 적용해도 무방한가요?ㅁ

0

71

2

UserDataManager 코드 질문입니다.

0

88

2

데이터 로드 관련 질문

0

88

2

16번 강의에서 ShowUI 함수부분 오타가 있는거 같습니다.

0

72

2

PlayerPrefs 에 대해서 문의드립니다.

0

106

2

다운 받은 자료 용량 관련 문의입니다.

0

93

2

userDataList Json으로 저장

0

101

2

Lobby 프리팹 구성 질문

0

99

3

씬로딩 관련한 질문드립니다.

0

103

2

보충강의를 들었는데도 불구하고 Confirm UI 창이 표시가 되지 않습니다.

0

141

2

Resources폴더의 로드에 대하여 궁금한 것이 있습니다.

1

155

2

LoadData함수가 호출되지 않습니다.

0

87

1

캔버스를 여러 장 사용하는 이유

0

151

1

인피티니스크롤 item의 rect Transform에 Nan값

0

110

2

아이템 필터 기능

0

145

1

[Title씬 구성 관련 질문 : 프리팹]

0

181

2

CSVReader 자세하게 설명 가능하신가요?

0

226

1

안녕하세요 일시정지부분

0

168

2

세션5 게임 셋팅 팝업 창 관련(unity6)

0

204

3

마지막 챕터를 클리어했을때 예외처리 질문입니다.

0

135

2