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;
}
}
}