unity3d 在2D空间中让一个点注视另一个点

最近用unity3d在写一个小功能时遇到的问题,就是在2D空间里,怎么让一个点注视另一个在空间里的点。
效果跟unity在3D空间里提供的一个方法叫 transform.LookAt(target); 类似。

lookat 有个挺不爽的地方,比如我想让一个点以插值移动的方式朝向另一个点,这个插值的角度没法控制,lookat会直接朝向那个点,就没插值的效果了,而且也无法判断出往哪个方向旋转最快。
然后发现了这个方法,贴出来给需要的小伙伴,造福大家 (ง •̀_•́)ง

图示:
这里写图片描述

代码:

public class Test : MonoBehaviour
{
    public Transform target;

    // Use this for initialization
    void Start()
    {
        // 世界坐标系转到本地坐标系
        Vector3 relative = transform.InverseTransformPoint(target.position);
        // 归一化(并不是必须的)
        relative.Normalize();

        // 反正切求弧并转成角度
        float angle = Mathf.Atan2(relative.x, relative.y) * Mathf.Rad2Deg;
        angle = Mathf.Abs(angle);

        // 左右2侧的垂直向量
        Vector3 leftVertical = new Vector3(-1, 0, 0);
        Vector3 rightVertical = new Vector3(1, 0, 0);
        // 跟目标向量做点积
        float leftDot = Vector3.Dot(relative, leftVertical);
        float rightDot = Vector3.Dot(relative, rightVertical);

        // >= 0 说明夹角 <= 90
        if (leftDot >= 0)
        {
            transform.Rotate(0, 0, angle);
        }
        else if (rightDot >= 0)
        {
            transform.Rotate(0, 0, -angle);
        }
        else
        {
            Debug.LogError("dot有问题");
        }
    }
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值