PartMark.cs 5.9 KB

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