using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEngine.EventSystems;
public class UIBase : MonoBehaviour
{
public static UIBase _instance;
void Start()
{
}
void Awake()
{
_instance = this;
}
// Update is called once per frame
void Update()
{
}
///
/// 杀死进程
///
/// 进程名称,不带路径及后缀
public void CloseExe(string _exePathName)
{
System.Diagnostics.Process[] progress = System.Diagnostics.Process.GetProcessesByName(_exePathName);
UnityEngine.Debug.Log("progress个数:" + progress.Length);
for (int i = 0; i < progress.Length; i++)
{
progress[i].Kill();
}
}
public bool IsPointerOverUIObject()
{//判断是否点击的是UI,有效应对安卓没有反应的情况,true为UI
PointerEventData eventDataCurrentPosition = new PointerEventData(EventSystem.current);
eventDataCurrentPosition.position = new Vector2(Input.mousePosition.x, Input.mousePosition.y);
List results = new List();
EventSystem.current.RaycastAll(eventDataCurrentPosition, results);
return results.Count > 0;
}
///
/// 读取数据
///
/// 数据地址。文件名
public string JsonLoad(string pathName)
{
string filePath = Application.streamingAssetsPath + "/" + pathName + ".json";
return File.ReadAllText(filePath);//, Encoding.GetEncoding("gb2312"));//转码 中文乱码问题
}
public float ReturnTwoDotsAngle(Vector3 a,Vector3 b) {
a = a.normalized;
b = b.normalized;
float result = Vector3.Dot(a,b);
float radians=Mathf.Acos(result);
float angle= radians * Mathf.Rad2Deg;
Vector3 c = Vector3.Cross(a, b);
Vector3 normal = new Vector3(1,1,1);
normal = normal.normalized;
float value = Vector3.Dot(c,normal);
if (value<0) {
angle *= -1;
}
Debug.LogError("====="+angle);
return angle;
}
public void MyDot(Vector3 a, Vector3 b)
{
//点乘结果
float _result1 = Vector3.Dot(a, b);
//角度[0-180]
float _angle1 = Vector3.Angle(a, b);
//也可通过 单位向量 来计算角度
//_result2 为夹角余弦值
float _result2 = Vector3.Dot(a.normalized, b.normalized);
//反余弦函数来求对应的弧度
float _temp = Mathf.Acos(_result2);
//弧度转角度[0,90]
float _angel2 = Mathf.Rad2Deg * _temp;
Debug.Log(string.Format("角度1:{0},角度2:{1}", _angle1, _angel2));
}
//叉乘
public void MyCross(Vector3 a, Vector3 b)
{
//叉乘结果
Vector3 _result3 = Vector3.Cross(a, b);
//获取两个向量夹角(弧度)
float _temp = Mathf.Asin(Vector3.Distance(Vector3.zero, Vector3.Cross(a.normalized, b.normalized)));
float _angel3 = Mathf.Rad2Deg * _temp;
Debug.Log("角度3:" + _angel3);
// 判断顺时针、逆时针方向,是在 2D 平面内的,所以需指定一个平面,
//下面以X、Z轴组成的平面为例 , (Y 轴为纵轴),
// 在 X、Z 轴平面上,判断 b 在 a 的顺时针或者逆时针方向,
if (_result3.y > 0)
{
// b 在 a 的顺时针方向
Debug.Log("b 在 a 的顺时针方向");
}
else if (_result3.y == 0)
{
// b 和 a 方向相同(平行)
Debug.Log("b 和 a 方向相同");
}
else
{
// b 在 a 的逆时针方向
Debug.Log("b 在 a 的逆时针方向");
}
}
//点积
private void TestDot(Vector3 a, Vector3 b)
{
// 计算 a、b 点积结果
float result = Vector3.Dot(a, b);
// 通过向量直接获取两个向量的夹角(默认为 角度), 此方法范围 [0 - 180]
float angle = Vector3.Angle(a, b);
// 计算 a、b 单位向量的点积,得到夹角余弦值,|a.normalized|*|b.normalized|=1;
result = Vector3.Dot(a.normalized, b.normalized);
// 通过反余弦函数获取 向量 a、b 夹角(默认为 弧度)
float radians = Mathf.Acos(result);
// 将弧度转换为 角度
angle = radians * Mathf.Rad2Deg;
}
//叉乘
private void TestCross(Vector3 a, Vector3 b)
{
//计算向量 a、b 的叉积,结果为 向量
Vector3 c = Vector3.Cross(a, b);
// 通过反正弦函数获取向量 a、b 夹角(默认为弧度)
float radians = Mathf.Asin(Vector3.Distance(Vector3.zero, Vector3.Cross(a.normalized, b.normalized)));
float angle = radians * Mathf.Rad2Deg;
// 判断顺时针、逆时针方向,是在 2D 平面内的,所以需指定一个平面,
//下面以X、Z轴组成的平面为例 , (Y 轴为纵轴),
// 在 X、Z 轴平面上,判断 b 在 a 的顺时针或者逆时针方向,
if (c.y > 0)
{
// b 在 a 的顺时针方向
}
else if (c.y == 0)
{
// b 和 a 方向相同(平行)
}
else
{
// b 在 a 的逆时针方向
}
}
// 获取两个向量的夹角 Vector3.Angle 只能返回 [0, 180] 的值
// 如真实情况下向量 a 到 b 的夹角(80 度)则 b 到 a 的夹角是(-80)
// 通过 Dot、Cross 结合获取到 a 到 b, b 到 a 的不同夹角
public void GetAngle(Vector3 a, Vector3 b)
{
Vector3 c = Vector3.Cross(a, b);
float angle = Vector3.Angle(a, b);
// b 到 a 的夹角
float sign = Mathf.Sign(Vector3.Dot(c.normalized, Vector3.Cross(a.normalized, b.normalized)));
float signed_angle = angle * sign;
Debug.Log("b -> a :" + signed_angle);
// a 到 b 的夹角
sign = Mathf.Sign(Vector3.Dot(c.normalized, Vector3.Cross(b.normalized, a.normalized)));
signed_angle = angle * sign;
Debug.Log("a -> b :" + signed_angle);
}
public void DirectionJudge(Vector3 a, Vector3 b)
{
a = a.normalized;
b = b.normalized;
Vector3 dir = a - b;
dir.z = 0f;
var magiDir = Vector3.Magnitude(dir);//取模
float v = Vector3.Dot(Vector3.up, dir) / magiDir;//点乘判断前后
float h = Vector3.Cross(Vector3.forward, dir).y;//叉乘判断左右
if (v >= 0.5f)
{
Debug.Log("向前");
}
else if (v < -0.5f)
{
Debug.Log("向后");
}
else if (h > 0)
{
Debug.Log("向右");
}
else if (h < 0)//如果写else,点原地时会卡一个left的trigger进去,不行
Debug.Log("向左");
}
public void ClearChilds(Transform trans) {
for (int i = 0; i < trans.childCount; i++)
{
Destroy(trans.GetChild(i).gameObject);
}
}
}