using System;
using System.Collections.Generic;
using System.Text;
using System.Linq;
using System.Reflection;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.UI;
using Object = UnityEngine.Object;
using System.Globalization;
#if UNITY_EDITOR
using UnityEditor;
#endif
namespace AibisDream.Utility
{
public static class CommonUtil
{
private const float Epsilon = 1e-5f;
private static Camera _mainCam;
///
/// 判断为0
///
/// 浮点数
/// 是否为0
public static bool IsZero(float value)
{
// 如果value小于epsilon,则认为它等于0
return Mathf.Abs(value) < Epsilon;
}
///
/// 判断浮点数是否相等
///
/// value1
/// value2
/// 是否相等
public static bool IsEqual(float value1, float value2)
{
return Mathf.Abs(value1 - value2) < Epsilon;
}
///
/// 简单延时实现
///
/// 延时
/// 函数
public static async Task Delay(int delayTime, Action action)
{
await Task.Delay(delayTime);
action?.Invoke();
}
///
/// 受限数值
///
/// 目标数
/// 上限
/// 下限
/// 结果
public static float Limit(float target, float max, float min)
{
if (target <= min)
{
return min;
}
if (target >= max)
{
return max;
}
return target;
}
public static int Limit(int target, int max, int min)
{
if (target <= min)
{
return min;
}
if (target >= max)
{
return max;
}
return target;
}
///
/// 步进循环
///
/// 操作数
/// 最小值
/// 最大值
/// 步进
///
/// 范围错误
public static int LoopStep(int target, int min, int max, int step = 1)
{
if (min > max)
{
throw new ArgumentException("min should be less than or equal to max.");
}
var range = max - min + 1;
// 计算新的目标值
var newTarget = target + step;
// 计算结果在范围内的值
if (newTarget > max)
{
newTarget = min + (newTarget - max - 1) % range;
}
else if (newTarget < min)
{
newTarget = max - (min - newTarget - 1) % range;
}
return newTarget;
}
///
/// 属性复制
///
/// 属性源
/// 属性目标
public static void CopyFields(object source, object target)
{
var sourceFields = source.GetType().GetFields();
var targetFields = target.GetType().GetFields();
foreach (var sourceField in sourceFields)
{
if (sourceField.IsStatic) return;
var targetField = targetFields.FirstOrDefault(p =>
p.Name == sourceField.Name && p.FieldType == sourceField.FieldType);
if (targetField != null && !targetField.IsStatic())
{
targetField.SetValue(target, sourceField.GetValue(source));
}
}
}
///
/// 角度转换
///
/// 180度角
/// 360度角
public static float Angle360(float angle)
{
return angle < 0 ? angle + 360 : angle;
}
#region 链式扩展
public static T As(this object selfObj) where T : class
{
return selfObj as T;
}
public static T Self(this T self, Action onDo)
{
onDo?.Invoke(self);
return self;
}
public static T Self(this T self, Func onDo)
{
return onDo.Invoke(self);
}
#endregion
#region 静态扩展
public static void SetAlpha(this SpriteRenderer renderer, float targetAlpha)
{
Color color = renderer.color;
color.a = targetAlpha;
renderer.color = color;
}
public static void SetAlpha(this Image image, float targetAlpha)
{
Color color = image.color;
color.a = targetAlpha;
image.color = color;
}
public static void DestroyAllChildren(this Transform self)
{
if (self == null)
{
return;
}
List children = new List();
foreach (Transform child in self)
{
children.Add(child);
}
foreach (var child in children)
{
#if UNITY_EDITOR
if (!EditorApplication.isPlaying)
{
Object.DestroyImmediate(child.gameObject);
continue;
}
#endif
Object.Destroy(child.gameObject);
}
}
#endregion
///
/// 去除原始对话中名称部分
///
/// 对话原文
/// 去除名称后结果
public static string RemoveName(string lineText)
{
var textArr = lineText.Split(":");
return textArr.Length > 1 ? textArr[1].Trim() : lineText;
}
public static Vector2 GetPivotByType(PivotType pivotType)
{
return pivotType switch
{
PivotType.Top => new Vector2(0.5f, 1),
PivotType.Bottom => new Vector2(0.5f, 0),
PivotType.Left => new Vector2(0, 0.5f),
PivotType.Right => new Vector2(1, 0.5f),
PivotType.TopLeft => new Vector2(0, 1),
PivotType.TopRight => new Vector2(1, 1),
PivotType.BottomLeft => new Vector2(0, 0),
PivotType.BottomRight => new Vector2(1, 0),
PivotType.Center => new Vector2(0.5f, 0.5f),
_ => Vector2.zero
};
}
public static string Escape(string rawText)
{
return rawText.Replace("^", "#").Replace("[[", "{").Replace("]]", "}");
}
public static List FindTypesWithAttribute()
where TAttribute : Attribute
{
return Assembly.GetExecutingAssembly()
.GetTypes()
.Where(t => t.GetCustomAttributes(typeof(TAttribute), false).Length > 0)
.ToList();
}
public static string RemoveRichTextTags(this string str)
{
return Regex.Replace(str.Replace("
", "\n"), "[<|{].*?[>|}]", string.Empty);
}
public static int[,] DeserializeIntArray(string str)
{
if (string.IsNullOrWhiteSpace(str))
{
return new int[0, 0];
}
var array = str.Trim().Split(';');
var result = new int[array.Length, array[0].Split(',').Length];
for (int i = 0; i < array.Length; i++)
{
var row = array[i].Split(',');
for (int j = 0; j < row.Length; j++)
{
result[i, j] = int.Parse(row[j], NumberStyles.Integer, CultureInfo.InvariantCulture);
}
}
return result;
}
public static string SerializeIntArray(int[,] array)
{
var result = new StringBuilder();
for (int i = 0; i < array.GetLength(0); i++)
{
for (int j = 0; j < array.GetLength(1); j++)
{
result.Append(array[i, j]);
if (j < array.GetLength(1) - 1)
{
result.Append(',');
}
}
if (i < array.GetLength(0) - 1)
{
result.Append(';');
}
}
return result.ToString();
}
}
}