PartMark.cs 4.7 KB

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