unity的Transfom杂谈笔记
朝向功能
主要是一个物体朝向另一个物体,这样可以获得该物体的旋转,可以实现你想要的功能。
当移动Cube2时,cube1始终发生转向朝向他
void Update()
{
transform.LookAt(cube2.transform);
}
运用Transfom.LookAt(transfom参数),该函数主要是另一个物体。
获取面板中Transfom.Rotation的x,y,z的值
private float xRotation;
private float yRotation;
private float zRotation;
void Start()
{
xRotation = transform.rotation.eulerAngles.x;
yRotation = transform.rotation.eulerAngles.y;
zRotation = transform.rotation.eulerAngles.z;
Debug.Log(xRotation);
Debug.Log(yRotation);
Debug.Log(zRotation);
}
这里用到transform.rotation.eulerAngles,主要就是获取当前物体的欧拉角
改变面板上面的xyz会有效果
X
x变大,物体就会往下旋转,身体结构来说就是往下趴
Y
Y变大会想物体的右边旋转
Z
Z越大,会正身围绕着正前方逆时针旋转
常见的rotationAPI
transform.rotation = Quaternion.Euler(90f, 0, 0);
这里是直接进行对rotation的x,y,z进行赋值,操作空间还是挺大的。通常是直接固定方向,可以一个物体进行来回移动,直接修改rotation,再让物体向前运动。
transform.Rotate
1.void Rotate(Vector3 eulerAngles, Space relativeTo = Space.Self);
应用一个欧拉角的旋转角度,eulerAngles.z度围绕z轴,eulerAngles.x度围绕x轴,eulerAngles.y度围绕y轴(这样的顺序)。
transform.Rotate(Vector3.up * RotatSpeed * Time.deltaTime, Space.World);
根据一个旋转方向角度进行旋转,后面的Space.World根据世界坐标来旋转。(我设置的RotatSpeed=90)。
效果如下:
Transfom坐标
世界坐标
当我们获取物体的坐标时,总是会写着一行代码
Debug.Log(this.gameObject.transform.position);
可是这里的坐标时物体对应的世界坐标。并不一定是自身面板的坐标。
我先设置它的世界坐标
这是运行结果,返回它的世界坐标。
自身面板的坐标
添加一个空物体,将cube作为空物体的子物体。
此时的cube面板的坐标并不是原来的面板坐标。而是以空物体为原点的坐标。
此时我们再加一句代码
Debug.Log(this.gameObject.transform.position);
Debug.Log(this.gameObject.transform.localPosition);
运行结果发现,第一个还是世界坐标,没有发生变化,第二个输出的就是cube的面板的坐标信息。
LocalPosition的坐标可以看出,物体面板上面的坐标是和父物体的左边有关的。默认物体的父物体是世界,所以原点就是世界坐标的(0,0,0)圆心,当添加父物体后就会发生以父物体为原点。
物体的朝向
我们要移动时通常要控制人物的朝向。
所以有时会用这样的代码
void Update()
{
transform.position = transform.position+ Vector3.right* 5f * Time.deltaTime;
}
看起来一切正常。
我们旋转一下cube
让他变成这样
此时我们再运行一下
此时他还是这样运行,我们想让他根据物体的右方向运行,这明显不是我们想要的结果。
所以就要换脚本
transform.position = transform.position+ transform.right* 5f * Time.deltaTime;
这样就成为我们想要的结果,以物体的右方向运动,而不是以世界坐标的方向运行。