方法内部的变量在其他方法内无法使用
return 返回的变量名称;
方法内部的变量在其他方法内无法使用
return 返回的变量名称;
方法中参数的作用
有可变参数,和不可变的参数
可变参数就是动态的
不可变参数就是静态的
使用带有参数的方法可以有效地提高代码复用性,
而且可以传入不同的参数,也就是不同的属性,就可以调用不同属性的方法,挺好使
第一种:定义一个游戏物体、定义一个组件。若定义一个组件,则队形物体需要有该组件
第四种:根据标签
GO 变量名=GO.FindWithTag("标签名");
调用物体本身的组件:GetComponent<组件名>();
调用其他物体的组件:先定义一个GameObject类,再在监视器把其他物体拖拽过来,即可用其他物体.GC<>();方法调用
transform指当前游戏物体
取反:!,针对bool
!ture是false
监视器中可看到的变量的值若与脚本不同,以监视器定义的为准
GameObject是一个定义游戏物体的类,可以直接定义游戏物体
using是命名空间,命名空间下包含类
可通过namespace+命名,来定义一个命名空间
定义了命名空间后,就可以在其他类中调用这个命名空间下的类了。
区别之前在其他类中调用这个类下的方法,是用public+方法实现。
反复看
输出方式:
1、print
2、
获取GameObject的方式:
1,拖拽获取
先在字段中定义(定义成public),然后进行拖拽
字段中定义的是什么类型,那么在将GameObject拖拽之后,就会自动去查找该GameObject中的这个类型的组件进行获取
如果这个GameObject中没有这个类型的组件,那么自然在Unity中是无法拖拽过去的
2,通过transform.Find(该方法只能获取子物体)
transform.Find("GameObject (1)/GameObject")
Find函数的参数是字符串,在字符串中输入子物体的名字(路径)即可查找。如果路径不存在,会返回Null值
3,GameObject.Find("Main Camera")
会返回第一个以这个名字命名的游戏物体
但是这个方法不推荐使用,因为它需要在整个场景,在全局进行遍历、查找,因此而耗费性能
4,根据标签进行查找
GameObject.FindWithTag("Player")
通过函数参数的标签名即可查找到GameObject
在代码中禁用组件(只有部分组件能够禁用,会在Inspector界面有带打勾的选项,例如Rigidbody组件就没有办法禁用):
同样的,先通过代码进行组件的获取;
然后通过以下代码可以禁用组件:
组件名.enabled = false
激活同理
当然,禁用了之后,这个组件里的方法仍然可以调用,无论是内置方法还是自定义的方法
调用组件的内部属性:
组件名.属性
访问自身组件:
Transform t = GetComponent<Transform>();
实际上Transform组件是无需通过这种方式获取的,因为它是一个内置的自带的组件,这里只是举个例子
也可以通过这种方式获取多个组件
Collider[] colliders = GetComponents<Collider>();
再进行遍历:
foreach (Collider n in colliders){
}
如果只想得到多个组件中的某一个可以GetComponent<BoxCollider>()
GetComponent方法无论该组件有没有被禁用都是可以获得这个组件的
如果要获取子物体的组件,可以GetComponentInChildren<Transform>()只会返回第一个得到的组件
如果要获取别的GameObject的组件,需要先定义字段,然后通过拖拽赋值,再在代码中通过
类名.GetComponent<组件名>()
进行获取
用foreach语句遍历数组:
foreach(类型名 t in 数组名){
}
t就代表数组里的每一个元素
可以通过以下语句获取子物体:
Transform[] children = transform.GetComponentsInChildren<Transform>();
注意这里同样包含了当前游戏物体
如果要判断是不是当前游戏物体,可以通过以下语句实现:
(省略for循环)
children[i] == transform
可以通过以下语句进行GameObject的销毁(GameObject类的自带方法)
GameObject.Destroy()
dowhile循环:
do{
}
while();
这种循环类型是先do,所以至少会循环一次
if适用于情况少一点时
switch语法:
switch (参数){
case 条件1:
break;
case 条件2:
break;
default:
break;
}
其中default语句可添可不添
且break是一定要的
如果n个case语句挨着,比如:
case 条件1:
case 条件2:
break;
则意思是,如果满足条件1或者条件2(或者更多)时,会执行下面的语句
switch语句的局限:switch语句只能判断是不是,不能够像if语句一样灵活地判断范围
枚举类型:
enum HeroType{
Soldier,
Master,
Tank,
Shooter
}
声明时:
HeroType heorType = HeroType.Soldier;
后续判断时:
if (heroType == HeroType.Soldier)
运算符分类:
1,数学运算符
2,赋值运算符
3,比较运算符
4,逻辑运算符
&& || !
在类中声明的public的变量可以在unity的Inspector面板中进行改变。但是Inspector面板的初始值只会是在脚本中第一次定义的时候的值,之后如果在脚本内进行值的改动是不会影响到Inspector界面的值的,且实际输出的值是以Inspector为准的
如果定义的变量为private,那么是不会在Inspector界面显示的
如果定义的时候没有声明是public还是private,那么默认是private
别的类型:
eg. public GameObject cameraGo;
这一行语句可以用游戏物体赋值的。但是这种拖拽赋值有个缺点,就是这些赋值的变量容易丢失。
脚本中上面的几个using叫做namespace
显示灰色的namespace表示没有使用,显示白色的namespace表示使用了(MonoBehaviour就在UnityEngine中使用了;如果删掉using UnityEngine,MonoBehaviour就会报错了,因为它所在的命名空间不存在,识别不出来这个类)
定义namespace的方法:
namespace 命名空间名 {
class 类名{
}
}
这样的话这个被创建的类就属于这个命名空间了
那么可以在继承了MonoBehaviour的主类上通过using 命名空间名,然后就可以在主类中使用这个新定义的类去声明一些变量或对象等等