Unity - A计划(永久有效期) 扫二维码继续学习 二维码时效为半小时

(196评价)
价格: 4019.00元
老师,怎么实现游戏体移动的时候旋转呢?
靖宝宝的boy发起了问答2017-09-11
9
回复
765
浏览

老师,我现在有一个sprite,代码中通过改变eulerangle的值来改变方向,transform.up来向前移动,用这种方式来使物体(2D)移动。当我现在正在向前笔直的移动的时候,在我的右前方有一点B,我想缓慢地转向B点,就是一边转向一边移动直至达到B点的那种效果,而不是突然右转指向B点然后笔直的向前移动到B点,请问这种效果怎么实现呢?

条件:可以提前指向B点,就是说,我一边转向一边移动,某一个时刻,我的transform.up正对着B点,然后向前直着移动,这样是可以的。

所有回复
  • siki 2017-09-12

    创建一个空物体,让这个空物体的forward方向跟sprite的up方向保持一致,位置保持一致,然后把sprite放在空物体下面,这样就可以通过空物体控制移动了,然后也可以通过Quaternion.LookRotation( bpos-spritepos )得到目标朝向

    通过Quaternion.Slerp(nowrotation,targetrotation,Time.deltaTime)缓慢的朝向目标点

    • 靖宝宝的boy 2017-09-12

      那么老师,我现在物体对着A点,想让物体对着另一点B,通过插值旋转中的targetritation的值怎么获得呢?

      (1) 回复
    • 靖宝宝的boy 2017-09-12

      老师,现在旋转的实现是没有问题的。物体在一直运动,我转到了一定的角度就不转了,接着往前走就能到达B点,那么问题在于我旋转的终止条件怎么来设定。

      (1) 回复
    • siki 2017-09-13

      回复 @ 靖宝宝的boy: targetritation=Quaternion.LookRotation( bpos-spritepos )

      (1) 回复
    还有-2条回复,点击查看
    你还没有登录,请先登录注册
  • 靖宝宝的boy 2017-09-12

    • siki 2017-09-13

      实现这种弧形轨迹的话,可以使用Slerp来做插值旋转 试下

      (1) 回复
    还有-4条回复,点击查看
    你还没有登录,请先登录注册
  • sdhexu 2017-09-13

    哈哈。我来给你回答一下吧。我刚刚刚做了一个导弹自动跟踪的东东,跟你要的效果一样一样的。

    先上个图吧:


    关键代码给你看看:

            private void Update()  
            {  
                // 为更加逼真,0.5秒前只前进和减速不进行追踪  
                if (m_uptimer < 0.5f)  
                {  
                    m_uptimer += Time.deltaTime;  
                    m_speed -= 2 * Time.deltaTime;  
                    transform.position += transform.forward * m_speed * Time.deltaTime;  
                }  
                else  
                {  
                    // 开始追踪敌人  
                    Vector3 target = (m_Target.position - transform.position).normalized;  
                    float a = Vector3.Angle(transform.forward, target) / m_RotSpeed;  
                    if (a > 0.1f || a < -0.1f)  
                        transform.forward = Vector3.Slerp(transform.forward, target, Time.deltaTime / a).normalized;  
                    else  
                    {  
                        m_speed += 2 * Time.deltaTime;  
                        transform.forward = Vector3.Slerp(transform.forward, target, 1).normalized;  
                    }  
          
                    transform.position += transform.forward * m_speed * Time.deltaTime;  
                }  
                m_currLife += Time.deltaTime;  
                if(m_currLife > m_MaxLife)  
                {  
                    // 超过生命周期爆炸(不同与击中敌人)  
                    Destroy(gameObject);  
                    Destroy(Instantiate(m_Explosion, transform.position, Quaternion.identity), 1.2f);  
                }  
            }  
    
    

     

    还有-4条回复,点击查看
    你还没有登录,请先登录注册
  • 靖宝宝的boy 2018-01-02

    嗯嗯,确实非常棒,谢谢!!

    还有-5条回复,点击查看
    你还没有登录,请先登录注册
发表回复
你还没有登录,请先 登录或 注册!