1.1物體的旋轉
1.1.1對象的旋轉方式
(1)transform.Rotate
應用一個歐拉角的旋轉角度,eulerAngles.z度圍繞z軸,eulerAngles.x度圍繞x軸,eulerAngles.y度圍繞y軸。
transform.Rotate(Vector3.right*Time.deltaTime);//默認繞自身坐標軸轉transform.Rotate(Vector3.up*Time.deltaTime,Space.World);//繞世界坐標軸
transform.Rotate(Time.deltaTime, 0, 0);//圍繞x軸每秒1度慢慢的旋轉物體
transform.Rotate(Vector3.right,Time.deltaTime);//圍繞x軸每秒1度,慢慢的旋轉物體
(2)Transform.rotation
在世界空間坐標物體變換的旋轉角度作為Quaternion儲存。
Quaternion.identity就是指Quaternion(0,0,0,0),就是每旋轉前的初始角度,是一個確切的值,而transform.rotation是指本物體的角度,值是不確定的,比如可以這么設置transform.rotation = Quaternion.identity;
一個是值類型,一個是屬性變量。
float tiltAroundZ =Input.GetAxis("Horizontal") * tiltAngle;float tiltAroundX =Input.GetAxis("Vertical") * tiltAngle;Quaternion target =Quaternion.Euler(tiltAroundX, 0, tiltAroundZ);
//通過一定的時間,從自身角度轉向target目標角度。
transform.rotation =Quaternion.Slerp(transform.rotation, target, Time.deltaTime * smooth);
(3)transform.localEulerAngles
旋轉作為歐拉角度,相對于父級的變換旋轉角度。
rotationY += Input.GetAxis("Mouse Y") * sensitivityY;
//經過測試,如果這里沒用+=那么會轉不動
rotationY = Mathf.Clamp (rotationY, minimumY, maximumY);
//上面的Clamp是為了顯示rotationY的旋轉范圍
transform.localEulerAngles = new Vector3(-rotationY, transform.localEulerAngles.y, 0);
(4)transfomr.eulerAngles
transform.eulerAngles = newVector3(x, y,z);
x、y、z角代表繞z軸旋轉z度,繞x軸旋轉x度,繞y軸旋轉y度。不要分別設置歐拉角其中一個軸(例如:eulerAngles.x = 10;),因為這將導致偏移和不希望的旋轉。當設置它們一個新的值時,要同時設置全部,如上所示。
1.1.2旋轉示例
(1)鼠標拖拽示例
public class SpinWithMouse : MonoBehaviour
{
public float speed = 0.3f;
private Vector3 mousePos;
//使用OnMouseDown方法時,需要在被拖拽物體身上掛上碰撞體
IEnumerator OnMouseDown()
{
//記錄鼠標點擊時的位置
mousePos = Input.mousePosition;
while (Input.GetMouseButton(0))
{
//鼠標拖拽后的位置
Vector3 offset = mousePos - Input.mousePosition;
float x = Input.mousePosition.x - mousePos.x;
float y = Input.mousePosition.y - mousePos.y;
x = Mathf.Abs(x);
y = Mathf.Abs(y);
//當x方向移動量比y方向多時只執行旋轉x軸
if (x > y)
{
transform.Rotate(Vector3.up * offset.x * speed, Space.World);
}
//當y方向移動量比x方向多時只執行旋轉y軸
if (y > x)
{
transform.Rotate(Vector3.forward * offset.y* speed, Space.Self);
}
//重新獲取鼠標坐標軸
mousePos = Input.mousePosition;
yield return null;
}
}
}