CultivateImmortal/Assets/Scripts/Framework/Util/MathUtil.cs

256 lines
9.3 KiB
C#
Raw Normal View History

2024-11-14 18:15:51 +08:00
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
public class MathUtil
{
#region <EFBFBD>ǶȺͻ<EFBFBD><EFBFBD><EFBFBD>
/// <summary>
/// <20>Ƕ<EFBFBD>ת<EFBFBD><D7AA><EFBFBD>ȵķ<C8B5><C4B7><EFBFBD>
/// </summary>
/// <param name="deg"><3E>Ƕ<EFBFBD>ֵ</param>
/// <returns><3E><><EFBFBD><EFBFBD>ֵ</returns>
public static float Deg2Rad(float deg)
{
return deg * Mathf.Deg2Rad;
}
/// <summary>
/// <20><><EFBFBD><EFBFBD>ת<EFBFBD>Ƕȵķ<C8B5><C4B7><EFBFBD>
/// </summary>
/// <param name="rad"><3E><><EFBFBD><EFBFBD>ֵ</param>
/// <returns><3E>Ƕ<EFBFBD>ֵ</returns>
public static float Rad2Deg(float rad)
{
return rad * Mathf.Rad2Deg;
}
#endregion
#region <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD>
/// <summary>
/// <20><>ȡXZƽ<5A><C6BD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD>
/// </summary>
/// <param name="srcPos"><3E><>1</param>
/// <param name="targetPos"><3E><>2</param>
/// <returns></returns>
public static float GetObjDistanceXZ(Vector3 srcPos, Vector3 targetPos)
{
srcPos.y = 0;
targetPos.y = 0;
return Vector3.Distance(srcPos, targetPos);
}
/// <summary>
/// <20>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD><D6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ƿ<EFBFBD>С<EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD> XZƽ<5A><C6BD>
/// </summary>
/// <param name="srcPos"><3E><>1</param>
/// <param name="targetPos"><3E><>2</param>
/// <param name="dis"><3E><><EFBFBD><EFBFBD></param>
/// <returns></returns>
public static bool CheckObjDistanceXZ(Vector3 srcPos, Vector3 targetPos, float dis)
{
return GetObjDistanceXZ(srcPos, targetPos) <= dis;
}
/// <summary>
/// <20><>ȡXYƽ<59><C6BD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD>
/// </summary>
/// <param name="srcPos"><3E><>1</param>
/// <param name="targetPos"><3E><>2</param>
/// <returns></returns>
public static float GetObjDistanceXY(Vector3 srcPos, Vector3 targetPos)
{
srcPos.z = 0;
targetPos.z = 0;
return Vector3.Distance(srcPos, targetPos);
}
/// <summary>
/// <20>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD><D6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ƿ<EFBFBD>С<EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD> XYƽ<59><C6BD>
/// </summary>
/// <param name="srcPos"><3E><>1</param>
/// <param name="targetPos"><3E><>2</param>
/// <param name="dis"><3E><><EFBFBD><EFBFBD></param>
/// <returns></returns>
public static bool CheckObjDistanceXY(Vector3 srcPos, Vector3 targetPos, float dis)
{
return GetObjDistanceXY(srcPos, targetPos) <= dis;
}
#endregion
#region λ<EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// <summary>
/// <20>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD>µ<EFBFBD>ijһ<C4B3><D2BB><EFBFBD><EFBFBD> <20>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD>Χ<EFBFBD><CEA7>
/// </summary>
/// <param name="pos"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD>µ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB></param>
/// <returns><3E><><EFBFBD><EFBFBD><EFBFBD>ڿɼ<DABF><C9BC><EFBFBD>Χ<EFBFBD><EFBFBD><E2B7B5>true<75><65><EFBFBD><EFBFBD><EFBFBD>򷵻<EFBFBD>false</returns>
public static bool IsWorldPosOutScreen(Vector3 pos)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>תΪ<D7AA><CEAA>Ļ<EFBFBD><C4BB><EFBFBD><EFBFBD>
Vector3 screenPos = Camera.main.WorldToScreenPoint(pos);
//<2F>ж<EFBFBD><D0B6>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD><C4BB>Χ<EFBFBD><CEA7>
if (screenPos.x >= 0 && screenPos.x <= Screen.width &&
screenPos.y >= 0 && screenPos.y <= Screen.height)
return false;
return true;
}
/// <summary>
/// <20>ж<EFBFBD>ijһ<C4B3><D2BB>λ<EFBFBD><CEBB> <20>Ƿ<EFBFBD><C7B7><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD>η<EFBFBD>Χ<EFBFBD>ڣ<EFBFBD>ע<EFBFBD><EFBFBD><E2A3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǻ<EFBFBD><C7BB><EFBFBD>ͬһ<CDAC><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD>µģ<C2B5>
/// </summary>
/// <param name="pos"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>λ<EFBFBD><CEBB></param>
/// <param name="forward"><3E>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD><E6B3AF></param>
/// <param name="targetPos">Ŀ<><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD></param>
/// <param name="radius"><3E>뾶</param>
/// <param name="angle"><3E><><EFBFBD>εĽǶ<C4BD></param>
/// <returns></returns>
public static bool IsInSectorRangeXZ(Vector3 pos, Vector3 forward, Vector3 targetPos, float radius, float angle)
{
pos.y = 0;
forward.y = 0;
targetPos.y = 0;
//<2F><><EFBFBD><EFBFBD> + <20>Ƕ<EFBFBD>
return Vector3.Distance(pos, targetPos) <= radius && Vector3.Angle(forward, targetPos - pos) <= angle / 2f;
}
#endregion
#region <EFBFBD><EFBFBD><EFBFBD>߼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// <summary>
/// <20><><EFBFBD>߼<EFBFBD><DFBC><EFBFBD> <20><>ȡһ<C8A1><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ָ<><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ָ<><D6B8><EFBFBD><EFBFBD><E3BCB6>
/// </summary>
/// <param name="ray"><3E><><EFBFBD><EFBFBD></param>
/// <param name="callBack"><3E>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>RayCastHit<69><74>Ϣ<EFBFBD><CFA2><EFBFBD>ݳ<EFBFBD>ȥ<EFBFBD><C8A5></param>
/// <param name="maxDistance"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD></param>
/// <param name="layerMask"><3E>㼶ɸѡ</param>
public static void RayCast(Ray ray, UnityAction<RaycastHit> callBack, float maxDistance, int layerMask)
{
RaycastHit hitInfo;
if(Physics.Raycast(ray, out hitInfo, maxDistance, layerMask))
callBack.Invoke(hitInfo);
}
/// <summary>
/// <20><><EFBFBD>߼<EFBFBD><DFBC><EFBFBD> <20><>ȡһ<C8A1><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ָ<><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ָ<><D6B8><EFBFBD><EFBFBD><E3BCB6>
/// </summary>
/// <param name="ray"><3E><><EFBFBD><EFBFBD></param>
/// <param name="callBack"><3E>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>GameObject<63><74>Ϣ<EFBFBD><CFA2><EFBFBD>ݳ<EFBFBD>ȥ<EFBFBD><C8A5></param>
/// <param name="maxDistance"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD></param>
/// <param name="layerMask"><3E>㼶ɸѡ</param>
public static void RayCast(Ray ray, UnityAction<GameObject> callBack, float maxDistance, int layerMask)
{
RaycastHit hitInfo;
if (Physics.Raycast(ray, out hitInfo, maxDistance, layerMask))
callBack.Invoke(hitInfo.collider.gameObject);
}
/// <summary>
/// <20><><EFBFBD>߼<EFBFBD><DFBC><EFBFBD> <20><>ȡһ<C8A1><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ָ<><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ָ<><D6B8><EFBFBD><EFBFBD><E3BCB6>
/// </summary>
/// <param name="ray"><3E><><EFBFBD><EFBFBD></param>
/// <param name="callBack"><3E>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD>Ϲ<EFBFBD><CFB9>ڵ<EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>ű<EFBFBD><C5B1><EFBFBD><EFBFBD>ݳ<EFBFBD>ȥ<EFBFBD><C8A5></param>
/// <param name="maxDistance"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD></param>
/// <param name="layerMask"><3E>㼶ɸѡ</param>
public static void RayCast<T>(Ray ray, UnityAction<T> callBack, float maxDistance, int layerMask)
{
RaycastHit hitInfo;
if (Physics.Raycast(ray, out hitInfo, maxDistance, layerMask))
callBack.Invoke(hitInfo.collider.gameObject.GetComponent<T>());
}
/// <summary>
/// <20><><EFBFBD>߼<EFBFBD><DFBC><EFBFBD> <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ָ<><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ָ<><D6B8><EFBFBD>
/// </summary>
/// <param name="ray"><3E><><EFBFBD><EFBFBD></param>
/// <param name="callBack"><3E>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>RayCastHit<69><74>Ϣ<EFBFBD><CFA2><EFBFBD>ݳ<EFBFBD>ȥ<EFBFBD><C8A5> ÿһ<C3BF><D2BB><EFBFBD><EFBFBD><EFBFBD>󶼻<EFBFBD><F3B6BCBB><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB></param>
/// <param name="maxDistance"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD></param>
/// <param name="layerMask"><3E>㼶ɸѡ</param>
public static void RayCastAll(Ray ray, UnityAction<RaycastHit> callBack, float maxDistance, int layerMask)
{
RaycastHit[] hitInfos = Physics.RaycastAll(ray, maxDistance, layerMask);
for (int i = 0; i < hitInfos.Length; i++)
callBack.Invoke(hitInfos[i]);
}
/// <summary>
/// <20><><EFBFBD>߼<EFBFBD><DFBC><EFBFBD> <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ָ<><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ָ<><D6B8><EFBFBD>
/// </summary>
/// <param name="ray"><3E><><EFBFBD><EFBFBD></param>
/// <param name="callBack"><3E>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>GameObject<63><74>Ϣ<EFBFBD><CFA2><EFBFBD>ݳ<EFBFBD>ȥ<EFBFBD><C8A5> ÿһ<C3BF><D2BB><EFBFBD><EFBFBD><EFBFBD>󶼻<EFBFBD><F3B6BCBB><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB></param>
/// <param name="maxDistance"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD></param>
/// <param name="layerMask"><3E>㼶ɸѡ</param>
public static void RayCastAll(Ray ray, UnityAction<GameObject> callBack, float maxDistance, int layerMask)
{
RaycastHit[] hitInfos = Physics.RaycastAll(ray, maxDistance, layerMask);
for (int i = 0; i < hitInfos.Length; i++)
callBack.Invoke(hitInfos[i].collider.gameObject);
}
/// <summary>
/// <20><><EFBFBD>߼<EFBFBD><DFBC><EFBFBD> <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ָ<><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ָ<><D6B8><EFBFBD>
/// </summary>
/// <param name="ray"><3E><><EFBFBD><EFBFBD></param>
/// <param name="callBack"><3E>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ľű<C4BD><C5B1><EFBFBD><EFBFBD>ݳ<EFBFBD>ȥ<EFBFBD><C8A5> ÿһ<C3BF><D2BB><EFBFBD><EFBFBD><EFBFBD>󶼻<EFBFBD><F3B6BCBB><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB></param>
/// <param name="maxDistance"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD></param>
/// <param name="layerMask"><3E>㼶ɸѡ</param>
public static void RayCastAll<T>(Ray ray, UnityAction<T> callBack, float maxDistance, int layerMask)
{
RaycastHit[] hitInfos = Physics.RaycastAll(ray, maxDistance, layerMask);
for (int i = 0; i < hitInfos.Length; i++)
callBack.Invoke(hitInfos[i].collider.gameObject.GetComponent<T>());
}
#endregion
#region <EFBFBD><EFBFBD>Χ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// <summary>
/// <20><><EFBFBD>к<EFBFBD>װ<EFBFBD><D7B0>Χ<EFBFBD><CEA7><EFBFBD><EFBFBD>
/// </summary>
/// <typeparam name="T"><3E><>Ҫ<EFBFBD><D2AA>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д Collider GameObject <20>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD></typeparam>
/// <param name="center"><3E><>װ<EFBFBD><D7B0><EFBFBD>ĵ<EFBFBD></param>
/// <param name="rotation"><3E><><EFBFBD>ӵĽǶ<C4BD></param>
/// <param name="halfExtents"><3E><><EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD>һ<EFBFBD><D2BB></param>
/// <param name="layerMask"><3E>㼶ɸѡ</param>
/// <param name="callBack"><3E>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD> </param>
public static void OverlapBox<T>(Vector3 center, Quaternion rotation, Vector3 halfExtents, int layerMask, UnityAction<T> callBack) where T : class
{
Type type = typeof(T);
Collider[] colliders = Physics.OverlapBox(center, halfExtents, rotation, layerMask, QueryTriggerInteraction.Collide);
for (int i = 0; i < colliders.Length; i++)
{
if (type == typeof(Collider))
callBack.Invoke(colliders[i] as T);
else if (type == typeof(GameObject))
callBack.Invoke(colliders[i].gameObject as T);
else
callBack.Invoke(colliders[i].gameObject.GetComponent<T>());
}
}
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ<E5B7B6><CEA7><EFBFBD><EFBFBD>
/// </summary>
/// <typeparam name="T"><3E><>Ҫ<EFBFBD><D2AA>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д Collider GameObject <20>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD></typeparam>
/// <param name="center"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD></param>
/// <param name="radius"><3E><><EFBFBD><EFBFBD><EFBFBD>İ뾶</param>
/// <param name="layerMask"><3E>㼶ɸѡ</param>
/// <param name="callBack"><3E>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD></param>
public static void OverlapSphere<T>(Vector3 center, float radius, int layerMask, UnityAction<T> callBack) where T:class
{
Type type = typeof(T);
Collider[] colliders = Physics.OverlapSphere(center, radius, layerMask, QueryTriggerInteraction.Collide);
for (int i = 0; i < colliders.Length; i++)
{
if (type == typeof(Collider))
callBack.Invoke(colliders[i] as T);
else if (type == typeof(GameObject))
callBack.Invoke(colliders[i].gameObject as T);
else
callBack.Invoke(colliders[i].gameObject.GetComponent<T>());
}
}
#endregion
}