1,自身坐标系和世界坐标系
场景中的物体有两个坐标系,一个是自身坐标系,也叫本地坐标系,另外一个是世界坐标系
比如说我们在场景中创建一个cube,把它的参数reset。在Scene窗口那里
红色框框那里就可以修改物体所在的坐标系
Global就是世界坐标系,Local就是自身坐标系,我们当前选择的是自身坐标系,我们切换世界坐标系看看,发现cube的坐标轴没有任何变化。但是我们回到自身坐标系,我们将cube的x轴的旋转值设置成90,然后再切换世界坐标系就会发现,两个坐标系的坐标轴不一样。
这是因为世界坐标系不会变,x轴指哪就一直指哪,但是自身坐标系不一样,自身坐标系会随着自身的旋转而改变坐标系。
2,Transform.Translate
作用:将物体沿某一方向移动
演示
在场景中添加一个cube,然后创建一个C#脚本,将这个脚本拖给Main Camera,然后在脚本里添加下面代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class NewBehaviourScript : MonoBehaviour
{public GameObject cube;private void Update(){cube.transform.Translate(new Vector3(0,1,0)); }
}
意思就是将这个cube沿着自身坐标系的y轴方向移动
3,Unity中的旋转和方向
官方手册:Rotation and orientation in Unity – Unity 手册
简单说一下就是unity中使用欧拉角和四元数来表示旋转和方向,其实大部分三维软件包括ue也用的这个。
简而言之,欧拉角就是比较直观的,属性面板那个的坐标下的rotation的三个轴就是欧拉角,不过欧拉角会出现万向节锁定的问题,所以内部用四元数来表示旋转和方向。
也就是说外面使用的是欧拉角,便于用户操作,内部使用的四元数,四元数稳定且高效,不会出现万向节锁定的问题。
我们在脚本中打印transform下的rotation发现就是一个四元数,这和面板上的三个轴不一样,面板上使用的就是欧拉角,内部使用的是四元数
4,欧拉角和四元数的转换
- 要将欧拉角转换为四元数,可以使用Quaternion.Euler函数。
- 要将四元数转换为欧拉角,可以使用该Quaternion.eulerAngles函数。
5,Mathf.SmoothDamp
SmoothDamp(平滑阻尼)函数用于平滑缓冲移动,多用于摄像头移动
如果作用在移动中上,表现为慢慢减速到目标位置,类似这个函数还有vector3.Lerp插值函数,不过Lerp的粗暴的插值,而SmoothDamp则更smooth,一般用于摄像头移动
函数原型
public static float SmoothDamp(float current, float target, ref float currentVelocity, float smoothTime, float maxSpeed);
current:需要改变的参数的当前值
target:目标值
currentVelocity:函数所作用目标移动的最大速度,这个所谓的速度,表征的是该物体每秒移动Unity内多少个单位。需要注意的是:首先在传参时记得加上ref关键字,因为SmoothDamp的内部会更新这个值并且传递出来,其次,这个传入的参数的生命周期需要比SmoothDamp长,因为SmoothDamp内部会根据上一次计算得到的速度,去更新下一次的位置,简单的方法就是把这个传入的参数设为全局变量。
smoothTime:平滑的时间
maxSpeed:最大速度(可不传)
6,Vector3.Lerp
lerp线性插值,和smoothDamp类似
函数原型
a:插值的起始值
b:插值的结束值
t:插值距离,范围是[0,1]
比如t为0.5的话,那么返回的就是a到b的中间值,t为0.3的话,返回的就是a到b大小的30%的值
t为0的话返回就是a,t为1的话返回就是b
t才是决定返回位置的关键参数