一、GameObject中的成员变量
1.名字:
//使用小写 gameObject 访问当前对象
print(this.gameObject.name);
//设置当前物体名称为"名字"
this.gameObject.name = "名字";
// 打印变量值
print(this.gameObject.name);
2.是否激活:
print(this.gameObject.activeSelf);
3.是否是静态:
print(this.gameObject.isStatic);
4.层级:
print(this.gameObject.layer);
5.标签:
print(this.gameObject.tag);
6.transform:
print(this.gameObject.transform.position);
Unity核心概率④:MonoBehavior-CSDN博客中提到的通过MonoBehavior去得到依附对象的GameObject位置信息,他们得到的信息是一样的。
二、GameObject中的静态方法
只要得到了一个GameObject对象,我们就可以得到它身上挂载的任何脚本信息。
1.创建unity自带的几何体
// 创建一个立方体原始游戏对象
GameObject obj = GameObject.CreatePrimitive(PrimitiveType.Cube);
// 将该对象的名称设置为"立方体"
obj.name = "立方体";
2.查找对象相关
①查找单个对象
通过对象名查找:
注意:这个查找方法效率比较低下,因为它会在场景中的所以对象中去查找。
// 在场景中查找名为"对象"的游戏对象
GameObject obj = GameObject.Find("对象");
// 检查是否成功找到该游戏对象
if(obj != null)
{
// 如果找到,打印该游戏对象的名称
print(obj.name);
}
else
{
// 如果未找到,打印提示信息
print("没有找到对象");
}
通过tag查找:
// 通过标签"player"在场景中查找对应的游戏对象
GameObject obj = GameObject.FindWithTag("player");
// 检查是否成功找到对象
if(obj != null)
{
// 如果找到对象,打印成功信息和该对象的名称
print("根据tag找到对象" + obj.name);
}
else
{
// 如果没有找到对应标签的对象,打印未找到信息
print("根据tag没有找到对象");
}
得到某一个单个对象,目前有两种方法:一种是public从外部面板进行关联;另一种是通过API去找。
②查找多个对象:
找多个对象的API只能是通过tag去找多个,没有通过名字找多个的方法。通过tag找多个对象也是只能找到激活的对象,无法找到失活对象。
// 在场景中查找所有标签为"player"的游戏对象
// 返回一个包含所有匹配对象的数组
GameObject[] objs = GameObject.FindGameObjectsWithTag("player");
// 打印找到的对象数量
print("找到tag为player对象的个数为" + objs.Length);
注意:
“万物之父” 指的是 C# 语言中的所有类型的终极基类——System.Object 类。Unity中的Object和C#中的有区别。
Unity中的Object不是指的是万物之父Object,它的命名空间在UnityEngine中的Object类,是集成万物之父的一个自定义类。
C#中的Object的命名空间在System中。
3.找场景中挂载的某一个脚本对象
// 在场景中查找第一个激活的 Test 类型组件
Test foundTest = GameObject.FindObjectOfType<Test>();
// 安全检查,确保找到组件后再访问其属性
if(foundTest != null)
{
// 打印该组件所在游戏对象的名称
print(foundTest.gameObject.name);
}
else
{
print("未找到 Test 类型的组件");
}
4.实例化对象(克隆对象)的方法
实例化(克隆)对象的作用是根据一个GameObject对象,创建出一个和它一模一样的对象。
GameObject.Instantiate(obj);
5.删除对象的方法
①:
GameObject.Destroy(obj);
②括号中第二个参数代表延迟几秒后删除:
GameObject.Destroy(obj,5);
③Destroy不仅可以删除对象,也可以删除脚本:
GameObject.Destroy(this.GameObject);
注意:Destroy方法不会马上移除对象,只是给这个对象加了个移除标识。一般情况下,它会在下一帧时把这个对象移除并从内存中删除。如果没有特殊要求,一定要马上移除一个对象的话,建议使用以上的Destroy方法,因为是异步的可以降低发生卡顿的几率。
④立即把对象从内存中移除:
GameObject.DestroyImmediate(obj);
如果是继承MonoBehavior的类,可以不用写GameObject:
Destroy(obj);
DestroyImmediate(obj);
⑤过场景不移除:
默认情况下,在切换场景时,场景中对象都会被自动删除。如果希望某个对象过场景不被删除,可以使用:
GameObject.DontDestroyOnLoad(this.gameObject);
如果是继承MonoBehavior的,也可以直接写:
DontDestroyOnLoad(this.gameObject);
三、常用的GameObject中的成员方法
1.创建空物体
new一个GameObject就是在创建一个空物体
// 创建一个名为"创建的空物体"的新游戏对象
GameObject obj = new GameObject("创建的空物体");
// 在创建的同时为其添加 Test 组件
// typeof(Test) 指定要添加的组件类型
GameObject obj = new GameObject("创建的空物体", typeof(Test));
2.为对象添加脚本
继承MonoBehavior的脚本,是不能去new。如果想要动态地添加继承MonoBehavior的脚本在某一个对象上,直接使用GameObject提供的方法即可:
// 通过Type添加组件并进行类型转换
// 在obj游戏对象上添加一个Test类型的组件
// AddComponent(typeof(Test)) 返回Component类型
// 使用 as 运算符将返回的Component安全转换为具体的Test类型
Test t = obj.AddComponent(typeof(Test)) as Test;
使用泛型方法更方便:
// 在游戏对象obj上添加一个Test类型的组件
// 方法会返回新添加的Test组件的引用,并直接赋值给变量t
Test t = obj.AddComponent<Test>();
通过返回值,可以得到加入的脚本信息来进行一些处理。得到的脚本成员的方法和继承MonoBehavior的类得到脚本的方法一致。
3.标签比较
以下两种方法是一样的:
if(this.gameObject.CompareTag("Player"))
{
print("对象的标签是Player");
}
if(this.gameObject == "Player");
{
print("对象的标签是Player");
}
4.设置激活或失活
激活:
obj.SetActive(true);
失活:
obj.SetActive(false);
四、次要的GameObject中的成员方法
这些方法了解即可,不建议使用,效率比较低下。
1.通过广播和发送消息的形式让自己或别人执行某些行为方法。
通知自己执行什么行为,或命令自己执行Plan这个函数,会在自己身上挂载的所有脚本中去找这个名字的函数,有这个名字的函数就去执行。
// 向当前游戏对象发送名为"Plan"的消息
// 会调用该对象上所有脚本中名为 Plan 的无参数方法
// 如果找不到对应方法,会输出警告
this.gameObject.SendMessage("Plan");
// 向当前游戏对象发送名为"Plan"的消息,并传递一个整数参数 199
// 会调用该对象上所有脚本中名为 Plan 且接受一个参数的方法
// 参数类型必须匹配(这里需要方法接受 int 类型参数)
this.gameObject.SendMessage("Plan", 199);
2.广播行为:让自己和自己的子对象执行。
this.gameObject.BroadcastMessage("函数名");
3.向父对象和自己发送消息并执行。
this.gameObject.SendMessageUpwards("函数名");