角度范围检测方法之二
https://www.jianshu.com/p/20e0c875491a/
这篇文章介绍了三种方法,分别用Quaternion.Angle,Vector3.Angle,Vector3.dot
` //旋转角度
private void GetAngleA()
{
Vector3 targetDir = target.position - transform.position;
Quaternion roation = Quaternion.LookRotation(targetDir);
float angle = Quaternion.Angle(transform.rotation, roation);
print("角度(quaternaion)A:" + angle);
}
//旋转角度
private void GetAngleB()
{
Vector3 targetDir = target.position - transform.position;
//lhs rhs
float angle = Vector3.Angle(targetDir, transform.forward);
print("角度(Vector)B:" + angle);
}
private void GetAngleC()
{
Vector3 targetDir = target.position - transform.position;
Vector3 playerForward = target.rotation * transform.forward;
float angle = Mathf.Acos(Vector3.Dot(playerForward.normalized, targetDir.normalized)) * Mathf.Rad2Deg;
print("角度(dot)C:" + angle);
}`
经我研究,觉得Cross也可以实现,下面是我的方法:
private void GetAngleD() { Vector3 targetDir = target.position - transform.position; Vector3 playerForward = transform.forward; float angle = Mathf.Asin(Vector3.Cross(playerForward.normalized, targetDir.normalized).y) * Mathf.Rad2Deg; print("角度(Cross)D:" + angle); }
如此四种方法,哪种效率最高,有待研究。
同样判断方向的也可以分别用Dot和Cross
方法一:Dot
//dot判断左右 private void GetDotdrection() { Vector3 targetDir = target.position - transform.position; float dir = Vector3.Dot(targetDir.normalized, transform.right); if (dir > 0) { print("dot右边"); } else { print("dot左边"); } }
方法二、使用Cross
` //使用Cross判断前后左右
private void GetCrossdrection()
{
Vector3 targetDir = target.position - transform.position;
Vector3 dirCross = Vector3.Cross(transform.forward, targetDir.normalized);
Vector3 dirCrossSide = Vector3.Cross(transform.right, targetDir.normalized);
Debug.Log(dirCross.y + ":" + dirCrossSide);
HideAllObjs();
//左前方向
if (dirCross.y > 0 & dirCrossSide.y > 0)
{
selfDirObj[3].gameObject.SetActive(true);
}
//右前方向
if (dirCross.y > 0 & dirCrossSide.y < 0)
{
selfDirObj[1].gameObject.SetActive(true);
}
//左后方向
if (dirCross.y < 0 & dirCrossSide.y > 0)
{
selfDirObj[2].gameObject.SetActive(true);
}
//右后方向
if (dirCross.y < 0 & dirCrossSide.y < 0)
{
selfDirObj[0].gameObject.SetActive(true);
}
//float dir = dirCross.y;
//if (dir > 0)
//{
// selfDirObj[1].gameObject.SetActive(true);
// //print("cross右边");
//}
//else
//{
// selfDirObj[0].gameObject.SetActive(true);
// //print("cross左边");
//}
}
void HideAllObjs()
{
foreach (var item in selfDirObj)
{
item.gameObject.SetActive(false);
}
}
`
上面方法可以做P4项目的充气点位变化

浙公网安备 33010602011771号