【Unity学习笔记】了解脚本

学习笔记,随学习进度实时更新啦

脚本的生命周期

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");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值