반응형
SMALL
DateTime 구조체를 이용하여 버튼을 누른 날짜를 srtring 형태로 저장 후 버튼을 다시 눌렀을때 비교하여 오늘 리워드를 받아는지 못받았는지 확인 하는 구조.(하루에 1개의 리워드만 수령 가능)
리워드 수령을 시간 비교를 하지 않고 수령 가능하게 하였을시
UI Main
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System;
using UnityEngine;
using Newtonsoft.Json;
public class RewardDailyMain : MonoBehaviour
{
public UIRewardDailyDirector director;
void Start()
{
DataManager.instance.loadDailyRewardData();
DataManager.instance.loadRewarditemData();
DataManager.instance.loadCurrencyData();
InfoManager.instance.Init();
string path = string.Format("{0}/mission_info.json", Application.persistentDataPath);
if (InfoManager.instance.IsNewbie())
{
Debug.Log("<color=Cyan>====(경) 뉴비 입성 (축)===</color>");
//뉴비도 게임 시작전에 초기화된 데이터들을 담아줄 리스트를 먼저 만들어주고 시작하자
foreach (var data in DataManager.instance.GetDailyRewardDatas())
{
var info = new RewardDailyInfo(data.id);
InfoManager.instance.RewardDailyInfos.Add(info);
}
//저장
Debug.Log("<color=Green>====신규유저용 데이터 저장완료===</color>");
InfoManager.instance.SaveRewardDailyInfo();
}
else
{
Debug.Log("<color=Red>====기존유저 입성 ===</color>");
InfoManager.instance.LoadDailyRewardInfo();
Debug.Log("<color=Red>====기존유저 데이터 저장 완료 ===</color>");
}
director.Init();
}
}
Director 스크립트
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using Unity.VisualScripting;
using UnityEditor.U2D;
using UnityEngine;
using UnityEngine.UI;
public class UIRewardDailyDirector : MonoBehaviour
{
public GameObject uIRewardDailyCellView;
public Transform content;
public Button btnClaim;
private List<UIRewardDailyCellView> list;
private int idx = 0; // 현재위치
public void Init()
{
this.list = new List<UIRewardDailyCellView>();
this.btnClaim.onClick.AddListener(() =>
{
//이전에 저장된 데이터에서(rewardDailyInfo.json)
//현재날짜가 있는지를 확인하는게 목표 2022-02-16 (같은게 있는지를 확인)
//만약에 현재 날짜가 이미 저장되어 있다면
//난 이미 보상을 받은거임
//return; (addListener가 익명 람다기 때문에 가능)
//DateTime 형식을 스트링으로 변환하여 저장 후 Any IEnumerable메서드 를 사용하여 비교
//string toDay = DateTime.Now.ToString("yyyy/MM/dd");
//if (InfoManager.instance.RewardDailyInfos.Any(x => x.date == toDay))
//{
// Debug.Log("<color=red>하루에 다줘버리면 우린 뭐먹고 삽니까</color>");
// this.btnClaim.gameObject.SetActive(false);
// return;
//}
/*Debug.Log("claim!!!");
var targetidx = this.idx % (DataManager.instance.GetDailyRewardCount()-1);
Debug.LogFormat("target {0}", targetidx);
this.idx++;*/
var cellview = this.list[this.idx];
cellview.Claim();
RewardDailyInfo rewardinfo = InfoManager.instance.RewardDailyInfos.Find(x => x.id == cellview.id);
rewardinfo.state = 1;
//rewardinfo.date = toDay;
InfoManager.instance.SaveRewardDailyInfo();
this.idx++;
if(this.idx > InfoManager.instance.RewardDailyInfos.Count - 1)
{
this.idx = 0;
this.ResetCellViewList();
for (int i = 0; i < InfoManager.instance.RewardDailyInfos.Count; i++)
{
InfoManager.instance.RewardDailyInfos[i].state = 0;
InfoManager.instance.RewardDailyInfos[i].date = null;
}
InfoManager.instance.SaveRewardDailyInfo();
}
this.list[this.idx].Focus();
});
for (int i = 0; i < InfoManager.instance.RewardDailyInfos.Count; i++)
{
var go = Instantiate(this.uIRewardDailyCellView, this.content);
var cellview = go.GetComponent<UIRewardDailyCellView>();
//1000~
var id = i + 1000;
var RewardData = DataManager.instance.GetDailyRewardData(id);
var atlas = AtlasManager.instance.GetAtlasByName("UIRewardDaily");
Sprite sp = null;
//type 100 or 300
//UIEUM 클래스에 100은 RewardItem 300dms Currency 로 타입 지정해두었음
switch((UIEnum.eRewardItemType)RewardData.type)
{
case UIEnum.eRewardItemType.RewardItem:
var rewarditemData = DataManager.instance.GetRewardItemData(RewardData.reward_id);
sp = atlas.GetSprite(rewarditemData.sprite_name);
break;
case UIEnum.eRewardItemType.Currency:
var currencyData = DataManager.instance.GetCurrencyData(RewardData.reward_id);
sp = atlas.GetSprite(currencyData.sprite_name);
break;
}
cellview.Init(id, RewardData.day, RewardData.amount,sp);
//저장된 info 데이터 값으로 변경해주기 (우선 상태부터)
RewardDailyInfo rewardinfo = InfoManager.instance.RewardDailyInfos.Find(x => x.id == id);
if (rewardinfo.state == 1) cellview.Claim();
this.list.Add(cellview);
//초기화 (첫 셀뷰를 선택하겠다)
}
this.UpdateIndex();
this.list[this.idx].Focus();
}
private void UpdateIndex()
{
this.idx =
InfoManager.instance.RewardDailyInfos.Where(x => x.date != null).Count();
}
public void ResetCellViewList()
{
foreach(var cellView in this.list)
{
cellView.ResetUI();
}
}
}
CellView 스크립트
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using TMPro;
using Unity.VisualScripting;
using UnityEngine.U2D;
public class UIRewardDailyCellView : MonoBehaviour
{
public Image imgIcon;
public Image imgFrame;
public TMP_Text txtDay;
public TMP_Text txtAmount;
public GameObject checkGo;
public GameObject FocusGo;
private SpriteAtlas atlas;
public int id;
public void Init(int id, int day, int amount, Sprite sp)
{
this.id = id;
this.txtDay.text= day.ToString();
this.txtAmount.text= amount.ToString();
this.imgIcon.sprite = sp;
this.imgIcon.SetNativeSize();
this.atlas = AtlasManager.instance.GetAtlasByName("UIRewardDaily");
}
public void Claim()
{
this.checkGo.SetActive(true);
//배경 바꾸기
var sp = atlas.GetSprite("frame_stageframe_02_s1");
this.imgFrame.sprite = sp;
//포커스 되어 있다면 포커 끄기
this.FocusGo.SetActive(false);
}
public void Focus()
{
this.FocusGo.gameObject.SetActive(true);
}
public void ResetUI()
{
var sp = atlas.GetSprite("frame_stageframe_01_n");
this.imgFrame.sprite = sp;
this.FocusGo.SetActive(false);
this.checkGo.SetActive(false);
}
}
오늘 배운 메서드 들중 유용한 메서드들
- IEnumerable 인터페이스를 상속받은 배열 혹은 컬렉션에서 사용 가능한 메서드 (매개변수 는 Func<T> 사용)
- 예시 : 아래 코드를 보면 매개변수 x(여기선 저장된 게임 인포 객체들) 의 필드 date의 값이 있는 객체들만 세어 Director가 최초 init() 될때 인덱스를 증가시키고 시작하였다.
- Find
- 위와 마찬가지로 IEnumerable 인터페이스를 상속받은 배열 혹은 컬렉션에서 사용 가능한 메서드 (매개변수 람다식으로 조건에 맞는 (true인) 제너릭<T> 타입을 반환한다)
- 버튼을 누를때 마다 리스트의 인덱스 안에서 조건이 ture 인 인덱스를 찾아 해당 객체를 반환한다. 이를 이용해 버튼을 눌렀을때 수령받은 일일보상 아이템 객체의 id를 가져와 미리 저장해둔 보상객체의 id와 같은 id를 찾아 상태 정보를 변경시켜주는데 사용하였다.
- Any
- 람다식의 조건에 따라 부울 값을 반환하는 메서드
- 오늘은 버튼을 누를때 인포리스트에서 같은 날짜값을 가지고 있는 객체가 있는지 없는지 없는지를 확인하여 하루 1 보상 수령을 가능하게 하였다.
Director 스크립트가 조금 씩 길어지는 듯하여 메서드로 기능을 나누어 정리해보고 좀 더 읽기 편한 상태로 만들어야 겠다.
(가령 내가 쓴 코드는 같은 코드를 보고 참고 하여 작성하여도 가독성이 훨씬 좋지 못한듯하다)
아니면 내가 코드를 읽을때 정신없어서 그런지도 모르겠다ㅎㅎ;;
반응형
LIST
'C# > 수업 내용' 카테고리의 다른 글
C# Partial 클래스 분할 (협업용) (0) | 2023.03.29 |
---|---|
[유니티] DrawExtension 및 각도 계산 관련 (캐릭터 주변 돌게 하기) (0) | 2023.02.28 |
[유니티] 원격수업 Memo (복습 & 놓친거 찾기) (0) | 2023.02.09 |
2023.01.13 오전 수업 내용 : 직렬화 (0) | 2023.01.13 |
상점 목록 및 미션 목록 & 보상 출력 (역직렬화 이용) (1) | 2023.01.13 |