老师,我现在有一个sprite,代码中通过改变eulerangle的值来改变方向,transform.up来向前移动,用这种方式来使物体(2D)移动。当我现在正在向前笔直的移动的时候,在我的右前方有一点B,我想缓慢地转向B点,就是一边转向一边移动直至达到B点的那种效果,而不是突然右转指向B点然后笔直的向前移动到B点,请问这种效果怎么实现呢?
条件:可以提前指向B点,就是说,我一边转向一边移动,某一个时刻,我的transform.up正对着B点,然后向前直着移动,这样是可以的。
创建一个空物体,让这个空物体的forward方向跟sprite的up方向保持一致,位置保持一致,然后把sprite放在空物体下面,这样就可以通过空物体控制移动了,然后也可以通过Quaternion.LookRotation( bpos-spritepos )得到目标朝向
通过Quaternion.Slerp(nowrotation,targetrotation,Time.deltaTime)缓慢的朝向目标点
哈哈。我来给你回答一下吧。我刚刚刚做了一个导弹自动跟踪的东东,跟你要的效果一样一样的。
先上个图吧:
关键代码给你看看:
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);
}
}