using System; using System.Collections; using System.Collections.Generic; using System.Linq; using UnityEngine; using UnityEngine.UI; /// /// 透明脚本 /// public class TransparentGlow : MonoBehaviour { public bool isTransparentGlow = false; [HideInInspector] public List meshRenderers; /// /// 自身的 /// [HideInInspector] public List materials; /// /// 复制出来的 /// public List empty = new List(); public Shader TransparentGlow_Shader; public Shader TransparentGlow_Shader_half; public List MeshRenderers { get { if (meshRenderers == null) meshRenderers = GetComponentsInChildren().ToList(); return meshRenderers; } } public List Materials { get { if (materials == null) { materials = new List(); MeshRenderers.ForEach(render => { Array.ForEach(render.materials, (_mat) => { if (!materials.Contains(_mat)) { materials.Add(_mat); Material _emp = new Material(_mat); empty.Add(_emp); } }); }); } return materials; } } /// /// 原始机柜模型 /// private List original_jigui = new List(); /// /// 原始设备模型 /// private List original_shebei = new List(); private List _jigui; private List _shebei; private bool search_u_wei, is_jigui; /// /// 若脚本在机柜上,则该字段为机柜材质 /// 若脚本在设备上,则该字段为此设备材质 /// public List jigui_mats { get { if (_jigui == null) { _jigui = new List(); if (GetComponent()) { Array.ForEach(GetComponent().materials, m => { if (!_jigui.Contains(m)) { _jigui.Add(m); original_jigui.Add(new Material(m)); } }); } for (int i = 0; i < transform.childCount; i++) { if (transform.GetChild(i).GetComponent()) Array.ForEach(transform.GetChild(i).GetComponent().materials, m => { if (!_jigui.Contains(m)) { _jigui.Add(m); original_jigui.Add(new Material(m)); } }); } //MeshRenderers.ForEach(render => //{ // Array.ForEach(render.materials, (_mat) => // { // if (!materials.Contains(_mat)) // { // materials.Add(_mat); // Material _emp = new Material(_mat); // empty.Add(_emp); // } // }); //}); } return _jigui; //return materials; } } /// /// 若脚本在机柜上,则该字段有值且为所有设备材质; /// 若脚本在设备上,则该字段为空值 /// public List shebei_mats { get { if (search_u_wei) { } else { _shebei = new List(); search_u_wei = true; if (transform.Find("U位")) { is_jigui = true; Array.ForEach(transform.Find("U位").GetComponentsInChildren(), mr => { Array.ForEach(mr.materials, m => { if (!_shebei.Contains(m)) { _shebei.Add(m); original_shebei.Add(new Material(m)); } }); }); } else { is_jigui = false; } } return _shebei; } } // Start is called before the first frame update void Start() { //for (int i = 0; i < Materials.Count; i++) // break; if (TransparentGlow_Shader == null) TransparentGlow_Shader = Resources.Load("TransparentGlow"); if (TransparentGlow_Shader_half == null) TransparentGlow_Shader_half = Resources.Load("TransparentGlow_half"); } // Update is called once per frame void Update() { } /// /// 场景刷新后,重新加载U位下的设备材质 /// public void OnSceneReloaded() { search_u_wei = false; } /// /// 透明 /// [ContextMenu("透明")] public void F1(/*float a = 0.5f*/) { //for (int i = 0; i < Materials.Count; i++) //{ // Materials[i].shader = TransparentGlow_Shader; // Materials[i].renderQueue = 3000; // Materials[i].SetFloat("_Transparecy", a); //} for (int i = 0; i < jigui_mats.Count; i++) { jigui_mats[i].shader = TransparentGlow_Shader; jigui_mats[i].renderQueue = 3000; //jigui_mats[i].SetFloat("_Transparecy", is_jigui ? a : a / 2); } for (int i = 0; i < shebei_mats.Count; i++) { shebei_mats[i].shader = TransparentGlow_Shader_half; shebei_mats[i].renderQueue = 3000; //shebei_mats[i].SetFloat("_Transparecy", a / 2); } isTransparentGlow = true; } /// /// 恢复原材质 /// [ContextMenu("恢复原材质")] public void F2() { //for (int i = 0; i < Materials.Count; i++) //{ // Materials[i].shader = empty[i].shader; //} for (int i = 0; i < jigui_mats.Count; i++) { jigui_mats[i].shader = original_jigui[i].shader; } for (int i = 0; i < shebei_mats.Count; i++) { shebei_mats[i].shader = original_shebei[i].shader; } isTransparentGlow = false; } [ContextMenu("添加点击组件")] public void F3() { TransparentGlow[] components = FindObjectsOfType(false); foreach (var item in components) { ClickEvent clickEvent = item.GetComponent(); BoxCollider boxCollider = item.GetComponent(); if (item.gameObject.activeSelf) { if (!clickEvent) item.gameObject.AddComponent(); if (!boxCollider) { var a = item.gameObject.AddComponent(); a.isTrigger = true; } } } } [ContextMenu("添加碰撞检测器")] public void addBoxCollider() { //BoxCollider boxCollider = GetComponent(); //Renderer renderer = null; //if (!boxCollider) //{ // try // { // renderer = transform.Find(transform.name).GetComponent(); // } // catch (Exception) // { // renderer = transform.GetComponent(); // } // if (renderer != null) // { // var initrot = transform.rotation; // transform.rotation = Quaternion.identity; // var bounds = renderer.bounds; // var a = transform.gameObject.AddComponent(); // a.isTrigger = false; // a.center = bounds.center - transform.transform.position; // a.size = bounds.size; // transform.rotation = initrot; // } //} MeshFilter meshFilter = GetComponent(); if (meshFilter != null) { MeshCollider meshCollider = gameObject.GetComponent(); if (meshCollider == null) { meshCollider = gameObject.AddComponent(); } meshCollider.sharedMesh = meshFilter.sharedMesh; meshCollider.convex = true; // 如果物体有镂空,可能需要将convex属性设置为true } } }