업적/미션 Pt.3에서 OnClickClaimBtn 호출 시 Sort 부분 호출 동작
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âu trả lời 1
0
안녕하세요! BurningCarrot입니다. 문의해 주신 내용에 답변 드립니다.
혹시 AchievementUI 스크립트에 아래 코드가 포함되어 있을까요? 해당 코드가 있어야 OnAchievementProgressed 함수가 작동합니다.
public class AchievementUI : BaseUI
{
//...
private void OnEnable()
{
Messenger.Default.Subscribe<AchievementProgressMsg>(OnAchievementProgressed);
}
private void OnDisable()
{
Messenger.Default.Unsubscribe<AchievementProgressMsg>(OnAchievementProgressed);
}
//...
}
0
네 있습니다 강사님과 동일한 환경일 때 강사님의 코드는 업적 받기 버튼을 누를 때 골드획득 시 호출되는 Messenger.Default.Publish함수가 실행되어 다시 Sort가 되는거 같은데 골드를 받지 않는 골드 달성 업적과 같은 업적은 클리어가 돼도 바로 Sort가 실행되지 않는거 같습니다.
0
아 그렇다면 해당 코드를 누락하신 것 같습니다. 당연히 AchievementType.CollectGold 인수는 새로운 달성 업적에 맞는 값을 지정해 주셔야 합니다. 이 코드 내부에서 AchievementProgressMsg 발행 처리를 해 주기 때문입니다.
userAchievementData.ProgressAchievement(AchievementType.CollectGold, achievementData.AchievementRewardAmount);이 코드로 해결이 되셨을까요?
0
거듭된 질문 죄송합니다. 현재 코드가 OnClickClaimBtn()함수에서

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

위 함수가 실행되며 만약 골드업적을 이미 달성한 상태라면,
if (!userAchievementProgressData.IsAchieved)위 조건문으로 들어가지 못하고 함수가 끝나서
var achievementProgressMsg = new AchievementProgressMsg();
Messenger.Default.Publish(achievementProgressMsg);이 메세지가 보내지지 않아 Sort가 안되지 않나요?
제 질문은 요약하자면,
이미 골드 업적을 클리어한 상태에서 업적 보상으로 골드를 받았을 때, Messenger.Default.Publish(achievementProgressMsg); 가 실행되는 부분이 없기 때문에 업적 창에서 보상획득 버튼을 눌러도 Sort가 실행되지 않지 않나요?
만약 업적 보상이 젬이라면 마찬가지로 Messenger.Default.Publish(achievementProgressMsg); 가 실행되는 부분이 없기 때문에 업적 창에서 보상획득 버튼을 눌러도 Sort가 실행되지 않지 않나요?
이 두 질문입니다. 혹시나 제가 이해를 잘못했다거나 이해를 못한 부분이 있을거 같아서 거듭된 질문 드립니다... 감사합니다.
0
안녕하세요! BurningCarrot입니다.
자세한 질문 감사 드립니다.
질문 1,2번 모두 수강생 분이 이해하신 것이 맞습니다. 코드를 보니 ProgressAchievement 함수 마지막 부분이 아래와 같이 변경되어야 이미 업적을 클리어한 상태에서 보상을 받았을 때 Sort가 이루어질 것 같네요. 이게 원래 기대하신 로직 처리가 맞으실까요?

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

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


이렇게 해보시겠어요? ProgressAchivement를 제일 아래로 끌어내리고 switch문에서 관련 업적 달성이 있다면 AchievementType을 세팅해주는 방식으로 바꿨습니다. 이렇게 하시면 Gem업적 달성 처리 그리고 그외에 다른 업적을 추가하셔도 동일하게 처리될 것입니다.
0
위 방식이 제가 원하는 방식에 가장 가까운 방식입니다만, 하나 궁금한것이
if (achievementType != AchievementType.None)
{
userAchievementData.ProgressAchievement(achievementType, achievementData.AchievementRewardAmount);
}이 방식으로 했을 때, 만약 업적의 보상이 리워드타입과 다르거나 업적 데이터테이블에 적용되어 있지않은 장비나 기타 다른 보상이라면 위 함수가 실행되지 않아서 AchievementProgressMsg를 보낼 수 없어서 그런 상황에서는 따로 AchievementProgressMsg만 보낼 수 있게 구현하는 것이 좋을까요 ?
0
네 그럴 경우에는 따로 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

