Unity核心概率⑤:GameObject

发布于:2025-09-05 ⋅ 阅读:(20) ⋅ 点赞:(0)

一、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("函数名");

网站公告

今日签到

点亮在社区的每一天
去签到