笔记12 Unity常用的API
- 组件
- 生命周期里的方法
- Vector3结构体
- Mathf(结构体)与数学相关。它的常用api
- Time(类)。它的常用属性
- GameObject(类)
- transform
组件
生命周期里的方法
构造
//构造
private void Awake()
{
Debug.Log("Awake");
}
// Use this for initialization
void Start () {
Debug.Log("Start");
}
刷新
GPU控制的每帧调用一次的刷新
// Update is called once per frame每帧调用一次
void Update () {
Debug.Log("Update");
}
//Update调用之后,调用一次。
private void LateUpdate()
{
//摄像机跟随
Debug.Log("LaUpdate");
}
CPU控制的固定时间刷新
/*固定时间刷新,一秒调用60次。1秒除以60,约每隔0.02f。
比如可使得下落的物体,在各台电脑上下落的位移一样。*/
private void FixedUpdate()
{
//物理事件。
}
激活
//激活调用
private void OnEnable()
{
Debug.Log("Enable");
}
//非激活调用
private void OnDisable()
{
Debug.Log("Disable");
}
一个旧方法
为了把GUI很平滑的渲染出来
//旧方法。每两帧调用一次。
private void OnGUI()
{
}
销毁
//销毁的时候调用
private void OnDestroy()
{
//释放或者关闭一些变量的
Debug.Log("OnDestroy"); //Debug调试
}
Vector3结构体
创建,得到单位向量、模、模的平方,常用向量简写
void Start () {
Vector3 v = new Vector3(1, 1, 1);
//可以new一个空的,在下面v.x,x.y,v.z赋值
//得到v的单位向量
Debug.Log(v.normalized); //结果:(0.6,0.6,0.6)
//得到v的模
Debug.Log(v.magnitude); //结果:1.73
//得到v的模的平方。可用于比较向量大小
Debug.Log(v.sqrMagnitude);
//常用向量简写
Debug.Log(Vector3.zero); //等于new Vector3(0, 0, 0)
Debug.Log(Vector3.forward); //001 反方向Debug.Log(-Vector3.forward);
Debug.Log(Vector3.up); //010
Debug.Log(Vector3.right); //100 Debug.Log输出
}
向量的点乘Vector3.Angle。公式:a.b = |a||b|cosθ
计算两个向量的夹角
//两个向量的夹角
Debug.Log(Vector3.Angle(Vector3.up, Vector3.forward));
计算两点的距离Vector3.Distance
//计算两点的距离。
//向量是可以乘以变量(数值)的,就是XYZ都乘以标量。计算000与0,0,10的距离。结果:10
Debug.Log(Vector3.Distance(Vector3.zero, Vector3.forward * 10));
插值Vector3.Lerp(做移动)
插值,一个百分比
比如0至10,插值为0.1f,那么插值的结果:0+(10-0)*0.1是1
比如10至20,插值为0.1f,那么插值的结果:10+(10-0)*0.1是11
位移(位移到第一次插值结果的位置)
transform.position = Vector3.Lerp(transform.position, Vector3.forward * 10, 0.1f);
//transform组件的位置position = 起始值(从他自身的位置),终点,插值(0.1)
/*结果:
位移到transform.position +(Vector3.forward * 10 —transform.position)*0.1的位置。
此处,由于其实位置是000,所以位移到了0,0,1*/
减速移动(位移到第二个参数的位置。没必要用)
void Update ()
{
//因为让它动起来,所以写在Update里面。
transform.position = Vector3.Lerp(transform.position, Vector3.forward * 10, 0.1f);
//从transform.position移动到Vector3.forward * 10,减速。
}
匀速运动(没必要用)
transform.position = Vector3.Lerp(transform.position, transform.position+Vector3.forward * 10, 0.01f);
/*因为参数二里面包含了变化的参数一,所以二者的差永远是相同的,
那么每次插值结果便是相同的,所以形成匀速运动,且不会停止。
因为是运动,需要多次执行代码,所以是写在Update里的。*/
调试方法
输出:Debug.Log和 print
print是MonoBehaviour的成员方法,所以只有当类继承于 MonoBehaviour时,才可以用。
而Debug.Log是使用的Debug的静态方法,所以没有上面那样的限制。
print其实是Debug的封装,一种简单写法。
位置:Start
print(111); //输出。随便什么类型。
画线Debug.DrawLine(特点:移动物体,终点固定,线的长度变化)
位置:Update
//画线。例:往天上10米的位置画线。(起始位置(自身位置),终点(0,10,0),标记(红色))
//不标记的话,可以不写标记那个参数。特点:移动物体,终点固定,线的长度变化
Debug.DrawLine(transform.position, Vector3.up * 10, Color.red);
画射线Debug.DrawRay(特点:移动物体,线的长度不变,终点不固定。)
位置:Update
//画射线(起始位置(自身位置),终点(自身位置基础上的0,10,0),标记(蓝色))。
//特点:移动物体,线的长度不变,终点不固定。
Debug.DrawRay(transform.position, Vector3.up * 10, Color.blue);
四元数(结构体)
旋转Euler
位置:Update
//它有个类方法叫Euler欧拉,欧拉转成了四元数。
//括号里可以填Vector3的结构体,代表一个角度。也可以直接写xyz。
Quaternion q = Quaternion.Euler(0, 0, 90); //让z轴旋转90度。
空旋转identity(000的意思)
位置:Update
//空旋转(000的意思)。
//因为我们可萌不知道给多少度是空旋转,所以给了一个变量identity,代表这是一个空旋转。
q = Quaternion.identity;
朝向一个向量(不管怎么移动,依旧朝向那个向量)
//首先拿到Transform组件(要面向的圆柱),此处是Cylinider的Transform。
public Transform Cylinider;
void Update ()
{
//朝向一个向量 (不管怎么移动,依旧朝向那个向量)
//拿到面向Cylinider的一个向量。要面向的圆柱的位置-我的位置
Vector3 dir = Cylinider.position - transform.position;
//朝向dir向量
q = Quaternion.LookRotation(dir);
//赋值回去。rotation旋转
transform.rotation = q;
}
四元数也可以有插值
transform.retation在unity里是欧拉角,在代码里就是四元数。
eulerAngles欧拉角,transform.eulerAngles就是它真实的欧拉角度了。
transform.rotation用四元数表示角度,transform.eulerAngles用欧拉角表示角度,二者都代表了角度。
从当前的角度,到这样的角度(Y轴转90度),插值是0.1。
返回值(插值后的四元数)赋给自己。结果:一直转。
transform.rotation = Quaternion.Lerp(transform.rotation, Quaternion.Euler(0, transform.eulerAngles.y + 90, 0),0.1f);
Mathf(结构体)与数学相关。它的常用api
绝对值Mathf.Abs(简单又常用)
//绝对值
int n = Mathf.Abs(-1);
插值Mathf.Lerp
//插值。对一个轴进行插值,Vactor3是对三个轴进行插值
Mathf.Lerp(0, 10, 0.1f);
限制数
法一Mathf.Clamp:三个参数
此处,如果n是0到5之间的数,那么就是本值。如果n大于5,则n会变成5。如果n小于0,则会变成0。
可用于限定年龄。
//限制数。参数1:要限制的数(输入值)。参数2:最小值。参数3:最大值。
n = Mathf.Clamp(n, 0, 5);
法二Mathf.Clamp01:一个参数
//限制数。返回值必须是float。就相当于上面n = Mathf.Clamp(n, 0, 1);所以一般用上面的方法
float f = Mathf.Clamp01(n);
计算三角函数
Mathf.Sin();
Time(类)。它的常用属性
游戏从开始到现在所运行的总时间Time.time
位置:start
可用于提醒,保存进度
//游戏从开始到现在所运行的总时间。time是静态的,因为直接用类名Time调用的。
float t = Time.time;
从上一帧到这一帧所用的时间Time.deltaTime,及移动
void Update () {
//从上一帧到这一帧所用的时间。
float t = Time.deltaTime;
/*用於单位的转化。
例如:移动。从当前位置往前移动10米。
由于它默认的是米/帧,不是米/秒。为了每台设备运行一致,所以将单位统一成秒。
所有的数值都*Time.deltaTime*/
Vector3 move = transform.position + Vector3.forward * 10;
}
固定时间调用一次FixedUpdate,可修改
//固定时间调用一次,默认0.02秒调用一次。可以修改,但一般不要修改
private void FixedUpdate()
{
}
它是可以修改的,但一般不要修改。例如2d游戏,要求不高时,可用。
void Start ()
{
/*修改FixedUpdate调用时间。
FixedUpdate默认也是0.02秒。此时改成了1,则上面的方法是1秒调用一次。*/
Time.fixedDeltaTime = 1f;
}
时间缩放Time.timeScale
//timeScale是时间缩放,默认值是1。它影响的只是Update和LateUpdate。一般不会修改
Time.timeScale = 1;
GameObject(类)
unity里的物体,在c#里,都叫GameObject类。
我们写的代码是在test这个组件里面写的,Transform也是一个脚本,只不过它是系统写好的,挂在那的。对于test这个脚本来说,我们如何拿到它所挂载的物体?直接调用GameObject即可。
拿到当前脚本所挂载的物体
//拿到当前脚本所挂载的物体。直接调用GameObject即可。go就是当前空的游戏物体。
GameObject go = gameObject;
便捷的拿到Transform组件
每个物体都有Transform组件
//便捷的拿到Transform组件
Transform trans = go.transform;
它俩之间的关系:通过物体拿到组件,有了组件可以得到它所挂载的物体,有了物体,又可以得到它的组件……
可以写一溜,然后调用里面的方法。gameObject.transform.gameObject.transform.方法
很好用,所以给了上面的transform属性,直接go.transform即可。其他属性就不能这样拿了,比如test也是一个组件,但不能go.test。
获取物体的激活状态
//获取物体的激活状态
Debug.Log(go.activeSelf); //true激活
更改物体的激活状态
//更改物体的激活状态。用方法
go.SetActive(false); //改成false非激活状态
更改组件的激活状态
//更改组件的激活状态。但是transform不行。用属性
//enabled = false;
更改游戏物体的名称
//更改游戏物体的名称
Debug.Log(go.name);
输出标签
//输出标签
Debug.Log(go.tag);
打印层
//打印层。layer是int类型,结果就是名称前面的数。
Debug.Log(go.layer);
拿到组件(利用泛型)
//拿到组件。利用泛型
//比如拿到AudoSource组件
AudioSource plear = go.GetComponent<AudioSource>();
//比如拿到teste组件
test test = go.GetComponent<test>();
拿到Cube物体
方法一:写一个变量GameObject,并把它设置为public
//拿到Cube物体
public GameObject cube ;
方法二:通过大名去找Find
//拿到Cube物体,通过大名去找,效率低,少用。
GameObject cube = GameObject.Find("Cube");
方法三:通过tag值(标签)去找
拿到一个物体
//拿到一个物体。比如上面的Cube的标签是Player,通过标签,拿到Cube。
cube = GameObject.FindWithTag("Player");
拿到同标签的一组物体
/*它的返回值是一个数组。它会将所有标签为Player的物体拿到,并放到这个数组里。
然后就可以对他们进行统一的操作了。*/
GameObject[] cubes = GameObject.FindGameObjectsWithTag("Player");
transform
功能一:位置、旋转、缩放
拿到它的位置
当前物体的世界座标点
//拿到当前物体的世界座标点
Debug.Log(transform.position);
当前物体的本地座标点(相对于父物体的座标)
//当前物体的本地座标点。相对于父物体的座标
Debug.Log(transform.localPosition);
欧拉角
世界欧拉角
//世界欧拉角。旋转父物体,子物体会以父物体为中心点一起旋转。
Debug.Log(transform.eulerAngles);
本地欧拉角
//本地欧拉角。相对于父物体的角度
Debug.Log(transform.localEulerAngles);
本地缩放(缩放仅此一种)
//本地缩放。即缩放父物体,子物体一起缩放。所以相对于父物体来说是没缩放的。
Debug.Log(transform.localScale);
四元数
世界四元数
//世界四元数。unity里的rotation是指欧拉角,此处是指四元数。
Debug.Log(transform.rotation);
本地四元数
//本地四元数
Debug.Log(transform.localRotation);
获取当前物体的前方(z轴)、上方、右方的单位向量
//当前物体的前方向量(z轴)
Debug.Log(transform.forward);
//当前物体的上方向量
Debug.Log(transform.up);
//当前物体的右方向量
Debug.Log(transform.right);
移动transform.Translate
位置:Update
//移动。方向*速度*Time.deltaTime
//方向常用单位向量,例如此处为transform.up
//*Time.deltaTime是为了将速度的单位由帧转化成秒。此处表示向上,10米/秒。
transform.Translate(transform.up * 10 * Time.deltaTime);
旋转
自转transform.Rotate
//旋转。transform.up表示绕着Y轴。此处表示绕着Y轴旋转,20度/秒。
transform.Rotate(transform.up * 20 * Time.deltaTime);
公转transform.RotateAround
//绕着某个点或物体旋转。此时表示绕着世界座标的000点的Y轴旋转,30度/秒。
transform.RotateAround(Vector3.zero, Vector3.up, 30 * Time.deltaTime);
看向某点transform.LookAt
//看向某点。之前学的是朝向某个向量。
transform.LookAt(Vector3.zero);
功能二:保存父子物体的功能
拿到父物体parent
parent代表我的父物体的transform组件。因为他们真正有联系的是transform组件。
为了方便,有几个属性,只要拿到组件,就可以拿到游戏物体的属性。主要就是name和tag值。
//打印出了父物体的名称。
//Debug.Log(transform.parent.name);
设置父子物体transform.SetParent
可用于做物品栏。当把物品放在物品栏时,物品栏就变成了物品的父物体。
//设置父子物体。运行的时候是父子关系,不运行的话,还是原样。
transform.SetParent(GameObject.Find("Sphere").transform);
通过索引,得到子物体transform.GetChild
//通过索引,得到子物体。索引0,表示第1个子物体。
Debug.Log(transform.GetChild(1));
查看子物体个数transform.childCount
//查看子物体个数
Debug.Log(transform.childCount);
找到根部的父物体transform.root
//找到根部的父物体
Debug.Log(transform.root);
寻找子物体transform.Find
//寻找子物体。和gameObject.Find很像,都是用名称查找。gameObject.Find返回GameObject
//此处的返回值是Transform,找到子物体名字叫Cylinder的输出出来。
//transform.Find效率高,因为它只在它的子物体里查找。能找到非激活的子物体。
Transform trans = transform.Find("Cylinder");
Debug.Log(trans.name);