简书链接:【原创】unity简单封装实现一个进度加载和文本提示 文章字数:451,阅读全文大约需要1分钟 首先,加载中 显示加载动画和正在加载,
加载完成 隐藏,加载失败 则显示重新加载按钮和 加载失败的文字。
要解决自适应的问题 loading根的设置
在loadingview中的设置 文本本身需要加上content size filter约束,否则无法自适应
实际效果 加载中
加载失败
加载失败 设设置了个点击事件,这个点击事件对外公开,
1 2 3 4 5 public void onClickReadLoading() { onClickReLoad?.Invoke(); }
最后的实现原理就是旋转image,根据状态判断是否处于旋转中。 设置不同的状态 显示不同的gameobject.以及设置文本。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 using System; using System.Collections; using System.Collections.Generic; using TMPro; using UnityEngine; using UnityEngine.UI; public class LoadingManager : Singleton<LoadingManager> { // Start is called before the first frame update [HideInInspector] public float rotateSpeed = 300; public Action onClickReLoad { get; set; } public GameObject loadingImage; public GameObject loadingBtnAndTextParent; private Button btn; TextMeshProUGUI mText; public enum LoadingStatus { Loading, LoadingFail, LoadingSucc } LoadingStatus loadingStatus = LoadingStatus.Loading; public void setState(LoadingStatus loadingStatus, String message = "正在加载") { this.loadingStatus = loadingStatus; if (this.loadingStatus == LoadingStatus.LoadingSucc) { this.gameObject.SetActive(false); } else { this.loadingBtnAndTextParent.gameObject.SetActive(true); this.gameObject.SetActive(true); if (this.loadingStatus == LoadingStatus.LoadingFail) { btn.gameObject.SetActive(true); this.loadingImage.SetActive(false); } else { btn.gameObject.SetActive(false); this.loadingImage.SetActive(true); } mText.text = message; } } void Start() { //被查找的button必须先设置显示,否则 这里找不到 btn = this.loadingBtnAndTextParent.GetComponentInChildren<Button>(); mText = this.loadingBtnAndTextParent.GetComponentInChildren<TextMeshProUGUI>(); setState(LoadingStatus.Loading); } public void onClickReadLoading() { onClickReLoad?.Invoke(); } private void OnDestroy() { /* if (btn != null) { btn.onClick.RemoveListener(onClickReadLoading); }*/ } // Update is called once per frame void Update() { if (this.loadingStatus == LoadingManager.LoadingStatus.Loading) { this.loadingImage.transform.Rotate(-Vector3.forward * rotateSpeed * Time.deltaTime); } } }
实际逻辑