PartMark.cs 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using QFramework;
  5. using HighlightingSystem;
  6. using Sirenix.OdinInspector;
  7. using EPOOutline;
  8. public enum ShowState
  9. {
  10. /// <summary>
  11. /// 隐藏
  12. /// </summary>
  13. Hide,
  14. /// <summary>
  15. /// 透明
  16. /// </summary>
  17. Tran
  18. }
  19. public class PartMark : MonoBehaviour
  20. {
  21. /// <summary>
  22. /// 子物体
  23. /// </summary>
  24. public List<PartMark> m_ChildPartMarks;
  25. /// <summary>
  26. /// 初始材质球
  27. /// </summary>
  28. public Dictionary<MeshRenderer, Material> m_DicOldMeshRender;
  29. /// <summary>
  30. /// 目前的状态
  31. /// </summary>
  32. private bool m_CurrentState;
  33. public Outlinable outlinable;
  34. private void Awake()
  35. {
  36. m_ChildPartMarks = new List<PartMark>();
  37. m_DicOldMeshRender = new Dictionary<MeshRenderer, Material>();
  38. InitData();
  39. AddMeshColliders();
  40. outlinable = this.GetComponent<Outlinable>();
  41. //AddOutLinable();
  42. }
  43. public void AddOutLinable()
  44. {
  45. if (outlinable == null)
  46. {
  47. outlinable = this.GetComponent<Outlinable>() == null
  48. ? this.gameObject.AddComponent<Outlinable>()
  49. : this.GetComponent<Outlinable>();
  50. outlinable.AddAllChildRenderersToRenderingList();
  51. }
  52. outlinable.enabled = false;
  53. }
  54. public void OpenHighlighter()
  55. {
  56. if (outlinable == null)
  57. {
  58. outlinable = this.GetComponent<Outlinable>() == null
  59. ? this.gameObject.AddComponent<Outlinable>()
  60. : this.GetComponent<Outlinable>();
  61. outlinable.AddAllChildRenderersToRenderingList();
  62. }
  63. outlinable.enabled= true;
  64. OutLineManager.Instance.ResetOutLinableByType(outlinable, OutLineType.hint);
  65. }
  66. public void CloseHighlighter()
  67. {
  68. outlinable.enabled = false;
  69. }
  70. /// <summary>
  71. /// 初始化
  72. /// </summary>
  73. public void InitData()
  74. {
  75. MeshRenderer tmpSelfMeshRender = transform.GetComponent<MeshRenderer>();
  76. if (tmpSelfMeshRender != null) m_DicOldMeshRender.Add(tmpSelfMeshRender, tmpSelfMeshRender.material);
  77. for (int i = 0; i < transform.childCount; i++)
  78. {
  79. if (transform.GetChild(i).GetComponent<PartMark>() != null) m_ChildPartMarks.Add(transform.GetChild(i).GetComponent<PartMark>());
  80. }
  81. GetAllChildMeshRender(transform);
  82. if(m_ChildPartMarks.Count==0)
  83. {
  84. AddOutLinable();
  85. }
  86. }
  87. /// <summary>
  88. /// 添加碰撞体
  89. /// </summary>
  90. public void AddMeshColliders()
  91. {
  92. MeshRenderer[] meshRenderers = GetComponentsInChildren<MeshRenderer>();
  93. foreach (var item in meshRenderers)
  94. {
  95. if (item.GetComponent<MeshCollider>() == null)
  96. {
  97. item.gameObject.AddComponent<MeshCollider>();
  98. }
  99. }
  100. }
  101. /// <summary>
  102. /// 设置状态
  103. /// </summary>
  104. /// <param name="state"></param>
  105. public void SetState(bool state)
  106. {
  107. SetInitState();
  108. //如果是点击半透模式
  109. if (DeviceController.instance.m_ShowState == ShowState.Tran)
  110. {
  111. Material tmpTransMaterial = Resources.Load<Material>("Trans");
  112. foreach (var item in m_DicOldMeshRender)
  113. {
  114. if (state)
  115. {
  116. item.Key.material = item.Value;
  117. }
  118. else
  119. {
  120. item.Key.material = tmpTransMaterial;
  121. if (item.Key.GetComponent<MeshCollider>()) item.Key.GetComponent<MeshCollider>().enabled = false;
  122. }
  123. }
  124. }
  125. else //点击隐藏模式
  126. {
  127. this.gameObject.SetActive(state);
  128. }
  129. m_CurrentState = state;
  130. }
  131. /// <summary>
  132. /// 获取子级不携带PartMark标签的子级材质球
  133. /// </summary>
  134. /// <param name="target"></param>
  135. private void GetAllChildMeshRender(Transform target)
  136. {
  137. for (int i = 0; i < target.childCount; i++)
  138. {
  139. if (target.GetChild(i).GetComponent<PartMark>() == null)
  140. {
  141. MeshRenderer tmpMeshRender = target.GetChild(i).GetComponent<MeshRenderer>();
  142. if (tmpMeshRender != null)
  143. {
  144. m_DicOldMeshRender.Add(tmpMeshRender, tmpMeshRender.material);
  145. }
  146. else
  147. {
  148. GetAllChildMeshRender(target.GetChild(i));
  149. }
  150. }
  151. }
  152. }
  153. /// <summary>
  154. /// 切换到正常状态
  155. /// </summary>
  156. public void SetInitState()
  157. {
  158. foreach (var item in m_DicOldMeshRender)
  159. {
  160. item.Key.material = item.Value;
  161. if (item.Key.GetComponent<MeshCollider>()) item.Key.GetComponent<MeshCollider>().enabled = true;
  162. }
  163. this.gameObject.SetActive(true);
  164. }
  165. public List<MeshRenderer> GetMeshRender(Transform target)
  166. {
  167. List<MeshRenderer> tmpMeshRenders = new List<MeshRenderer>();
  168. if (m_CurrentState)
  169. {
  170. if (target.GetComponent<MeshRenderer>() != null) tmpMeshRenders.Add(target.GetComponent<MeshRenderer>());
  171. for (int i = 0; i < target.childCount; i++)
  172. {
  173. Transform tmpChild = target.GetChild(i);
  174. if (tmpChild.GetComponent<PartMark>() == null)
  175. {
  176. if (tmpChild.GetComponent<MeshRenderer>())
  177. {
  178. tmpMeshRenders.Add(tmpChild.GetComponent<MeshRenderer>());
  179. }
  180. else
  181. {
  182. tmpMeshRenders.AddRange(GetMeshRender(tmpChild));
  183. }
  184. }
  185. }
  186. }
  187. return tmpMeshRenders;
  188. }
  189. }