123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182 |
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
- using QFramework;
- using HighlightingSystem;
- using Sirenix.OdinInspector;
- public enum ShowState
- {
- /// <summary>
- /// 隐藏
- /// </summary>
- Hide,
- /// <summary>
- /// 透明
- /// </summary>
- Tran
- }
- public class PartMark : MonoBehaviour
- {
- /// <summary>
- /// 子物体
- /// </summary>
- public List<PartMark> m_ChildPartMarks;
- /// <summary>
- /// 初始材质球
- /// </summary>
- public Dictionary<MeshRenderer, Material> m_DicOldMeshRender;
- /// <summary>
- /// 目前的状态
- /// </summary>
- private bool m_CurrentState;
- private void Awake()
- {
- m_ChildPartMarks = new List<PartMark>();
- m_DicOldMeshRender = new Dictionary<MeshRenderer, Material>();
- InitData();
- AddMeshColliders();
- }
- /// <summary>
- /// 初始化
- /// </summary>
- public void InitData()
- {
- MeshRenderer tmpSelfMeshRender = transform.GetComponent<MeshRenderer>();
- if (tmpSelfMeshRender != null) m_DicOldMeshRender.Add(tmpSelfMeshRender, tmpSelfMeshRender.material);
- for (int i = 0; i < transform.childCount; i++)
- {
- if (transform.GetChild(i).GetComponent<PartMark>() != null) m_ChildPartMarks.Add(transform.GetChild(i).GetComponent<PartMark>());
- }
- GetAllChildMeshRender(transform);
- }
- /// <summary>
- /// 添加碰撞体
- /// </summary>
- public void AddMeshColliders()
- {
- MeshRenderer[] meshRenderers = GetComponentsInChildren<MeshRenderer>();
- foreach (var item in meshRenderers)
- {
- if (item.GetComponent<MeshCollider>() == null)
- {
- item.gameObject.AddComponent<MeshCollider>();
- }
- }
- }
- /// <summary>
- /// 设置状态
- /// </summary>
- /// <param name="state"></param>
- public void SetState(bool state)
- {
- SetInitState();
-
- //如果是点击半透模式
- if (DeviceController.instance.m_ShowState == ShowState.Tran)
- {
- Material tmpTransMaterial = Resources.Load<Material>("Trans");
- foreach (var item in m_DicOldMeshRender)
- {
- if (state)
- {
- item.Key.material = item.Value;
- }
- else
- {
- item.Key.material = tmpTransMaterial;
- if (item.Key.GetComponent<MeshCollider>()) item.Key.GetComponent<MeshCollider>().enabled = false;
- }
- }
- }
- else //点击隐藏模式
- {
- this.gameObject.SetActive(state);
- }
- m_CurrentState = state;
- }
- /// <summary>
- /// 获取子级不携带PartMark标签的子级材质球
- /// </summary>
- /// <param name="target"></param>
- private void GetAllChildMeshRender(Transform target)
- {
- for (int i = 0; i < target.childCount; i++)
- {
- if (target.GetChild(i).GetComponent<PartMark>() == null)
- {
- MeshRenderer tmpMeshRender = target.GetChild(i).GetComponent<MeshRenderer>();
- if (tmpMeshRender != null)
- {
- m_DicOldMeshRender.Add(tmpMeshRender, tmpMeshRender.material);
- }
- else
- {
- GetAllChildMeshRender(target.GetChild(i));
- }
- }
- }
- }
- /// <summary>
- /// 切换到正常状态
- /// </summary>
- public void SetInitState()
- {
- foreach (var item in m_DicOldMeshRender)
- {
- item.Key.material = item.Value;
- if (item.Key.GetComponent<MeshCollider>()) item.Key.GetComponent<MeshCollider>().enabled = true;
- }
- this.gameObject.SetActive(true);
- }
- public List<MeshRenderer> GetMeshRender(Transform target)
- {
- List<MeshRenderer> tmpMeshRenders = new List<MeshRenderer>();
- if (m_CurrentState)
- {
- if (target.GetComponent<MeshRenderer>() != null) tmpMeshRenders.Add(target.GetComponent<MeshRenderer>());
- for (int i = 0; i < target.childCount; i++)
- {
- Transform tmpChild = target.GetChild(i);
- if (tmpChild.GetComponent<PartMark>() == null)
- {
- if (tmpChild.GetComponent<MeshRenderer>())
- {
- tmpMeshRenders.Add(tmpChild.GetComponent<MeshRenderer>());
- }else
- {
- tmpMeshRenders.AddRange(GetMeshRender(tmpChild));
- }
- }
- }
- }
- return tmpMeshRenders;
- }
- }
|