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,
}
}
}