Unity 控制物体旋转、朝向的一些方法
1,transform. Lookat( )
transform.Lookat(target.position);
立即看向target的位置, 很生硬.
2,( )
transform.rotation = Quaternion.LookRotation(target.position - self.position);
也是,立即看向target的位置。
3,( )
Quaternion q = Quaternion.LookRotation(target.position - self.position);
Quaternion.RotateTowards(self.rotation, q, turnSpeed * Time.deltaTime);
匀速转向target的位置。(匀速转过去, 虽然不那么生硬了, 但是还不够自然)
4,( )
Quaternion q = Quaternion.LookRotation(target.position - self.position);
Quaternion.Slerp(self.rotation, q, turnSpeed * Time.deltaTime);
非匀速转向target的位置。(人物转向看起来比较合理, 比较自然了)
Lerp()方法是平分长度, Slerp()方法是平分弧度
5, ( )
transform.rotate(Vector3.up, Space.Self);
地球自转。
6,( )
transform.rotateAround(sun.position, Vector3.up, turnSpeed * Time.deltaTime);
绕太阳公转。
7, 四元数*向量
将 饶Z轴 旋转angle度
Vector3 dir = Quaternion.Euler(new Vector3(0, 0, angle)) * Vector3.right;
以下是DOTween的方法
1, ()
transform.DORotate(new Vector3(0, 60, 0), 0.3f);
0.3秒转到(0, 60, 0); Rotation
DOTween的, 注意他的参数是个三元数, 要是想与另一个物体的朝向一致, 就:
transform.DORotate(other.transform.eulerAngles, 0.3f);
2, ()
transform.DOLookAt(other.transform, 0.3f)
还是DOTween的, 和差不多, 设置个时间, 能达到lerp的效果, 还能在后面.SetEase();
加一些运动曲线
综合例子:
项目需求: 玩家尽量看向敌人的方向(远离敌人移动时也看向敌人), WASD控制移动和转向
public class PlayerControl : MonoBehaviour
{
//规定以为正方向, 而不是世界坐标的正方向
public Transform towards;
public float moveSpeed;
public float turnSpeed;
private void Update()
{
Move();
}
private void Move()
{
float v = Input.GetAxis("Vertical");
float h = Input.GetAxis("Horizontal");
//移动
transform.Translate(new Vector3(h, 0, v) * Time.deltaTime * moveSpeed, towards);//正方向为
//玩家操作转向
if (v != 0 || h != 0)
{
Vector3 tempTowards;
if (v < 0)
{
//abs是为了禁止玩家人物朝后
//人物 倒退时和前进时的左右转向是相反的,所以是-h
tempTowards = towards.forward * Mathf.Abs(v) + towards.right * -h;
}
else
{
tempTowards = towards.forward * v + towards.right * h;
}
Quaternion q = Quaternion.LookRotation(tempTowards);
//平滑转向
transform.rotation = Quaternion.Slerp(transform.rotation, q, turnSpeed * Time.deltaTime);
}
//玩家没操作的时候, 就看向正方向
else
{
Quaternion q = Quaternion.LookRotation(towards.forward);
transform.rotation = Quaternion.Slerp(transform.rotation, q, turnSpeed * Time.deltaTime);
}
}
}