using System; using System.Collections.Generic; using System.Runtime.InteropServices; using UnityEngine; using Object = UnityEngine.Object; namespace ZXL.Helper { public static class CommonHelper { /// /// 遍历更改所有子物体的layer /// /// /// public static void SetWithChildLayer(this Transform self, LayerMask layer) { List findDeep = new List(); FindDeeps(self, ref findDeep); if (findDeep.Count == 0) { Debug.LogError("未找到此组件"); } foreach (var gameObject in findDeep) { gameObject.gameObject.layer = layer; } } /// /// 遍历查找并返回名字对应的物体 /// /// /// /// /// public static T FindChildDeep(this Transform self, string name) where T : Object { Transform findDeep = null; FindDeep(self, name, ref findDeep); if (findDeep == null) { Debug.LogError("未找到此组件"); } var component = findDeep.GetComponent(); return component; } static void FindDeep(Transform tran, string name, ref Transform transform) { if (tran.name == name) { transform = tran; return; } for (var i = 0; i < tran.childCount; i++) { FindDeep(tran.GetChild(i), name, ref transform); } } public static List FindChildDeeps(this Transform self) where T : Object { List list = new List(); FindDeeps(self, ref list); if (list.Count <= 0) { Debug.LogError("未找到此组件"); } return list; } static void FindDeeps(Transform tran, ref List list) { var component = tran.GetComponent(); if (component != null) list.Add(component); for (var i = 0; i < tran.childCount; i++) { FindDeeps(tran.GetChild(i), ref list); } } /// /// 判断是否在某个物体范围内(范围型判断,超出返回false) /// 基于MeshRender的实现方式 /// /// /// /// public static bool IsInRangeAutoFix(Transform tran, Transform self) { var meshRenderer = tran.GetComponent(); Bounds rendererBounds = self.GetComponent().bounds; Bounds colliderBounds = meshRenderer.bounds; bool rendererIsInsideBox = colliderBounds.Intersects(rendererBounds); return rendererIsInsideBox; } /// /// 调用win的消息弹窗 /// /// /// /// /// /// public static void MessageBox(string title, string content, Action okAction, Action cancelAction, MessageBoxType type = MessageBoxType.确定取消) { var messageBox = MessageBox(IntPtr.Zero, content, title, (uint)type); Debug.Log(messageBox); if (messageBox == 1) { okAction?.Invoke(); return; } cancelAction?.Invoke(); } [DllImport("User32.dll", CharSet = CharSet.Unicode, EntryPoint = "MessageBox")] static extern int MessageBox( IntPtr hWnd, [MarshalAs(UnmanagedType.LPTStr)] string lpText, [MarshalAs(UnmanagedType.LPTStr)] string lpCaption, uint uType ); public enum MessageBoxType : uint { 确定 = (uint)0x00000000L, 确定取消 = (uint)0x00000001L, 是否 = (uint)0x00000004L, 是否取消 = (uint)0x00000003L, } } }