Unity3D追踪

首先阅读这篇的小伙伴提供一个建议,由于Unity新收费方案的事件导致社区失信,在未来很多市面未来几年内Unity的市场肯定是会逐渐变小的,如果你学习Unity是以面向就业的伙伴,如果你的学习的程度不深入,才接触,建议转行到Godot、Unreal或者Cocos,如果你已经有一定程度的学习了,就一直学下去直到找到工作,然后在工作之余学习其它的引擎知识以便随时应对转行(开发者不要和游戏引擎强绑定)。如果是业余爱好,作品不投稿,只是自己玩玩快乐的,那么你可以继续学习Unity。

在很早以前我发过一篇关于Unity2D追踪子弹的博文,但是在后来而定一次实践比赛后我发现用那种方法替换到3D空间上是不可行的方式。因为使用角度差判定来在控制物体角度加减做旋转时,由于物体的在三维空间上要朝向位置需一个高低角和左右角,如果敌人的朝向位置是前方区域,那么物体做角度运算时是规整的,假设如果一但发生的了敌人位于坐标系的后方,那么在子弹左右旋转到朝向敌人后,你们思考一下高低角会如何变化?如果不限制子弹的最高的Y轴角度不超过90,那么会导致子弹发生翻转,因为如果如果Y方向轴旋转超过了90度,那么原本已经左右旋转的方向已经对准了敌人,但是这样一翻转就会导致左右一被翻转,原本正确的左右朝向被错误翻转了(因为那篇博文子弹和物体都是相对于世界坐标系做的计算,因为2D上不存在这种翻转情况,但是3D会,所以会导致这种错误)。

解决办法是什么呢?第一种就是限制它的选择角度,在Y轴的朝向加减运算不能超过90,或者是子弹翻转后重新用另一套比较规则,但是我实际测试了一下这样会使得追踪效果非常差,而且复杂不好理解,而且旋转的角速度在只有一个方位有(上下或左右)差的时候和两边都有的时候不一样(一个角加减或者两个角度加减)。我们常常会使用LookAt()来实现物体看向某个物体,但是LookAt是瞬时的方法,我们也许可以试一试尝试寻找到一个方法实现让这个过程缓慢进行?确实,Unity中已经为我们提供了这套方法。

Quaternion.Lerp(Quaternion a,Quaternion b,float t),该方法的效果t是根据在四元素AB之间线性差值,当t从0到1时,返回的四元素也会由A逐渐过渡到B,通过不断改变增加t的值,达到一个类似逐渐LookAt的效果。

先放出代码:

    public void FixedUpdate()
    {
        //把目标物体的位置减去当前物体的位置,得到方向向量
        Vector3 Position_Diff = Object.transform.position - transform.position;
        //计算目标方向向量和物体运动方向的角度差
        float Angle_Diff = Vector3.Angle(Position_Diff, transform.forward);
        //得到需要看向目标方向的四元素
        Quaternion Direction = Quaternion.LookRotation(Position_Diff);

        //控制它的角速度,使得角速度始终会保持恒定
        if (Angle_Diff > Rotato * Time.fixedDeltaTime)
        {
            //计算一个相对运动时间
            float Rotato_time = Angle_Diff / Rotato;
            //根据以上得到的结果来调整物体得到旋转
            transform.rotation = Quaternion.Lerp(transform.rotation, Direction, Time.fixedDeltaTime / Rotato_time);
        }
    }

Object是目标物体,Rotato是角速度,我们利用Quaternion.LookRotation()计算出目标方向向量的四元素,由于子弹物体和目标物体之间的角度会随时发生变化,因此,如果你单纯想做给t做加减运算时不可能达到匀速控制的效果,想要匀速控制,目标和物体间的角度除以角速度,就是需要转到目标方向的时间,角度变小,那么需要的时间变小,反之变大,而系统中执行一次的物理帧更新的时间是固定的0.02s(FixedUpdate),物理帧时间和需要转到的时间比值作为t值,就能解决这个问题,比如物体需要转90度才能到目标方向,以角速度30每帧,计算需要3帧,然后1/3帧差值比对后就是差60度转到,下一帧计算就变为需要2帧,1/2插值后到目标方向只差30度了,这样物体的旋转无论何时何地都是匀速(你不想要匀速还可以修改做一些代码控制角速度变化,结合这种方式还非常可控)

最后看看效果图:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值