1. 物体的旋转
rotation transform.rotation(w,x,y,z); 动态成员变量
今天想要给gameobject.transform.rotation赋值,突然发现,ratation是一个四元数(Quaternion),若直接写赋值语句“.transform.rotation =new Vector3(0,0,0)”的话,会报错“Cannot implicitly convert type ‘UnityEngine.Vector3’ to ‘UnityEngine.Quaternion’”,也就是说“不能将一个三元的vector3赋值给一个四元数,类型不匹配”。
于是查了一下,发现虽然在Transform面板上的Rotation只显示了x,y,z三元,且数值就对应与世界的直角坐标系下物体绕x,y,z轴旋转的角度,但脚本里rotation是包含w,x,y,z四元的,物体的角度由这四元共同决定,脚本里rotation的x,y,z与面板上那个并不是一回事,并不相同。那么如何方便地进行两种类型数的转换(而不是通过换算直接定义四元数每一元的值)呢?
* 四元数转欧拉角
//在start方法中,将物体初始时候的旋转角度rotation显示在屏幕上。直接Debug.Log(transform.rotation)的话,打印的是一个四元数rotation,
//要想看到沿世界xyz轴旋转的角度的那个三维数,必须要将transform.rotation转换为欧拉角。
void Start () {
Vector3 eulerRotation= new Vector3();
eulerRotation=transform.rotation.eulerAngles;
Debug.Log(eulerRotation);
}
- 欧拉角转四元数
//设定欧拉角为(100,0,0),就是Transform面板上看到的,我们通常理解的旋转值,
//但是脚本设定rotation的时候,需要将(100,0,0)转换为四元数类型,并赋予transform.rotation。
void Start () {
transform.rotation=Quaternion.Euler(new Vector3(100, 0, 0));
}
Rotate() transform.Rotate(x,y,z,Space relativeTo); 动态成员方法
Rotate()是一个public void方法,非static方法,因而由Transform(类)的实例transform(实例)来调用。如下代码即表示(一次动作)沿自身x轴旋转2°。(其中this表示本脚本,而非其他脚本对应的gamobject。)
(this.)transform.Rotate (2,0,0);
2. 物体的位移
position transform.position(x,y,z); 动态成员变量
这个比较好理解,对应的就是世界(Slef.Word)三维直角坐标系下的位置。
下面以一段代码为例:
if(Input.GetMouseButtonUp(0)){ //鼠标左键事件
Debug.Log("Pressed left click.");
transform.position = new Vector3(transform.position.x-1, transform.position.y, transform.position.z);
}
表示当