A对象GameObject是否面向B对象的判断

做战舰转向

如果转向的速度是缓慢的。可以使用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;
    }

其实这个还是有一些计算量的,所以建议不要每一帧都调用,可以若干时间调用一次。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值