DressUpObjUI.cs 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. using FairyGUI;
  2. using System;
  3. using UnityEngine;
  4. namespace GFGGame
  5. {
  6. //实现换装对象在UI界面上显示
  7. public class DressUpObjUI
  8. {
  9. public GameObject sceneObject;
  10. public GoWrapper wrapper;
  11. public DressUpObj dressUpObj;
  12. string prefabName;
  13. private Action onShowAction;
  14. public DressUpObjUI(string prefabName = "SceneDressUp", Action onShowAction = null)
  15. {
  16. this.prefabName = prefabName;
  17. this.onShowAction = onShowAction;
  18. dressUpObj = new DressUpObj();
  19. wrapper = new GoWrapper();
  20. }
  21. /// <summary>
  22. /// 异步重置场景对象
  23. /// </summary>
  24. /// <param name="scale"></param>
  25. /// <param name="needSetMask">如果UI界面的组件有遮罩,那么这里也需要设置为true才能生效</param>
  26. /// <param name="showSceneType">是否显示场景道具类型</param>
  27. /// <param name="roleObj"></param>
  28. /// <param name="showBg">是否显示背景</param>
  29. /// <param name="callback">场景对象加载完成后的回调</param>
  30. public void ResetSceneObjAsync(int scale = 100, bool needSetMask = false, bool showSceneType = true,
  31. GameObject roleObj = null, bool showBg = true, Action<GameObject> callback = null)
  32. {
  33. // 先销毁旧的场景对象
  34. if (sceneObject != null)
  35. {
  36. GameObject.Destroy(sceneObject);
  37. sceneObject = null;
  38. }
  39. // 异步加载新场景对象
  40. PrefabManager.Instance.InstantiateAsync(
  41. ResPathUtil.GetPrefabPath(this.prefabName),
  42. (go) =>
  43. {
  44. if (go != null)
  45. {
  46. sceneObject = go;
  47. sceneObject.transform.localScale = new Vector3(scale, scale, scale);
  48. dressUpObj.setSceneObj(sceneObject, needSetMask, showSceneType, roleObj, showBg, OnShow);
  49. callback?.Invoke(sceneObject);
  50. }
  51. else
  52. {
  53. Debug.LogError($"Failed to instantiate scene object: {this.prefabName}");
  54. callback?.Invoke(null);
  55. }
  56. });
  57. }
  58. /// <summary>
  59. ///
  60. /// </summary>
  61. /// <param name="scale"></param>
  62. /// <param name="needSetMask">如果UI界面的组件有遮罩,那么这里也需要设置为true才能生效</param>
  63. /// <param name="showSceneType">是否显示场景道具类型</param>
  64. /// <param name="roleObj"></param>
  65. /// <param name="showBg">是否显示背景</param>
  66. public void ResetSceneObj(int scale = 100, bool needSetMask = false, bool showSceneType = true, GameObject roleObj = null, bool showBg = true)
  67. {
  68. //这里每次都要实例化新的,复用会有bug
  69. sceneObject = PrefabManager.Instance.InstantiateSync(ResPathUtil.GetPrefabPath(this.prefabName));
  70. sceneObject.transform.localScale = new Vector3(scale, scale, scale);
  71. dressUpObj.setSceneObj(sceneObject, needSetMask, showSceneType, roleObj, showBg, OnShow);
  72. }
  73. public void UpdateWrapper(GGraph holder)
  74. {
  75. holder.SetNativeObject(wrapper);
  76. wrapper.wrapTarget = sceneObject;
  77. }
  78. public void Dispose()
  79. {
  80. onShowAction = null;
  81. if (sceneObject != null)
  82. {
  83. PrefabManager.Instance.Restore(sceneObject);
  84. sceneObject = null;
  85. }
  86. if (dressUpObj != null)
  87. {
  88. dressUpObj.Dispose();
  89. dressUpObj = null;
  90. }
  91. if (wrapper != null)
  92. {
  93. if (wrapper.wrapTarget != null)
  94. {
  95. wrapper.wrapTarget = null;
  96. }
  97. wrapper.Dispose();
  98. wrapper = null;
  99. }
  100. }
  101. private void OnShow()
  102. {
  103. onShowAction?.Invoke();
  104. if (sceneObject == null)
  105. {
  106. return;
  107. }
  108. if (wrapper != null)
  109. {
  110. wrapper.wrapTarget = sceneObject;
  111. //wrapper.CacheRenderers();
  112. }
  113. }
  114. }
  115. }