当前位置:   article > 正文

Unity 中加载外部图片文件,可动态更换图片_unity打包后 读取外部图片

unity打包后 读取外部图片

根据自己的项目需求灵活地调整代码逻辑

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using UnityEngine;
  5. using UnityEngine.Networking;
  6. using UnityEngine.UI;
  7. /// <summary>
  8. /// 此类为加载外部图片文件,可动态替换图片---
  9. /// 第一种方法:首先获取文件夹中所有文件名称,将其添加到Image列表中,根据列表加载文件夹中的图片--
  10. /// 第二种方法:直接获取文件夹中的文件名称,根据文件名称下载对应的图片--
  11. /// </summary>
  12. public class LoadTextureManager : MonoBehaviour
  13. {
  14. [Header("图片的父物体")]
  15. [SerializeField]
  16. private Transform imageRoot;
  17. private List<string> imgNameList = new List<string>();
  18. void Start()
  19. {
  20. #region 第一种方法
  21. //GetAllImageName("Citys");
  22. //GetAllImage("Citys");
  23. #endregion
  24. #region 第二种方法
  25. GetAllImageName("Citys");
  26. #endregion
  27. }
  28. #region 获取文件夹中文件的名称相关函数
  29. /// <summary>
  30. /// 获取文件夹中所有的图片名称
  31. /// </summary>
  32. /// <param name="floderName">文件夹名称</param>
  33. private void GetAllImageName(string floderName)
  34. {
  35. if (string.IsNullOrEmpty(floderName))
  36. {
  37. Debug.LogError($"floderName的值为空{floderName},请输入正确的文件夹名称!!");
  38. }
  39. else
  40. {
  41. string loadPath;//读取文件的路径
  42. if (Application.platform == RuntimePlatform.Android)
  43. {
  44. loadPath = "/storage/emulated/0/" + floderName;
  45. //Debug.LogError($"安卓端图片读取::{loadPath},");
  46. }
  47. else
  48. {
  49. loadPath = Application.streamingAssetsPath + "/" + floderName;
  50. //Debug.Log($"PC端图片读取::{loadPath},");
  51. }
  52. //判断floderName文件夹是否存在
  53. if (Directory.Exists(loadPath))
  54. {
  55. DirectoryInfo direction = new DirectoryInfo(loadPath);
  56. FileInfo[] fileInfos = direction.GetFiles("*", SearchOption.AllDirectories);
  57. if (fileInfos.Length.Equals(0))
  58. Debug.LogError(floderName + "文件夹为空");
  59. for (int i = 0; i < fileInfos.Length; i++)
  60. {
  61. if (fileInfos[i].Name.EndsWith(".png"))
  62. {
  63. string imgName = fileInfos[i].Name;
  64. AddImageName(imgName);
  65. #region 第二种方法
  66. DownloadTexture(floderName, imgName);
  67. #endregion
  68. }
  69. else if (fileInfos[i].Name.EndsWith(".jpg"))
  70. {
  71. string imgName = fileInfos[i].Name;
  72. AddImageName(imgName);
  73. #region 第二种方法
  74. DownloadTexture(floderName, imgName);
  75. #endregion
  76. }
  77. }
  78. }
  79. }
  80. }
  81. /// <summary>
  82. /// 将文件夹中文件的名称添加到列表中
  83. /// </summary>
  84. /// <param name="_name"></param>
  85. private void AddImageName(string _name)
  86. {
  87. if (!imgNameList.Contains(_name))
  88. {
  89. imgNameList.Add(_name);
  90. }
  91. else
  92. {
  93. Debug.LogError("重名图片,请检查:" + _name);
  94. }
  95. }
  96. #endregion
  97. #region 下载图片相关函数
  98. /// <summary>
  99. /// 获取文件夹中所有图片
  100. /// </summary>
  101. /// <param name="floderName"></param>
  102. public void GetAllImage(string floderName)
  103. {
  104. if (string.IsNullOrEmpty(floderName))
  105. {
  106. Debug.LogError($"floderName的值为空{floderName},请输入正确的文件夹名称!!");
  107. }
  108. else
  109. {
  110. for (int i = 0; i < imgNameList.Count; i++)
  111. {
  112. DownloadTexture(floderName, imgNameList[i]);
  113. }
  114. }
  115. }
  116. /// <summary>
  117. /// 开始协同程序下载图片
  118. /// </summary>
  119. /// <param name="floderName"></param>
  120. /// <param name="imgName"></param>
  121. private void DownloadTexture(string floderName, string imgName)
  122. {
  123. StartCoroutine(IEDownloadTexture(floderName, imgName));
  124. }
  125. /// <summary>
  126. /// UnityWebRequest下载图片--
  127. /// </summary>
  128. /// <param name="floderName">文件夹名称</param>
  129. /// <param name="imgName"></param>
  130. /// <returns></returns>
  131. private IEnumerator IEDownloadTexture(string floderName, string imgName)
  132. {
  133. string path = /*"file:///" +*/ Application.streamingAssetsPath + "/" + floderName + "/" + imgName;
  134. using (UnityWebRequest wr = UnityWebRequestTexture.GetTexture(path))
  135. {
  136. yield return wr.SendWebRequest();
  137. if (!wr.isNetworkError || !wr.isHttpError)
  138. {
  139. Texture2D texture = DownloadHandlerTexture.GetContent(wr);
  140. Sprite sprite = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), Vector2.zero, 1f);
  141. CreateImage(sprite, imgName);
  142. }
  143. else
  144. {
  145. Debug.LogError(wr.error);
  146. }
  147. }
  148. }
  149. /// <summary>
  150. /// 创建新的Image
  151. /// </summary>
  152. /// <param name="sprite"></param>
  153. private void CreateImage(Sprite sprite, string _Name)
  154. {
  155. GameObject gameObject = new GameObject(); //新建一个物体
  156. string[] strArray = _Name.Split('.');
  157. string imgName = strArray[0];
  158. gameObject.name = imgName;
  159. gameObject.AddComponent<Image>().sprite = sprite;//将下载的图片添加到物体Iamge中
  160. if (imageRoot != null)
  161. gameObject.transform.SetParent(imageRoot);//设置新建物体的父类
  162. }
  163. #endregion
  164. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/103586
推荐阅读
相关标签
  

闽ICP备14008679号