using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using UnityEngine;
using UnityEngine.Gonbest.MagicCube;
namespace Thousandto.Core.Base
{
///
/// Unity的工具函数集合
///
[ExecuteInEditMode]
public class UnityUtils
{
public static TransformData GetTransformData(Transform trans)
{
return new TransformData(trans.position, trans.rotation, trans.localScale);
}
public static GameObject ResetTransform(GameObject go)
{
Reset(go.transform);
return go;
}
public static void CopyTransform(Transform from, Transform to)
{
to.parent = from.parent;
to.localPosition = from.localPosition;
to.localRotation = from.localRotation;
to.localScale = from.localScale;
}
public static void CopyTransformSRT(Transform from, Transform to)
{
to.position = from.position;
to.rotation = from.rotation;
to.localScale = from.localScale;
}
public static Transform Reset(Transform trans)
{
trans.localScale = Vector3.one;
trans.localRotation = Quaternion.identity;
trans.localPosition = Vector3.zero;
return trans;
}
public static Transform RequireChildTransform(Transform parent, string childName)
{
var ret = parent.Find(childName);
if (ret == null)
{
var go = new GameObject(childName);
go.transform.parent = parent;
ret = go.transform;
}
return ret;
}
public static T RequireComponent(GameObject go) where T : Component
{
T ret = go.GetComponent();
if (ret == null)
{
ret = go.AddComponent();
}
return ret;
}
public static T RequireComponent(GameObject go, out bool isNew) where T : Component
{
T ret = go.GetComponent();
if (ret == null)
{
isNew = true;
ret = go.AddComponent();
}
else
{
isNew = false;
}
return ret;
}
public static Transform GetChildByName(Transform parentTran, string childName)
{
for (int i = 0; i < parentTran.childCount; i++)
{
Transform childTran = parentTran.GetChild(i);
if (childTran.name.Contains(childName))
{
return childTran;
}
}
return null;
}
public static Transform FindParent(Transform current, Transform targetParent)
{
while (current != null && current != targetParent)
{
current = current.parent;
}
return current;
}
public static GameObject AddChild(GameObject parent)
{
GameObject go = new GameObject();
if (parent != null)
{
Transform t = go.transform;
SetLayer(go.transform, parent.layer,true);
t.parent = parent.transform;
t.localPosition = Vector3.zero;
t.localRotation = Quaternion.identity;
t.localScale = Vector3.one;
}
return go;
}
public static bool CheckChild(Transform parent, Transform child)
{
return null != FindParent(child.parent, parent);
}
public static string GetTransPath(Transform trans)
{
var sb = StringUtils.NewStringBuilder;
sb.Append(trans.name);
var p = trans.parent;
while (p != null)
{
sb.Insert(0, '/');
sb.Insert(0, p.name);
p = p.parent;
}
return sb.ToString();
}
public static string GetTransPathFrom(Transform trans, Transform from)
{
var sb = StringUtils.NewStringBuilder;
sb.Append(trans.name);
var p = trans.parent;
while (p != null)
{
if (p == from)
{
break;
}
sb.Insert(0, '/');
sb.Insert(0, p.name);
p = p.parent;
}
return sb.ToString();
}
public static int GetHierarchyDepthFrom(Transform trans, Transform from)
{
int count = 0;
var p = trans.parent;
while (p != null)
{
if (p == from)
{
return count;
}
++count;
p = p.parent;
}
return -1;
}
public static Transform Find(string path)
{
Transform cur = null;
var seg = path.Split('\\', '/');
if (seg.Length > 0)
{
var go = GameObject.Find(seg[0]);
if (go != null)
{
cur = go.transform;
for (int i = 1; i < seg.Length && cur != null; ++i)
{
var t = cur;
cur = null;
for (int j = 0; j < t.childCount; ++j)
{
var c = t.GetChild(j);
if (c.name == seg[i])
{
cur = c;
break;
}
}
}
}
}
return cur;
}
static List _GetComponentsInChildren(Transform trans, Type t, int depth, ref List ret)
{
var c = trans.GetComponents(t);
for (int i = 0; i < c.Length; ++i)
{
ret.Add(c[i]);
}
if (c == null && depth > 0)
{
for (int i = 0; i < trans.childCount; ++i)
{
_GetComponentsInChildren(trans.GetChild(i), t, depth - 1, ref ret);
}
}
return ret;
}
static Component _GetComponentInChildren(Transform trans, Type t, int depth)
{
var c = trans.GetComponent(t);
if (c == null && depth > 0)
{
for (int i = 0; i < trans.childCount; ++i)
{
var child = trans.GetChild(i);
c = child.GetComponent(t) ?? _GetComponentInChildren(child, t, depth - 1);
if (c != null)
{
break;
}
}
}
return c;
}
public static T[] GetComponentsInChildren(Transform trans, int depth = int.MaxValue) where T : Component
{
if (depth < 0)
{
depth = int.MaxValue;
}
List _ret = new List();
_GetComponentsInChildren(trans, typeof(T), depth, ref _ret);
var ret = new T[_ret.Count];
for (int i = 0; i < _ret.Count; ++i)
{
ret[i] = _ret[i] as T;
}
return ret;
}
public static T GetComponentInChildren(Transform trans, int depth = int.MaxValue) where T : Component
{
if (depth < 0)
{
depth = int.MaxValue;
}
var ret = _GetComponentInChildren(trans, typeof(T), depth);
return ret as T;
}
static T _GetComponentInChildren_IgnoreActiveStatus(Transform trans) where T : Component
{
var r = trans.GetComponent();
if (r == null)
{
for (int i = 0; i < trans.childCount && r == null; ++i)
{
r = _GetComponentInChildren_IgnoreActiveStatus(trans.GetChild(i));
}
}
return r;
}
public static T GetComponentInChildren_IgnoreActiveStatus(Transform trans) where T : Component
{
if (trans == null)
{
return null;
}
var r = trans.GetComponent();
if (r == null)
{
for (int i = 0; i < trans.childCount && r == null; ++i)
{
r = _GetComponentInChildren_IgnoreActiveStatus(trans.GetChild(i));
}
}
return r;
}
/// return parent which its name contains string specified
public static Transform GetParentTransform(Transform trans, string parentName)
{
if (trans != null)
{
while (!trans.name.Contains(parentName))
{
trans = trans.parent;
}
return trans;
}
return null;
}
public static int GetLayerMask(params String[] layers)
{
int mask = 0;
for (int i = 0; i < layers.Length; ++i)
{
mask |= (1 << LayerMask.NameToLayer(layers[i]));
}
return mask;
}
public static void SetLayer(Transform trans, int layer, bool recursive = false)
{
if (trans == null)
{
return;
}
trans.gameObject.layer = layer;
if (recursive)
{
var list = trans.GetComponentsInChildren(true);
for (int i = 0; i < list.Length; i++)
{
list[i].gameObject.layer = layer;
}
}
}
public static void FindAllChildContainsString(Transform parent, string contains, List result)
{
if (result == null || parent.childCount == 0)
{
return;
}
else
{
string containsLower = contains.ToLower();
for (int i = 0; i < parent.childCount; i++)
{
var child = parent.GetChild(i);
if (child.name.ToLower().Contains(containsLower) && child.gameObject.activeInHierarchy == true)
{
result.Add(child);
}
else
{
FindAllChildContainsString(child, containsLower, result);
}
}
}
}
public static Transform FindChildContainsString(Transform parent, string contains)
{
Transform result = null;
string containsLower = contains.ToLower();
if (parent.childCount == 0)
{
result = null;
}
else
{
for (int i = 0; i < parent.childCount; i++)
{
var child = parent.GetChild(i);
if (child.name.ToLower().Contains(containsLower) && child.gameObject.activeInHierarchy == true)
{
result = child;
}
else
{
result = FindChildContainsString(child, containsLower);
}
if (result != null)
{
break;
}
}
}
return result;
}
public static Transform FindChildContainsStringWithBoxCollider(Transform parent, string contains)
{
string containLower = contains.ToLower();
Transform result = null;
if (parent.childCount == 0)
{
result = null;
}
else
{
for (int i = 0; i < parent.childCount; i++)
{
var child = parent.GetChild(i);
if (child.name.ToLower().Contains(containLower) && child.gameObject.activeInHierarchy == true && child.GetComponent() != null)
{
result = child;
}
else
{
result = FindChildContainsStringWithBoxCollider(child, containLower);
}
if (result != null)
{
break;
}
}
}
return result;
}
public static T GetNearestComponentFromParents(GameObject child) where T : Component
{
if (child != null)
{
Transform obj = child.transform;
while (obj.parent != null)
{
var component = obj.GetComponent();
if (component != null)
{
return component;
}
obj = obj.transform.parent;
}
}
return null;
}
public static List GetAllComponentsFromParents(GameObject child) where T : Component
{
if (child != null)
{
var result = new List();
Transform obj = child.transform;
while (obj.parent != null)
{
var com = obj.GetComponent();
if (com != null)
{
result.Add(com);
}
obj = obj.transform.parent;
}
return result;
}
return null;
}
///
/// 移除某组件
///
///
///
public static void RemoveComponet(GameObject go)
where T : Component
{
var cl = go.GetComponent();
if (cl != null)
{
// remove audio listener if only
#if UNITY_EDITOR
GameObject.DestroyImmediate(cl);
#else
GameObject.Destroy(cl);
#endif
}
}
///
/// 点是否在一个指定的区域内
///
/// 点的坐标
/// 范围坐标。顺序是左下,左上, 右上,右下
///
public static bool IsPointInField2D(Vector3 point, Vector3[] field)
{
float minX = field[0].x;
float maxX = field[3].x;
float minY = field[0].y;
float maxY = field[1].y;
return (minX <= point.x) && (maxX >= point.x) && (minY <= point.y) && (maxY >= point.y);
}
///
///
///
///
///
///
public static bool IsFieldAInFieldB2D(Vector3[] a, Vector3[] b)
{
for (int i = 0; i < a.Length; i++)
{
if (!IsPointInField2D(a[i], b))
{
return false;
}
}
return true;
}
public static List DecimalNumDecompse(int num)
{
int b = 1;
int index = 0;
List result = new List();
while (num != 0)
{
int temp = num & b;
if (temp == 1)
{
result.Add(index);
}
num = num >> 1;
index++;
}
for (int i = 0; i < result.Count; i++)
{
result[i] = (int)Math.Pow(2, result[i]);
}
return result;
}
public static void SetGameObjectActive(Transform tran, bool isActive)
{
if (tran != null)
{
tran.gameObject.SetActive(isActive);
}
}
//获取在最外层时的大小
public static Vector3 GetWorldScale(Transform tran)
{
if (tran == null) return Vector3.one;
Vector3 scale = tran.localScale;
while (tran.parent != null)
{
tran = tran.parent;
scale = Vector3.Scale(scale, tran.localScale);
}
return scale;
}
//查找当前场景中的根节点
public static GameObject FindSceneRoot(string name)
{
var scene = UnityEngine.SceneManagement.SceneManager.GetActiveScene();
if (!string.IsNullOrEmpty(scene.name))
{
var roots = scene.GetRootGameObjects();
for (int i = 0; i < roots.Length; i++)
{
if (string.Equals(roots[i].name.Trim(), name, StringComparison.CurrentCultureIgnoreCase))
{
return roots[i];
}
}
}
return null;
}
//复制摄像机的属性
public static void CopyCameraProperty(Camera source, Camera target, int excludeLayer = 0)
{
if (source != null && target != null)
{
target.CopyFrom(source);
target.cullingMask = source.cullingMask & (~(1 << excludeLayer));
target.transform.position = source.transform.position;
target.transform.rotation = source.transform.rotation;
target.Render();
}
}
//更新摄像机的工作模式
public static void UpdateCameraModes(Camera src, Camera dest)
{
if (dest == null)
{
return;
}
// set water camera to clear the same way as current camera
dest.clearFlags = src.clearFlags;
dest.backgroundColor = src.backgroundColor;
/*
if (src.clearFlags == CameraClearFlags.Skybox)
{
Skybox sky = src.GetComponent();
Skybox mysky = dest.GetComponent();
if (!sky || !sky.material)
{
mysky.enabled = false;
}
else
{
mysky.enabled = true;
mysky.material = sky.material;
}
} */
// update other values to match current camera.
// even if we are supplying custom camera&projection matrices,
// some of values are used elsewhere (e.g. skybox uses far plane)
dest.farClipPlane = src.farClipPlane;
dest.nearClipPlane = src.nearClipPlane;
dest.orthographic = src.orthographic;
dest.fieldOfView = src.fieldOfView;
dest.aspect = src.aspect;
dest.orthographicSize = src.orthographicSize;
}
///
/// 获取某个MonoBehaviour
///
///
///
///
///
public static MonoBehaviour GetMonoBehaviour(GameObject go,string name,bool ignoreCase = false)
{
var allComps = go.GetComponents();
for (int i = 0; i < allComps.Length; i++)
{
if (allComps[i] != null)
{
var t = allComps[i].GetType();
if (string.Compare(t.Name,name,ignoreCase)==0)
{
return allComps[i];
}
}
}
return null;
}
}
}