using System; using System.Linq; using System.Threading.Tasks; using Unity.VisualScripting; using UnityEngine; 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 Vector3 GetMouseWorldPos(Vector3 mousePoint, Transform transform) { if (!_mainCam) _mainCam = Camera.main; mousePoint.z = _mainCam.WorldToScreenPoint(transform.position).z; return _mainCam.ScreenToWorldPoint(mousePoint); } /// /// 属性复制 /// /// 属性源 /// 属性目标 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)); } } } #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; } #endregion } }