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