Unity实现缓慢的LookAt(缓慢旋转对着⽬标)
写在前⾯:透明硬纱
游戏中,经常遇到的情况是,需要⾓⾊对着敌⼈(或者⼀个指定⽅向),或者敌⼈对着⾓⾊。如果直接⽤LookAt() 去实现,那么⾮常⽣硬(⽴即就转过去对着了),如果是操作⾓⾊的话,也没有⼿感、所以需要写⼀个算法,来解决这个问题。
实现思路:
实现的办法有很多种,这⾥我⽤的是这种办法:
1,记录转⾝前的⾓度。
艾薇儿complicated2,获得准备⾯向的⾓度,(就是LookAt() 之后的那个⾓度)。
3,计算转⾝前的⾓度,和即将⾯对的⾓度的差,也就是转⾝转了多少度。
4,根据要转⾝的⾓度,计算出lerp速度(这样可以保证,转的⾓度⼤,转的时间就长。也就是⾓速度)
5,在update⾥,利⽤ Quaternion.Lerp() 实现转动。
以下是伪代码:
注意,由于全部粘贴出来会⽐较长,只能粘伪代码,⼤家整理⼀下放到⾃⼰的逻辑⾥就⾏了。
rizzo// 这⾥是类变量 -------------------
// 记录转⾝前的⾓度
private Quaternion raw_rotation;
// 准备⾯向的⾓度
private Quaternion lookat_rotation;
// 转⾝速度(每秒能转多少度)assurance
private float per_cond_rotate = 1080.0f;
// 旋转⾓度越⼤, lerp变化速度就应该越慢
float lerp_speed = 0.0f;
/
/ lerp的动态参数
float lerp_tm = 0.0f;
// --------------------------------
// 旋转之前的初始化
void Init_Rotate(){
// 记录转⾝前的⾓度
raw_rotation = ation;
// 记录⽬标⾓度
m_trans.LookAt(move_location_pos);
lookat_rotation = ation;
// 还原当前⾓度
ation = raw_rotation;
// 计算旋转⾓度
float rotate_angle = Quaternion.Angle(raw_rotation, lookat_rotation);
高考语文卷// 获得lerp速度
lerp_speed = per_cond_rotate / rotate_angle;
Debug.Log("Angle:" + rotate_angle.ToString() + " speed:"+lerp_speed.ToString()); lerp_tm = 0.0f;
}
sote// 旋转逻辑, 在update中调⽤
void Rotate_Func(){
lerp_tm += Time.deltaTime * lerp_speed;prehistorical
nickvujicic>neverthelessation = Quaternion.Lerp(raw_rotation, lookat_rotation, lerp_tm);
企业ceo培训
if (lerp_tm >= 1) {
ation = lookat_rotation;
// 此时, 转⾝完毕, 已经对着⽬标物体
}
}