【unity】(2)GameObject

GameObject类是基本的游戏对象类型,它可以用来代表场景中的任何实体。

基本属性

  1. name

    • 类型:string
    • 说明:GameObject的名称。
    • 用法:
    GameObject go = new GameObject();
    go.name = "My GameObject";
    
  2. activeSelf

    • 类型:bool
    • 说明:指示GameObject自身是否处于激活状态。
    • 用法:
    bool isActive = go.activeSelf;
    
  3. activeInHierarchy

    • 类型:bool
    • 说明:指示GameObject在整个场景中是否处于激活状态(包括父级对象的激活状态)。
    • 用法:
    bool isActiveInHierarchy = go.activeInHierarchy;
    
  4. isStatic

    • 类型:bool
    • 说明:指示GameObject是否被标记为静态对象(对于性能优化很重要)。
    • 用法:
    go.isStatic = true;
    
  5. tag

    • 类型:string
    • 说明:GameObject的标签,用于分类或查找对象。
    • 用法:
    go.tag = "Player";
    
  6. layer

    • 类型:int
    • 说明:GameObject所在的层,用于渲染和物理碰撞。
    • 用法:
    go.layer = 8;
    

实例化和查找

  1. Instantiate()

    • 说明:实例化一个GameObject
    • 用法:
    GameObject newObject = Instantiate(go);
    
  2. Destroy()

    • 说明:销毁一个GameObject
    • 用法:
    Destroy(go);
    
  3. Find()

    • 说明:查找场景中的某个GameObject
    • 用法:
    GameObject player = GameObject.Find("Player");
    
  4. FindWithTag()

    • 说明:通过标签查找场景中的某个GameObject
    • 用法:
    GameObject player = GameObject.FindWithTag("Player");
    
  5. FindGameObjectsWithTag()

    • 说明:通过标签查找场景中的所有GameObject
    • 用法:
    GameObject[] enemies = GameObject.FindGameObjectsWithTag("Enemy");
    

Transform

每个GameObject都有一个Transform组件,描述了其在场景中的位置、旋转和缩放:

  1. transform

    • 说明:GameObjectTransform组件。
    • 用法:
    Transform transform = go.transform;
    
  2. transform.position

    • 说明:GameObject的世界坐标。
    • 用法:
    go.transform.position = new Vector3(0, 5, 0);
    
  3. transform.rotation

    • 说明:GameObject的世界旋转。
    • 用法:
    go.transform.rotation = Quaternion.Euler(0, 90, 0);
    
  4. transform.localScale

    • 说明:GameObject的本地缩放。
    • 用法:
    go.transform.localScale = new Vector3(1, 2, 1);
    

组件操作

组件(Components)是附加到游戏对象(GameObjects)上的各种功能单元,包括渲染器(如Mesh Renderer)、物理组件(如Rigidbody)、自定义脚本等。

获取组件

使用 GetComponentGetComponents

GetComponent 方法用于从游戏对象上获取一个已经附加的组件实例。如果游戏对象上没有附加指定的组件,则返回 null

// 获取当前游戏对象上的Rigidbody组件
Rigidbody rb = GetComponent<Rigidbody>();
if (rb != null)
{
    // Rigidbody组件存在,可以对其进行操作
}

获取GameObject上的某个组件。

Rigidbody rb = go.GetComponent<Rigidbody>();

获取GameObject上的所有某类型的组件。

Rigidbody[] rbs = go.GetComponents<Rigidbody>();
使用 GetComponentInChildrenGetComponentsInChildren

这两个方法分别用来获取游戏对象或其任何子对象上的一个组件实例,或所有符合条件的组件实例数组。

// 获取当前游戏对象或其子对象上的第一个MeshRenderer组件
MeshRenderer meshRenderer = GetComponentInChildren<MeshRenderer>();

// 获取当前游戏对象及其所有子对象上的所有MeshRenderer组件
MeshRenderer[] meshRenderers = GetComponentsInChildren<MeshRenderer>();

获取GameObject的子对象上的某个组件。

Rigidbody rb = go.GetComponentInChildren<Rigidbody>();
使用 GetComponentInParentGetComponentsInParent

当你需要从当前游戏对象的父级或更高层级中获取组件时,使用这两个方法。

// 获取当前游戏对象的父级上的Collider组件
Collider collider = GetComponentInParent<Collider>();

获取GameObject的父对象上的某个组件。

Rigidbody rb = go.GetComponentInParent<Rigidbody>();

控制组件

一旦获取到了组件的引用,就可以轻松地读取或修改其公共属性和调用其方法。

修改属性
// 假设已获取到Rigidbody组件的引用rb
rb.mass = 2; // 修改质量
rb.useGravity = false; // 禁用重力影响
调用方法
// 使用Rigidbody组件的方法来添加力
rb.AddForce(Vector3.up * 500);

活动状态控制

在Unity中,SetActiveenabled是两种不同的方式来控制对象的活动状态:

GameObject.SetActive
  • 类型: bool
  • 说明: SetActive控制GameObject的整体激活状态。当GameObject被禁用时,它和它的所有子对象都会被禁用。
  • 用法:
// 启用GameObject
gameObject.SetActive(true);
// 禁用GameObject
gameObject.SetActive(false);
  • 效果:
    • 如果一个GameObject被设置为不激活(SetActive(false)),它和它的所有组件、子对象都会被禁用。
    • 无论GameObject的组件的enabled属性是true还是falseGameObject被禁用后,所有组件都停止工作。
Behaviour.enabled
  • 类型: bool
  • 说明: enabled是用于控制Behaviour类及其子类的组件(如MonoBehaviourColliderRenderer等)的活动状态。
  • 用法:
    // 启用组件
    gameObject.GetComponent<Renderer>().enabled = true;
    // 禁用组件
    gameObject.GetComponent<Renderer>().enabled = false;
    
  • 效果:
    • enabled仅影响组件本身,不影响GameObject的整体活动状态。
    • 如果组件被设置为enabled = false,它自身会停止工作,但不影响其他组件或子对象。
区别总结
  1. 范围:

    • SetActive作用于整个GameObject及其子对象。
    • enabled作用于单个组件。
  2. 影响:

    • SetActive会禁用所有组件和子对象,无论它们的enabled属性如何。
    • enabled只影响特定组件。
  3. 重启:

    • SetActive(false)SetActive(true)GameObject会完全重新初始化。
    • enabled的状态切换不会重新初始化组件。
使用示例
void Example()
{
    GameObject go = new GameObject("Example");

    // 添加一个组件
    Renderer renderer = go.AddComponent<Renderer>();

    // 使用SetActive禁用整个GameObject
    go.SetActive(false); // This will also disable renderer
    Debug.Log(renderer.enabled); // Output: False

    // 重新启用GameObject
    go.SetActive(true);
    Debug.Log(renderer.enabled); // Output: True

    // 使用enabled禁用组件
    renderer.enabled = false;
    Debug.Log(go.activeSelf); // Output: True
}

添加和移除组件

你还可以在运行时动态地添加或移除组件。

添加组件
// 向当前游戏对象添加一个Rigidbody组件
Rigidbody rb = gameObject.AddComponent<Rigidbody>();
移除组件
// 移除当前游戏对象上的Rigidbody组件
Destroy(GetComponent<Rigidbody>());

注意事项

  • 在频繁调用的方法中(如 Update)避免使用 GetComponent 和其变体,因为这些方法可能会对性能产生影响。最好在初始化时(如 StartAwake 方法中)获取并缓存所需的组件引用。
  • 当你试图获取的组件不存在时,GetComponent 会返回 null。在尝试使用获取到的组件之前,最好进行空值检查,以避免空引用异常。

使用示例

以下是一个综合示例,展示了如何使用GameObject类:

using UnityEngine;

public class GameObjectExample : MonoBehaviour
{
    void Start()
    {
        // 创建一个新的GameObject
        GameObject go = new GameObject("My GameObject");

        // 添加一个组件
        Rigidbody rb = go.AddComponent<Rigidbody>();

        // 设置位置
        go.transform.position = new Vector3(0, 5, 0);

        // 设置激活状态
        go.SetActive(true);

        // 查找标签为"Player"的GameObject
        GameObject player = GameObject.FindWithTag("Player");

        // 销毁对象
        Destroy(player, 2.0f); // 2秒后销毁
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/601064.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[法规规划|数据概念]金融行业数据资产和安全管理系列文件解析

“ 金融行业在自身数据治理和资产化建设方面一直走在前列。” 一直以来&#xff0c;金融行业由于其自身需要&#xff0c;都是国内开展信息化建设最早&#xff0c;信息化程度最高的行业。 同时&#xff0c;金融行业的数据治理、数据资产化以及过程中的管理要求和安全要求与其他…

Hive Partitioned Tables 分区表

Hive Partitioned Tables 分区表 1.分区表概念 Hive分区表&#xff08;Partitioned Tables&#xff09;是一种用于管理大量数据的机制&#xff0c;它可以将数据分散到不同的目录或分区中&#xff0c;以提高查询性能、优化数据存储和管理。 这种表结构可以根据某个列的值进行分…

【Ansible】ansible-playbook剧本

playbook 是ansible的脚本 playbook的组成 1&#xff09;Tasks&#xff1a;任务&#xff1b;通过tasks 调用ansible 的模板将多个操作组织在一个playbook中运行 2&#xff09;Variables&#xff1a;变量 3&#xff09;Templates&#xff1a;模板 4&#xff09;Handles&#xf…

基于C++从0到1手写Linux高性能网络编程框架(超清)

基于C从0到1手写Linux高性能网络编程框架(超清) TIME_WAIT状态存在原因有两点&#xff1a; 其一是可靠的中止tcp连接&#xff1b; 其二是保证让延迟的tcp报文有足够的时间被识别&#xff1b; 客户端在关闭连接阶段需要处理收到重复的结束报文&#xff0c;然后回复最后的ACK…

网络网络层之(4)IPv4协议

网络网络层之(1)IPv4协议 Author: Once Day Date: 2024年4月4日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文档可参考专栏&#xff1a;通信网络技术_Once-Day的…

IDEA远程连接docker服务,windows版docker desktop

1.windows上安装docker desktop docker desktop下载地址&#xff1a;Docker Desktop: The #1 Containerization Tool for Developers | Docker 有的windows系统不支持安装docker desktop 安装完之后我们可以直接打开&#xff0c;可以选择不登录使用 我们用IDEA连接到docker …

什么是 AI Agent ?

&#xff08;注&#xff1a;本文为小报童精选文章。已订阅小报童或加入知识星球「玉树芝兰」用户请勿重复付费&#xff09; 讲解的同时&#xff0c;也给你推荐一些实用的学习资源。 AI agent &#xff08;智能体 / 代理&#xff09;这个词儿最近非常流行&#xff0c;似乎「大语…

使用Three.js开发一个3D案例Demo

使用Three.js开发一个3D案例 最近在找工作&#xff0c;发现好多招聘要求都需要会Three.js&#xff0c;以前接触比较多的是2D开发&#xff0c;也就是平面开发&#xff0c;用到的做多的技术就是d3.js&#xff0c;现在3D开发已经成为了大势所趋&#xff0c;所以就学习下Three.js。…

sql优化思路

sql的优化经验 这里解释一下SQL语句的优化的原理 1.指明字段名称&#xff0c;可以尽量使用覆盖索引&#xff0c;避免回表查询&#xff0c;因此可以提高效率 2.字面意思&#xff0c;无需过多赘述。索引就是为了提高查询效率的。 3.图中两条sql直接可以使用union all 或者 uni…

上市公司财务困境模型​MertonDD、OScore、RLPM、ZScore四种模型​(1992-2022年)

01、数据介绍 上市公司财务困境模型是用于预测和评估上市公司是否可能陷入财务困境的一种模型。这个模型通常基于一系列的财务比率和其他相关变量&#xff0c;通过统计分析方法来构建。​ 数据名称&#xff1a;上市公司财务困境模型MertonDD、OScore、RLPM、ZScore五种模型 …

PHPStudy Apache或者MySQL启动以后自动停止

问题 phpstudy小皮面板中的Apache或MySQL启动以后自动停止 正在启动——已启动——已停止 总结&#xff1a;最主要的原因&#xff1a;端口冲突 端口冲突了&#xff0c;已经有其他程序占用了80、3306端口。 也就是说你的电脑上已经有了一个Apache、MySQL并且正在运行。 解决方案…

springboot lua检查redis库存

需求 最近需求需要实现检查多个马戏场次下的座位等席对应库存渠道的库存余量&#xff0c;考虑到性能&#xff0c;决定采用Lua脚本实现库存检查。 数据结构 库存层级结构 redis库存hash类型结构 实现 lua脚本 --- 字符串分割为数组 local function split(str, char)local…

微信小程序16: 组件通信

父子组件之间的通信 父子组件通信一共有三种方式 属性绑定 用于父组件向子组件的指定属性设置数据&#xff0c;仅能设置JSON兼容的数据 事件绑定 用于子组件向父组件传递数据&#xff0c;可以传递任意数据 获取组件实例 父组件还可以通过this.selectComponent()获取子组件的实…

蓝桥杯单片机之模块代码《AT24C02》

过往历程 历程1&#xff1a;秒表 历程2&#xff1a;按键显示时钟 历程3&#xff1a;列矩阵按键显示时钟 历程4&#xff1a;行矩阵按键显示时钟 历程5&#xff1a;新DS1302 历程6&#xff1a;小数点精确后两位ds18b20 历程7&#xff1a;35定时器测量频率 文章目录 过往历…

吴恩达2022机器学习专项课程C2(高级学习算法)W1(神经网络):2.4 神经网络层

目录 神经网络第一层&#xff08;隐藏层&#xff09;计算过程1.输入向量2.神经元的计算2.标识不同神经元3.层输出&#xff08;激活&#xff09;向量4.神经网络分层5.标识不同层 神经网络第二层&#xff08;输出层&#xff09;计算过程1.输入向量2.层输出&#xff08;激活&#…

cmake进阶:目录属性之 INCLUDE_DIRECTORIES说明二

一. 简介 前面几篇文章学习了 cmake的一些目录属性&#xff0c;主要有两个重要的目录属性INCLUDE_DIRECTORIES 属性、LINK_DIRECTORIES 属性。文章如下&#xff1a; cmake进阶&#xff1a;目录属性之 INCLUDE_DIRECTORIES-CSDN博客 本文学习 父目录的 INCLUDE_DIRECTORIES …

基于svm的手写数字识别程序介绍(matlab)

1、程序界面介绍 该程序GUI界面包括手写板、手写数字可视化&#xff08;原图&#xff09;、对图像进行灰度处理&#xff08;灰度图&#xff09;、图像二值化处理&#xff08;二值化&#xff09;、图像特征可视化&#xff08;HOG特征&#xff08;方向梯度直方图&#xff09;&…

解决Node.js mysql客户端不支持认证协议引发的“ER_NOT_SUPPORTED_AUTH_MODE”问题

这是一个版本问题 我用koa2和mysql2链接就没有问题 不知道这个老项目运行为啥有这个问题 解决方案 打开mysql运行这个两个命令&#xff1a; ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY 123321; FLUSH PRIVILEGES; 须知(给小白看的&#xff01;) …

Hive Views 视图

Hive Views 视图 在Hive中&#xff0c;视图&#xff08;Views&#xff09;是虚拟表&#xff0c;它只包含查询定义&#xff0c;而不包含实际的数据。视图可以简化复杂查询&#xff0c;隐藏数据结构&#xff0c;提供安全性&#xff0c;以及促进数据访问和重用。 创建视图的语法如…

汽车灯罩一般都是用什么材质做的?汽车车灯的灯罩如果破损破裂破洞了要怎么修复?

汽车灯罩一般都是用什么材质做的&#xff1f; 汽车灯罩一般使用的主要材质是聚碳酸酯&#xff08;PC&#xff09;和丙烯酸酯&#xff08;PMMA&#xff09;这两种塑料。这两种材料具有良好的透明性、耐候性和耐冲击性&#xff0c;因此非常适合用于汽车灯罩的制造。 聚碳酸酯&am…
最新文章