인프런 커뮤니티 질문&답변
업적/미션 Pt.3에서 OnClickClaimBtn 호출 시 Sort 부분 호출 동작
작성
·
60
·
수정됨
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가 발생하지 않습니다.
답변 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);
}
//...
}
아 그렇다면 해당 코드를 누락하신 것 같습니다. 당연히 AchievementType.CollectGold 인수는 새로운 달성 업적에 맞는 값을 지정해 주셔야 합니다. 이 코드 내부에서 AchievementProgressMsg 발행 처리를 해 주기 때문입니다.
userAchievementData.ProgressAchievement(AchievementType.CollectGold, achievementData.AchievementRewardAmount);이 코드로 해결이 되셨을까요?
거듭된 질문 죄송합니다. 현재 코드가 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가 실행되지 않지 않나요?
이 두 질문입니다. 혹시나 제가 이해를 잘못했다거나 이해를 못한 부분이 있을거 같아서 거듭된 질문 드립니다... 감사합니다.
안녕하세요! BurningCarrot입니다.
자세한 질문 감사 드립니다.
질문 1,2번 모두 수강생 분이 이해하신 것이 맞습니다. 코드를 보니 ProgressAchievement 함수 마지막 부분이 아래와 같이 변경되어야 이미 업적을 클리어한 상태에서 보상을 받았을 때 Sort가 이루어질 것 같네요. 이게 원래 기대하신 로직 처리가 맞으실까요?

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

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


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





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