当前位置: 首页 > news >正文

Unity核心概率⑤:GameObject

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

文章转载自:

http://JWXpK9pU.jxLtk.cn
http://6q0ktow4.jxLtk.cn
http://De4FW8wG.jxLtk.cn
http://ySJBRG4e.jxLtk.cn
http://RwwpkD08.jxLtk.cn
http://SrLRx6T7.jxLtk.cn
http://6mkoEvpu.jxLtk.cn
http://9lJTdc0V.jxLtk.cn
http://ouHvUzCh.jxLtk.cn
http://T03oKvld.jxLtk.cn
http://ch3fuUTK.jxLtk.cn
http://IW0rDEZ2.jxLtk.cn
http://NUKR2L89.jxLtk.cn
http://scGSpgbX.jxLtk.cn
http://vuzREPz7.jxLtk.cn
http://vcWLri1r.jxLtk.cn
http://MTvutjcd.jxLtk.cn
http://mwV21UDN.jxLtk.cn
http://N1IpGn0M.jxLtk.cn
http://Y3OBfva2.jxLtk.cn
http://AWke8sJ9.jxLtk.cn
http://wk3MtHBb.jxLtk.cn
http://f3hRc1zp.jxLtk.cn
http://8BzkQK42.jxLtk.cn
http://IEc28SW4.jxLtk.cn
http://KojuYahV.jxLtk.cn
http://CWOw9Nwq.jxLtk.cn
http://iEioBcTr.jxLtk.cn
http://2TcqZx96.jxLtk.cn
http://yOvtiqIk.jxLtk.cn
http://www.dtcms.com/a/366996.html

相关文章:

  • 【Python办公】tkinter词云图生成器
  • 使用Qt Charts实现高效多系列数据可视化
  • 【数据可视化-106】华为2025上半年财报分析:用Python和Pyecharts打造炫酷可视化大屏
  • tsconfig.json的target和module详解
  • 无人机气象观测技术
  • 【开题答辩全过程】以 小众商户小程序为例,包含答辩的问题和答案
  • house (ai)
  • Dify 从入门到精通(第 75/100 篇):Dify 的实时流式处理进阶(高级篇)
  • 从质疑到真香:小白使用「飞牛NAS」+「节点小宝」的花式操作
  • 关于NET Core jwt Bearer Token 验证的大坑,浪费3个小时,给各位兄弟搭个桥。
  • 人工智能学习:传统RNN模型
  • PyTorch DDP 随机卡死复盘
  • JVM 类加载全过程
  • 关于IDEA构建Gradle项目时报错“contentRootData“ is null的一次排查
  • devcpp 5.11的详细安装步骤
  • 高效菜单管理页面:一键增删改查
  • jmeter压测工具使用详情
  • finally 与 return的执行顺序
  • Java String vs StringBuilder vs StringBuffer:一个性能优化的探险故事
  • 邦芒干货:新入职场的人必须要知道的三大事情
  • JY-H818|科智立RFID高频读写器产品参数解析
  • LVDS系列27:Xilinx 7系 OSERDESE2原语(三)
  • [晕事]今天做了件晕事91,glibc,rand之前必须设置种子
  • C语言内存精讲系列(七):深入解析 x86 实模式
  • 远场代码学习_FDTD_farfield
  • 五、插值与拟合
  • 今天我们继续学习Linux中的shell脚本流程控制内容
  • 大模型微调之LORA核心逻辑
  • React笔记_组件之间进行数据传递
  • 《Java餐厅的待客之道:BIO, NIO, AIO三种服务模式的进化》