Scene_Graphic.cs 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using CrossgateToolkit;
  4. using UnityEngine;
  5. using UnityEngine.UI;
  6. public class Scene_Graphic : MonoBehaviour
  7. {
  8. [SerializeField,Header("单张图档")]
  9. private Image SingleGraphic;
  10. [SerializeField,Header("合批图档")]
  11. private Image BatchGraphic;
  12. [SerializeField,Header("动态合批图档")]
  13. private Image DynamicBatchGraphic;
  14. // Start is called before the first frame update
  15. void Start()
  16. {
  17. }
  18. // Update is called once per frame
  19. void Update()
  20. {
  21. }
  22. private void Awake()
  23. {
  24. Util.Init();
  25. GetSingleGraphic();
  26. // 两种合批方式
  27. // 可以观察两种合批方式所形成的图像图集差异
  28. GetBatchGraphic(); // 一次性合批图像
  29. StartCoroutine(GetDynamicBatchGraphic()); // 动态合批图像
  30. }
  31. public void GetSingleGraphic()
  32. {
  33. // 获取单张图档
  34. GraphicDetail graphicDetail = CrossgateToolkit.Graphic.GetGraphicDetail(10302);
  35. SingleGraphic.sprite = graphicDetail.SpritePPU100;
  36. SingleGraphic.SetNativeSize();
  37. // 获取单张图档的PPU-100的图像
  38. // SingleGraphic.sprite = CrossgateToolkit.Graphic.GetGraphicDetail(4116).SpritePPU100;
  39. }
  40. public void GetBatchGraphic()
  41. {
  42. // 以合批方式获取并处理图像图集
  43. // 此处使用图档编号(非索引)获取图像
  44. uint[] serials = new uint[]
  45. {
  46. // 地面
  47. 4116,4117,4118,4119,4120,4121,4122,4123,4124,4125,
  48. // 其他不同尺寸图像
  49. 10561,10571,10573,10443,10403
  50. };
  51. // 获取合批图集前,需要手动获取整理图像信息数据
  52. List<GraphicInfoData> graphicInfoDatas = new List<GraphicInfoData>();
  53. for (int i = 0; i < serials.Length; i++)
  54. {
  55. graphicInfoDatas.Add(CrossgateToolkit.GraphicInfo.GetGraphicInfoData(serials[i]));
  56. }
  57. // 合批图像,并获取对应编号与图像映射
  58. Dictionary<uint,GraphicDetail> graphicDetails = GraphicData.BakeGraphics(graphicInfoDatas, true, 0, -1, false, 256, 5);
  59. // 获取合批的原图像
  60. Texture2D texture2D = graphicDetails[4116].SpritePPU100.texture;
  61. BatchGraphic.sprite = Sprite.Create(texture2D,new Rect(0,0,texture2D.width,texture2D.height),new Vector2(0.5f,0.5f));
  62. BatchGraphic.SetNativeSize();
  63. // 说明:合批图集定义最大图集尺寸为512,合批后的图像图集,尺寸不会超过512
  64. // 一次性合批的图像会根据图像尺寸由小到大,由低到高方式进行排列处理,直到达到最大尺寸限制
  65. }
  66. IEnumerator GetDynamicBatchGraphic()
  67. {
  68. // 以动态图集方式获取并处理图像图集
  69. // 此处使用图档编号(非索引)获取图像
  70. uint[] serials = new uint[]
  71. {
  72. // 地面
  73. 4116,4117,4118,4119,4120,4121,4122,4123,4124,4125,
  74. // 其他不同尺寸图像
  75. 10561,10571,10573,10443,10403
  76. };
  77. // 动态图集无需手动获取整理图像信息数据
  78. // 首先定义图集
  79. DynamicGraphic dynamicGraphic = new DynamicGraphic(256,256,5,0,false,true);
  80. // 动态图集为自动动态扩容图集
  81. // 当当前图集内无空余空间容纳当前填充图形时,会自动进行扩容,形成新的图集图像,但尺寸不会超过定义的图集尺寸
  82. // 可以直接通过图像编号填充图集并获取填充后的图像数据
  83. Sprite sprite = dynamicGraphic.GetSprite(4116);
  84. sprite = dynamicGraphic.GetSprite(4117);
  85. // 可以手动清除图集避免内存泄漏
  86. dynamicGraphic.Clear();
  87. // 亦可通过协程方式填充图集,避免大批量获取图像时造成主线程卡顿
  88. // 协程方式填充图集需要通过回调方式获取填充后的图像数据
  89. bool next = false;
  90. for (var i = 0; i < serials.Length; i++)
  91. {
  92. StartCoroutine(
  93. dynamicGraphic.GetSpriteSync(serials[i], (outputSprite) =>
  94. {
  95. // 获取到图像数据后的处理
  96. // 此处可以将图像数据赋值给Image等UI组件
  97. // 也可以将图像数据保存到本地等
  98. sprite = outputSprite;
  99. next = true;
  100. }));
  101. yield return new WaitUntil(() => next);
  102. }
  103. Texture2D texture2D = sprite.texture;
  104. DynamicBatchGraphic.sprite = Sprite.Create(texture2D,new Rect(0,0,texture2D.width,texture2D.height),new Vector2(0.5f,0.5f));
  105. DynamicBatchGraphic.SetNativeSize();
  106. }
  107. }