前言
本节主要实现关卡进度条的功能
绘制进度条UI
控制关卡进度测试
新增ProgressPanel代码,控制关卡进度
public class ProgressPanel : MonoBehaviour { private GameObject progress; private GameObject head; private TextMeshProUGUI levelText; private GameObject flagPrefab;//旗帜预制体 void Start() { progress = transform.Find("进度条").gameObject; head = transform.Find("僵尸头").gameObject; levelText = transform.Find("关卡文本").gameObject.GetComponent<TextMeshProUGUI>(); flagPrefab = Resources.Load("Prefabs/UI/旗帜") as GameObject; //TODO:测试 SetPercent(0.2f); SetFlagPercent(0.4f); SetFlagPercent(0.6f); SetFlagPercent(0.8f); SetLevelText(1); } //设置进度条和僵尸头位置 public void SetPercent(float per) { // 图片进度条 progress.GetComponent<Image>().fillAmount = per; // 进度条宽度 float width = progress.GetComponent<RectTransform>().sizeDelta.x; float rightX = width / 2; // 设置头的x轴位置:最右边的位置 - 进度条宽度*进度值 head.GetComponent<RectTransform>().localPosition = new Vector2(rightX - per * width, 0); } //设置旗帜位置 public void SetFlagPercent(float per) { // 进度条宽度 float width = progress.GetComponent<RectTransform>().sizeDelta.x; float rightX = width / 2; // 创建新的旗子 GameObject newFlag = Instantiate(flagPrefab); //false:表示保持newFlag相对于世界坐标的位置、旋转和缩放不变,即不将newFlag的局部坐标和旋转值随着父级对象的变化而改变。 newFlag.transform.SetParent(transform, false); // 设置位置 newFlag.GetComponent<RectTransform>().localPosition = new Vector2(rightX - per * width, 7f); //把Head对象在其父级对象中的层级顺序置于最后,也就是显示在所有其他同级对象的最上方。 head.transform.SetAsLastSibling(); } //设置关卡文本 public void SetLevelText(int per){ levelText.text = "关卡 " + per; } }
配置信息
测试运行效果,可以看到旗帜生成位置和进度条都正常
按配置表使用关卡进度变化
首先去除前面的测试代码,修改UIManager
public class UIManager : MonoBehaviour { public static UIManager Instance { get; private set; } public TextMeshProUGUI sunSumText; public ProgressPanel progressPanel; int zombieDiedCount = 0;//死亡僵尸数量 private void Awake() { Instance = this; } private void Start() { Init(); zombieDiedCount = 0; InitProgressPanel(); } public void Init() { sunSumText.text = GameManager.Instance.sunSum.ToString(); } //初始化进度条 public void InitProgressPanel() { // 初始化进度为0 progressPanel.SetPercent(0); int count = GameManager.Instance.listData.Count; string progressId = GameManager.Instance.listData[0]["progressId"]; // 遍历数据列表,设置旗帜的位置 for (int i = 0; i < count; i++) { // 获取当前字典数据 Dictionary<string, string> dic = GameManager.Instance.listData[i]; if (progressId != dic["progressId"]) { progressPanel.SetFlagPercent((float)i / count); } progressId = dic["progressId"]; } } //更新进度 public void UpdateProgressPanel() { zombieDiedCount++; progressPanel.SetPercent((float)zombieDiedCount / GameManager.Instance.listData.Count); } }
修改GenerateZombies里的ZombieDied方法,每次僵尸死亡时调用UpdateProgressPanel方法,更新UI进度,当然你也可以在僵尸生成时调用,具体看你的需求
//更新进度UI UIManager.Instance.UpdateProgressPanel();
效果
源码
源码不出意外的话我会放在最后一节