做战舰转向
如果转向的速度是缓慢的。可以使用Quaternion.Slerp
但是这个转向插值,是无法完全转向到实际目标的。就是说在update里会一直执行Slerp,我感觉会影响效率
http://www.xuanyusong.com/archives/1977
这个教程可以解决一些基础概念问题。可以学习写一下。但是并没有解决上述问题。
如果要忽略Y轴,做平面的判定校验可以用如下代码
//忽略高度Y轴的扇形判定
public static float GetDistance(float x1, float y1, float x2, float y2)
{
return Mathf.Sqrt(GetDistancePower(x1, y1, x2, y2));
}
public static float GetDistancePower(float x1, float y1, float x2, float y2)
{
return Mathf.Pow(x1 - x2, 2) + Mathf.Pow(y1 - y2, 2);
}
public static float GetDistance(Transform from, Transform to)
{
return GetDistance(from.position.x, to.position.x, from.position.z, to.position.z);
}
public static Vector3 GetVetor(Vector3 from, Vector3 to)
{
return new Vector3(to.x - from.x, from.y, to.z - from.z);
}
///
/// 判定攻击目标是否在攻击者扇形攻击范围类
///
/// 攻击者
/// 被击者
/// 扇形半径
/// 扇形角度
///
public static bool IsInSector(Transform source, Transform target, float radius, float angle)
{
float STDistance = GetDistance(source, target);
Vector3 _tVector = GetVetor(source.transform.position, target.transform.position);
Vector3 _sVector = (source.position + (source.rotation * Vector3.forward) * radius);
float targetAngle = Vector3.Angle(_tVector, _sVector);
if (STDistance < radius && targetAngle < angle / 2 && targetAngle > -(angle / 2))
return true;
return false;
}
但是如果是判断Y轴的,就上面的代码就不好用了
以下是原创判断包含xyz三轴代码。原理是用Quaternion.LookRotation获取目标位置,在和当前角度计算出的正面射线位置进行距离判断即可
private bool AimAt(Transform target, Transform self)
{
//获取距离对象的长度
float _Distance = Vector3.Distance(target.position, self.position);
//当前对象直接射线
Quaternion r = self.rotation;
Vector3 f0 = (self.position + (r * Vector3.forward) * _Distance);
Debug.DrawLine(self.position, f0, Color.red);
//与目标对象对齐后的射线
Quaternion r1 = Quaternion.LookRotation(target.position - self.position);//转向的角度
Vector3 f1 = (self.position + (r1 * Vector3.forward) * _Distance);
Debug.DrawLine(self.position, f1, Color.red);
Debug.DrawLine(f0, f1, Color.blue);
//如果基本对齐了就返回true
if (Vector3.Distance(f0, f1) >= 30)
{
return false;
}
return true;
}
其实这个还是有一些计算量的,所以建议不要每一帧都调用,可以若干时间调用一次。