完成的内容:1.修改上一篇博文中的Bug 2.完成任务窗口逻辑
1 using System; 2 using System.Collections.Generic; 3 using UnityEngine; 4 using UnityEngine.UI; 5 6 7 public class ActionController : MonoBehaviour 8 { 9 public Button closeBtn; 10 public Button recvBtn; 11 public Sprite[] goldSprite = new Sprite[7]; 12 public Sprite recvSprite; 13 14 public Transform parent; 15 private List<GameObject> itemList = new List<GameObject>(); 16 //今天点击日期 17 private string currentClickDate = string.Empty; 18 //上一次点击日期 19 private string lastClickDate = string.Empty; 20 //已领取金币的天数 21 private int recvCount; 22 /// private int totalRecvCount = 0; 23 ////是否已重置recvCount 24 //private int resetRecvCount = -1; // 0表示没有重置,其他值表示已重置 25 ////是否从未领取金币 非 0领取过,其他值表示未领取过 26 private int hasRecv = 0; 27 private void Start() 28 { 29 PlayerPrefs.DeleteAll(); 30 Init(); 31 //获取当前日期 32 currentClickDate = DateTime.Today.ToLongDateString(); 33 //currentClickDate = "2019年1月9日"; 34 35 Debug.Log(currentClickDate); 36 Debug.Log(lastClickDate); 37 Debug.Log(recvCount.ToString()); 38 LoadActionItems(); 39 40 } 41 42 private void Init() 43 { 44 45 closeBtn.onClick.AddListener(OnCloseBtn); 46 recvBtn.onClick.AddListener(OnRecvBtn); 47 48 lastClickDate = PlayerPrefs.GetString("LastClickDate"); 49 recvCount = PlayerPrefs.GetInt("RecvCount"); //空返回null 50 hasRecv = PlayerPrefs.GetInt("HasRecv"); 51 //resetRecvCount = PlayerPrefs.GetInt("ResetRecvCount"); //空返回0 52 } 53 54 private void OnCloseBtn() 55 { 56 gameObject.SetActive(false); 57 } 58 //如果上一次点击日期和今天日期不同,并且今天还没有点击,则更新UI。 59 private void OnRecvBtn() 60 { 61 62 //不是今天第一次点击,则什么都不做 63 if (lastClickDate.Equals(currentClickDate)) 64 { 65 Debug.Log("今天的金币已领取"); 66 return; 67 } 68 else 69 { 70 recvCount++; 71 //totalRecvCount++; 72 if (recvCount == itemList.Count) 73 { 74 recvCount = 0; 75 //resetRecvCount = 1; //已重置领取天数标志 76 PlayerPrefs.SetInt("ResetRecvCount", 1); 77 } 78 79 if(recvCount == 0) 80 { 81 itemList[itemList.Count - 1].transform.GetChild(2).gameObject.SetActive(true); 82 } 83 else 84 { 85 //领取金币次数+1 86 itemList[recvCount - 1].transform.GetChild(2).gameObject.SetActive(true); 87 88 } 89 lastClickDate = currentClickDate; 90 PlayerPrefs.SetInt("RecvCount", recvCount); 91 //PlayerPrefs.SetInt("TotalRecvCount", totalRecvCount); 92 PlayerPrefs.SetString("LastClickDate", lastClickDate); 93 PlayerPrefs.SetInt("HasRecv", 1); 94 } 95 } 96 private void LoadActionItems() 97 { 98 99 ActionData temp = new ActionData(); 100 for (int i = 0; i < goldSprite.Length; i++) 101 { 102 //加载资源 103 UnityEngine.Object obj = Resources.Load("Prefabs/actionitem"); 104 GameObject go = Instantiate(obj) as GameObject; 105 itemList.Add(go); 106 //初始化资源 107 go.transform.SetParent(parent); 108 go.transform.localPosition = new Vector3(0, 0, 0); 109 go.transform.localScale = new Vector3(1, 1, 1); 110 111 temp.day = "第" + (i + 1) + "天"; 112 temp.goldNum = (i + 1).ToString(); 113 temp.goldSprite = goldSprite[i]; 114 temp.receiveSprite = recvSprite; 115 116 go.GetComponent<ActionItem>().SetActionItem(temp); 117 } 118 //加载完资源时,更新之前已领取金币的UI 119 UpdateRecvInfo(); 120 Debug.Log(recvCount); 121 } 122 123 /// <summary> 124 /// 更新领取金币UI 125 /// </summary> 126 private void UpdateRecvInfo() 127 { 128 //如果从未领取过,则什么都不做 129 if(hasRecv == 0) 130 { 131 return; 132 } 133 //读取的recvCount值总是在0-6之间 134 135 // 如果recvCounmt = 0并且今天点击过,说明重置了recvCount,在显示时应该按实际天数显示。 136 if(lastClickDate.Equals(currentClickDate) && recvCount == 0) 137 { 138 //还原recvCount,但是不写入文件 139 recvCount = itemList.Count; 140 } 141 for (int i = 0; i < recvCount; i++) 142 { 143 itemList[i].transform.GetChild(2).gameObject.SetActive(true); 144 145 } 146 } 147 }
1 //数据持久化 TO DO 2 using System.Collections.Generic; 3 using UnityEngine; 4 using UnityEngine.UI; 5 namespace PureMVCDemo 6 { 7 public class TaskController : MonoBehaviour 8 { 9 public GameObject taskItemPrefab; 10 public string[] names; 11 public Transform parent; 12 public int taskItemCount = 3; 13 public Sprite receivedSprite; 14 public Sprite nonReceivedSprite; 15 public Button closeBtn; 16 private List<TaskItem> taskItemList = new List<TaskItem>(); 17 18 private void Start() 19 { 20 closeBtn.onClick.AddListener(OnCloseBtn); 21 Init(); 22 } 23 24 private void OnCloseBtn() 25 { 26 this.gameObject.SetActive(false); 27 } 28 29 private void Init() 30 { 31 for (int i = 0; i < taskItemCount; i++) 32 { 33 GameObject go = Instantiate(taskItemPrefab); 34 go.transform.SetParent(parent); 35 go.transform.localScale = new Vector3(1, 1, 1); 36 taskItemList.Add(go.GetComponent<TaskItem>()); 37 UpdateTaskData(taskItemList[i], i); 38 } 39 } 40 private void UpdateTaskData(TaskItem taskItem, int nameIndex) 41 { 42 taskItem.nameText.text = names[nameIndex]; 43 if(taskItem.hasReceived) 44 { 45 taskItem.recvImg.sprite = receivedSprite; 46 } 47 else 48 { 49 taskItem.recvImg.sprite = nonReceivedSprite; 50 } 51 52 } 53 } 54 55 }
任务系统的数据结构更加复杂,还有计时系统也比较困难,数据持久化还没处理,为了尽快完成游戏雏形,这些功能放在以后在做。