using DG.Tweening;
using ShadowStudio.Model;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
#if UNITY_EDITOR
using UnityEditor;
#endif
using UnityEngine;
using UnityEngine.Video;
namespace XRTool.Util
{
///
/// 工具类,各种常用算法的集合脚本
///
public static class UnityUtil
{
#if UNITY_EDITOR
///
/// 尝试得到一个未命名的名称
///
///
///
///
///
public static string TryGetName(string path, string suffix = ".asset")
{
int index = 0;
string confName = "";
UnityEngine.Object obj = null;
do
{
confName = path + "/" + typeof(T).Name + "_" + index + suffix;
obj = AssetDatabase.LoadAssetAtPath(confName, typeof(T));
index++;
} while (obj);
return confName;
}
#endif
///
/// 获取指定名称类型的对象
///
///
///
///
public static T GetChild(Transform target, string childName)
{
var child = target.Find(childName);
if (child)
{
return child.GetComponent();
}
return default(T);
}
///
/// 深度优先搜索查找子物体
///
///
///
///
public static T GetDepthChild(Transform transform, string childName)
{
Transform target = FindDepthTransf(transform, childName);
if (target)
return GetT(target.gameObject);
return default(T);
}
///
/// 广度优先查找子物体
///
///
///
///
public static T GetBreadthChild(Transform transform, string childName)
{
Transform target = FindBreadthTransf(transform, childName);
if (target)
return GetT(target.gameObject);
return default(T);
}
public static GameObject GetBreadthChild(Transform transform, string childName)
{
Transform target = FindBreadthTransf(transform, childName);
if (target)
return target.gameObject;
return null;
}
public static T GetParent(Transform transform)
{
return transform.GetComponentInParent();
}
public static T GetChild(Transform trans)
{
return trans.GetComponentInChildren();
}
public static T GetT(GameObject target)
{
return target.GetComponent();
}
///
/// 深度优先检索子物体
///
///
///
///
public static Transform FindDepthTransf(Transform check, string childName)
{
if (check.name == childName) return check;
for (int i = 0; i < check.childCount; i++)
{
Transform obj = FindDepthTransf(check.GetChild(i), childName);
if (obj)
return obj;
}
return null;
}
///
/// 广度优先检索子物体
///
///
///
///
public static Transform FindBreadthTransf(Transform check, string childName)
{
Transform forreturn = check.Find(childName);
if (forreturn)
{
return forreturn;
}
if (check.childCount > 0)
{
for (int i = 0; i < check.childCount; i++)
{
var target = FindBreadthTransf(check.GetChild(i), childName);
if (target)
{
return target;
}
}
}
return forreturn;
}
public static void SetParent(Transform parent, Transform child)
{
child.SetParent(parent);
child.localPosition = Vector3.zero;
child.localRotation = Quaternion.identity;
child.localScale = Vector3.one;
}
///
/// 去除文件bom头后的字符
///
///
///
public static string GetUTF8String(byte[] buffer)
{
if (buffer == null)
return null;
if (buffer.Length <= 3)
{
return Encoding.UTF8.GetString(buffer);
}
byte[] bomBuffer = new byte[] { 0xef, 0xbb, 0xbf };
if (buffer[0] == bomBuffer[0]
&& buffer[1] == bomBuffer[1]
&& buffer[2] == bomBuffer[2])
{
return new UTF8Encoding(false).GetString(buffer, 3, buffer.Length - 3);
}
return Encoding.UTF8.GetString(buffer);
}
///
/// 获取距离放歌最近的数字
/// 四舍五入
///
///
///
///
public static float GetNearst(float num, float cell)
{
int dir = num < 0 ? -1 : 1;
return ((int)(num + cell / 2 * dir) / (int)cell) * cell;
}
///
/// 判断两个矩形是否相交
/// 如果两个矩形中心点在x、y轴的投影距离分别小于矩形的边长之和,则此矩形相交
///
///
///
///
public static bool IsCrossLine(Rect a, Rect b)
{
Vector2 dis = b.center - a.center;
if (((int)a.width + (int)b.width) / 2 > Math.Abs(dis.x) && ((int)a.height + (int)b.height) / 2 > Math.Abs(dis.y))
{
return true;
}
return false;
}
public static void ChangeMateColor(Renderer render, Color color, string name = "_Color")
{
if (render)
{
MaterialPropertyBlock propertyBlock = new MaterialPropertyBlock();
render.GetPropertyBlock(propertyBlock);
propertyBlock.SetColor(name, color);
render.SetPropertyBlock(propertyBlock);
//ChangeMateValue(render, propertyBlock);
propertyBlock = null;
}
}
public static void ChangeMateColor(MaterialPropertyBlock propertyBlock, Renderer render, Color color, string name = "_Color")
{
if (render)
{
render.GetPropertyBlock(propertyBlock);
propertyBlock.SetColor(name, color);
render.SetPropertyBlock(propertyBlock);
//ChangeMateValue(render, propertyBlock);
//propertyBlock = null;
}
}
public static void ChangeMateTexture2D(Renderer render, Texture2D img, string name = "_MainTex")
{
if (render)
{
MaterialPropertyBlock propertyBlock = new MaterialPropertyBlock();
render.GetPropertyBlock(propertyBlock);
propertyBlock.SetTexture(name, img);
render.SetPropertyBlock(propertyBlock);
propertyBlock = null;
}
}
public static void ChangeMateVideo(GameObject obj, VideoClip video, string name = "_MainTex")
{
if (obj)
{
VideoPlayer vp = obj.GetComponent();
vp.clip = video;
}
}
public static void ChangeMateTexture(Renderer render, Texture img, string name = "_MainTex")
{
if (render)
{
MaterialPropertyBlock propertyBlock = new MaterialPropertyBlock();
render.GetPropertyBlock(propertyBlock);
propertyBlock.SetTexture(name, img);
render.SetPropertyBlock(propertyBlock);
propertyBlock = null;
}
}
public static void ChangeMateValue(Renderer render, float att, string name = "_Smoothness")
{
if (render)
{
MaterialPropertyBlock propertyBlock = new MaterialPropertyBlock();
render.GetPropertyBlock(propertyBlock);
propertyBlock.SetFloat(name, att);
render.SetPropertyBlock(propertyBlock);
//ChangeMateValue(render, propertyBlock);
propertyBlock = null;
}
}
public static void ChangeMateValue(Renderer render, Vector4 att, string name = "_Smoothness")
{
if (render)
{
MaterialPropertyBlock propertyBlock = new MaterialPropertyBlock();
render.GetPropertyBlock(propertyBlock);
propertyBlock.SetVector(name, att);
render.SetPropertyBlock(propertyBlock);
//ChangeMateValue(render, propertyBlock);
propertyBlock = null;
}
}
public static void ChangeMateValue(Renderer render, MaterialPropertyBlock propertyBlock)
{
if (render)
{
//MaterialPropertyBlock propertyBlock = new MaterialPropertyBlock();
render.GetPropertyBlock(propertyBlock);
//propertyBlock.SetVector(name, att);
render.SetPropertyBlock(propertyBlock);
}
}
///
/// 材质复制
///
///
///
public static void CopyMate(Material resMate, Material targetMate)
{
if (resMate && resMate != targetMate)
{
resMate.shader = targetMate.shader;
resMate.CopyPropertiesFromMaterial(targetMate);
}
}
///
///
///
///
public static string ArtTransferInfo(ArtInfo info)
{
Vector3 pos = GameSession.Instance.GetHeadForwadPos(info.Distance);
if (GameNode.Instance)
{
pos = GameNode.Instance.transform.InverseTransformPoint(pos);
}
var angle = Vector3.zero;
var scale = Vector3.one * info.Size;
return TransferToString(pos, angle, scale, 2);
}
public static string ArtTransferInfo(ArtInfo info, int i, bool isperson = false)
{
Vector3 pos = GameSession.Instance.GetHeadForwadPos(info.Distance);
if (GameNode.Instance)
{
pos.x = pos.x + i * 0.3f;
pos = GameNode.Instance.transform.InverseTransformPoint(pos);
if (isperson)
{
pos.z = -2;
}
}
var angle = Vector3.zero;
var scale = Vector3.one * info.Size;
return TransferToString(pos, angle, scale, 2);
}
public static string TransferToString(Transform tranfer, int state)
{
return TransferToString(tranfer.localPosition, tranfer.localEulerAngles, tranfer.localScale, state);
}
public static int maxTransfer = 1000;
public static string TransferToString(Vector3 pos, Vector3 ang, Vector3 sca, int state)
{
string info = "";
pos *= maxTransfer;
ang *= maxTransfer;
sca *= maxTransfer;
string position = (int)(pos.x) + "," + (int)(pos.y) + "," + (int)(pos.z);
string angle = (int)(ang.x) + "," + (int)(ang.y) + "," + (int)(ang.z);
string scale = (int)(sca.x) + "," + (int)(sca.y) + "," + (int)(sca.z);
info = position + "|" + angle + "|" + scale;
//if (state == 2)
//{
// info = pos + "|" + angle + "|" + scale;
//}
//else if (state == 1)
//{
// info = pos + "|" + angle;
//}
//else if (state == 1)
//{
// info = pos;
//}
return info;
}
public static Posture GetPosture(Transform info)
{
Posture posture = new Posture();
posture.position = info.localPosition;
posture.angle = info.localEulerAngles;
posture.scale = info.localScale;
posture.count = 2;
return posture;
}
public static void SetPosture(Transform info, Posture posture, float time = -1)
{
if (time <= 0)
{
info.localPosition = posture.position;
info.localEulerAngles = posture.angle;
info.localScale = posture.scale;
}
else
{
info.DOKill();
if (posture.count >= 0)
{
info.DOLocalMove(posture.position, time);
}
if (posture.count >= 1)
{
info.DOLocalRotate(posture.angle, time);
}
if (posture.count >= 2)
{
info.DOScale(posture.scale, time);
}
}
}
public static Posture GetPosture(string info)
{
Posture posture = new Posture();
string[] arr = info.Split('|');
for (int i = 0; i < arr.Length; i++)
{
if (string.IsNullOrEmpty(arr[i]))
{
continue;
}
string[] v = arr[i].Split(',');
Vector3 vector = Vector3.zero;
vector.x = float.Parse(v[0]);
vector.y = float.Parse(v[1]);
vector.z = float.Parse(v[2]);
//for (int j = 0; j < v.Length; j++)
//{
// float value = float.Parse(v[j]);
// if (j == 0)
// {
// vector.x = value;
// }
// else if (j == 1)
// {
// vector.y = value;
// }
// else if (j == 2)
// {
// vector.z = value;
// }
//}
vector /= maxTransfer;
if (i == 0)
{
posture.position = vector;
}
else if (i == 1)
{
posture.angle = vector;
}
else if (i == 2)
{
posture.scale = vector;
}
posture.count = i;
}
return posture;
}
//public static Posture GetPosture(string info)
//{
// Posture posture = new Posture();
// string[] arr = info.Split('|');
// for (int i = 0; i < arr.Length; i++)
// {
// if (string.IsNullOrEmpty(arr[i]))
// {
// continue;
// }
// string[] v = arr[i].Split(',');
// Vector3 vector = Vector3.zero;
// for (int j = 0; j < v.Length; j++)
// {
// float value = float.Parse(v[j]);
// if (j == 0)
// {
// vector.x = value;
// }
// else if (j == 1)
// {
// vector.y = value;
// }
// else if (j == 2)
// {
// vector.z = value;
// }
// }
// vector *= maxTransfer;
// if (i == 0)
// {
// posture.position = vector;
// }
// else if (i == 1)
// {
// posture.angle = vector;
// }
// else if (i == 2)
// {
// posture.scale = vector;
// }
// posture.count = i;
// }
// return posture;
//}
public static Vector3 StringToVector3(string v)
{
Vector3 z = Vector3.zero;
v = v.Replace("(", "").Replace(")", "");
string[] s = v.Split(',');
if (s.Length > 2)
{
z.x = float.Parse(s[0]);
z.y = float.Parse(s[1]);
z.z = float.Parse(s[2]);
z /= maxTransfer;
}
return z;
}
public static string Vector3ToString(Vector3 v)
{
return v.ToString();
}
public static string QuaterToString(Quaternion q)
{
q.x *= maxTransfer;
q.y *= maxTransfer;
q.z *= maxTransfer;
q.w *= maxTransfer;
return q.ToString();
}
public static Quaternion StringToQuater(string v)
{
Quaternion q = Quaternion.identity;
v = v.Replace("(", "").Replace(")", "");
string[] s = v.Split(',');
if (s.Length > 3)
{
q.x = float.Parse(s[0]) / maxTransfer;
q.y = float.Parse(s[1]) / maxTransfer;
q.z = float.Parse(s[2]) / maxTransfer;
q.w = float.Parse(s[3]) / maxTransfer;
}
return q;
}
public static Vector3 RealForward(Transform body)
{
Vector3 right = body.right;
right.y = 0;
return Vector3.Cross(right, Vector3.up);
}
public static string CurTimeString
{
get { return DateTime.Now.ToString("MMddHHmmssf"); }
}
///
/// base 64 2 Texture2D
///
///
///
public static Texture Base642Tex2d(string base64)
{
string[] strs = base64.Split(',');
byte[] bytes = Convert.FromBase64String(strs[strs.Length - 1]);
Texture2D tex2D = new Texture2D(512, 512);
tex2D.LoadImage(bytes);
return tex2D;
}
}
}