学习笔记,随学习进度实时更新啦
认识脚本
脚本的生命周期
1.Awake()
最早调用,所以一般可以再次实现单例模式
2.OnEnable()
组件激活后调用,在Awake后会调用一次
3.Start()
在Update之前调用一次,在OnEnable之后调用,可以在此设置一些初始值。
关于Awake(),Start(),如果游戏对象有两个脚本,执行顺序未知,其中有一个的Start()方法中的代码是必须先执行的时候,可以将Start()方法中的代码放到Awake()中即可
要知道,脚本并不是一个执行完再执行另一个的,当有多个脚本的时候,会先把每个脚本的Awake()执行完,再执行所有脚本的Start()方法,再执行所有脚本的 Update方法
4.Update()
帧率调用方法,每帧调用一次,每次调用与上次调用的时间间隔不同
5.LateUpdate
在Update调用完一次后,紧跟着调用一次
6.FixedUpdate
固定频率调用方法每次调用与上次调用的时间间隔相同
7.OnDisable
与OnEnable相反,组件未激活时调用
8.OnDestroy()
被销毁后调用一次
脚本的操作
动态修改物体属性
我们要修改物体属性,首先要获取游戏对象本身,游戏对象即我们创建的物体,它们都属于GameObject
如何获取当前游戏对象?
void Start(){
GameObject go = this.gameObject;
Debug.Log(go.name); //打印游戏对象名称
Debug.Log(go.tag); //打印游戏对象的标签
}
我们可以用go等自定义的变量去存储当前GameObject对象,之后使用的时候可以go.操作该对象,实际上我们在当前对象添加脚本后,脚本默认的对象就是this.GameObject本身,所以有以下的简单方法
Debug.Log(gameObject.name); //打印游戏对象名称
Debug.Log(gameObject.tag); //打印游戏对象的标签
Debug.Log(gameObject.layer); //打印游戏对象的图层
如何获取当前对象的激活状态?
假设我们要查看GameObject对象下的Cube对象的激活状态
如图
将脚本添加到GameObject后,声明Cube对象
public GameObject Cube;
此时可发现检查器中发现了一个未指定的Cube对象,我们将其选择为我们创建的对象
按照指示拖拽到目标区域即可方便的实现
此时我们便可以在脚本中方便的通过代码访问Cube对象的属性了
Debug.Log(Cube.name); //打印Cube对象的名称
Debug.Log(Cube.layer); //打印Cube对象的图层
Debug.Log(Cube.activeInHierarchy); //在当前真正的激活状态
Debug.Log(Cube.activeSelf); //当前物体自身激活状态
老版本的Unity是通过Cube.active获取激活状态。新版本的Unity将active分成了两个
其一:.activeInHierarchy
获取物体当前真正的激活状态。举例,如上图我为GameObject物体创建了一个子物体Cube,如果我将GameObject物体设置为未激活状态,而Cube设置为激活状态
实际上我们可以看到Cube是未激活的,activeInHierarchy便是获取当前物体真正的激活状态,如上图即为未激活
其二:.activeSelf
同样如上图所示,我对Cube物体设置的是激活状态,是因为他的父物体GameObject未激活,Cube才未激活,当GameObject激活时,Cube也会默认激活,因此activeSelf便是获取物体本身的激活状态。
获取组件
获取Transform组件
我们知道,每一个物体必然会挂在一个transform组件,如图:
如何获取transform组件呢?Unity为我们提供了一个最简单的方法
Transform trans = this.transform;
可以如上将当前物体 的transform存储到一个变量中,同样可以简单地直接对transform进行使用(默认情况下当前脚本会有一个transform变量,可以直接引用)
Debug.Log(transform);
transform变量代表的是当前游戏对象所挂在的transform组件
Debug.Log(transform.position); //打印transform组件中的位置
Debug.Log(transform.rotation); //打印transform组件中的旋转
Debug.Log(transform.localScale); //打印transform组件中的缩放
打印如图
获取其他组件
除了transform组件,其他组件我应该怎么获取呢?
如图我为GameObject物体新加了一个组件Box Collider,我想要获取这个组件,我的代码应该为:
BoxCollider bc = GetComponent<BoxCollider>();
这是一个范式,我们想获取任意一个组件,都应按照这种格式获取
组件名称 变量名 = GetComponent<组件名称>();
BoxCollider bc = GetComponent<BoxCollider>();
这样就可以获取到当前游戏对象的组件了
获取子物体身上的组件
GetComponentInChildren<CapsuleCollider>(bc); //获取当前物体子物体身上的胶囊组件
GetComponentInChildren<Transform>(bc); //获取当前物体子物体的transform组件
CapsuleCollider cp = GetComponentInChildren<CapsuleCollider>(bc);//获取了当前物体子物体身上的胶囊组件
Debug.Log(cp.height);
如果想获取指定名称子对象的组件,可以通过
.find("名称");
来实现
如
GetComponentInChildren<CapsuleCollider>(gameObject).find("Capsule1111");
即可获取名为Capsule1111的子物体的CapSuleCollider组件
获取父物体身上的组件
GetComponentInparent;
与上文类似,就不赘述了
添加组件
gameObject.AddComponent<组件名称>();
//如下
gameObject.AddComponent<AudioSource>();//可添加一个AudioSourse组件
其他获取物体的方法
方法一:通过物体的名称来获取游戏物体
GameObject test = GameObject.Finde("名称");
Debug.Log(test.name);
方法二:通过游戏标签来过去游戏物体
test = GameObject.FindWithTag("untagged");