Unity中的旋转

     近期工作中不少功能用到了旋转,抽空整理了一下Unity中的旋转方式,首先要搞清楚的一点就是Inspector面板中的Rotation,在面板上它显示的是一个Vector3类型的参数,而我在代码中transform.rotation点出来的会是一个四元数,也就是面板上和代码中rotation不是同一个东西,其时只需要把Inspector面板的模式改成Debug就会发现,transform.localRoation是一个四元数,我们在inspector的Normal模式下修改的其实是transform.localEulerAngles.

xdedzl

1.基础旋转方式 

//1.直接旋转,下面两个分别改变的是transform.localEulerAngles和transform.eulerAngles
transform.Rotate(Vector3.up * Time.deltaTime * angleSpeed);
transform.Rotate(Vector3.up * Time.deltaTime * angleSpeed, Space.World);

//2.绕自身的某一轴旋转(不仅仅是x,y,z),其中第一个所绕轴实际上是transform.up
transform.Rotate(Vector3.up, Time.deltaTime * angleSpeed);
transform.Rotate(Vector3.up, Time.deltaTime * angleSpeed, Space.World);

//3.绕过场景中某一点的某个轴转动
transform.RotateAround(Vector3.zero, Vector3.up, Time.deltaTime * angleSpeed);

//4.直接赋值位置和方向
transform.SetPositionAndRotation(targetTransform.position, targetTransform.rotation);

2.缓慢旋转到目标方向的三种方式

参数解释  : targetTransform是目标

2.1 利用LookAt控制旋转

     //1.LookAt
     //transform.LookAt(targetTransform);
     //transform.LookAt(targetTransform.position);
     //2.利用LookAt差值平缓旋转
     Vector3 currentTarget = transform.position + transform.forward * 100;
     Vector3 targetDir = targetTransform.position - transform.position;
     Vector3 tempTarget = Vector3.Lerp(currentTarget, targetTransform.position, Time.deltaTime * angleSpeed);
     //transform.LookAt(tempTarget);//一般要把目标y设置为自身高度,否则旋转的方式可能会不是想要的
      transform.LookAt(new Vector3(tempTarget.x, transform.position.y, tempTarget.z));

 2.2 利用Vector3差值改变transform.forward

 Vector3 dir = targetTransform.position - transform.position;
  transform.forward = Vector3.Lerp(transform.forward, dir, Time.deltaTime * angleSpeed);

2.3 创建方向的四元数进行差值 

Vector3 dir = targetTransform.position - transform.position;
Quaternion rotation = Quaternion.LookRotation(dir);
transform.rotation = Quaternion.Lerp(transform.rotation, rotation, Time.deltaTime * angleSpeed);

扫描二维码关注公众号,回复: 3230670 查看本文章

猜你喜欢

转载自blog.csdn.net/xdedzl/article/details/81488894