Unity获取未激活对象的一个方法

本文介绍在Unity中如何使用Resources.FindObjectsOfTypeAll方法来查找未激活的GameObject,包括通过匹配名称直接查找以及通过激活的父物体查找未激活子物体的两种方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

GameObject.FindXXX()会找不到未激活的对象,下面是通过使用 Resources.FindObjectsOfTypeAll 来获取未激活的对象的方法。

 /// <summary>
    /// 根据名称找到物体(可以找到未激活的物体)
    /// </summary>
    /// <param name="str">物体名称</param>
    /// <returns></returns>
    public GameObject FindGameObject(string str)
    {
        GameObject instance = new GameObject();
        var all = Resources.FindObjectsOfTypeAll<GameObject>();
        foreach (GameObject item in all)
        {
            if (item.gameObject.name == str)
            {
                instance =  item;
            }
        }
        return instance;
    }

因为是通过找所有物体匹配出来,所以最好用到场景物体少的时候。

还有一个方法是设置一个激活的父物体,先找到激活的父物体,再通过Transform.Find(XXX)来找到未激活的子物体

    GameObject parentObj = GameObject.Find("AAA");
    GameObject bbb = parentObj.transform.Find("BBB").gameObject;
    bbb.SetActive(true);

 

### PICO4 和 Unity 中实现物体触碰点击功能 在虚拟现实 (VR) 应用程序开发中,交互设计至关重要。对于基于手柄输入的 VR 设备如 PICO4,在 Unity 环境下创建可被用户通过控制器触发碰撞检测的对象是一项基本技能。 为了使对象能够响应用户的触摸操作,通常会涉及到以下几个方面的工作: #### 添加刚体组件 为了让游戏中的物件可以参与物理模拟并能与其他实体发生接触,应该给目标 GameObject 加入 Rigidbody 组件[^1]。这允许该物体遵循物理学定律移动,并且当它碰到其他带有 Collider 的物体时会产生互动效果。 ```csharp // C# Script to add a rigidbody component programmatically. using UnityEngine; public class AddRigidbody : MonoBehaviour { void Start() { if (!GetComponent<Rigidbody>()) { gameObject.AddComponent<Rigidbody>(); } } } ``` #### 配置碰撞器 每一个想要支持触碰事件的游戏对象都需要配备合适的 Collider 组件来定义其形状边界。根据实际需求可以选择 BoxCollider、SphereCollider 或 MeshCollider 等不同类型[^2]。 #### 编写脚本处理输入与逻辑判断 编写自定义脚本来捕捉来自 PICO4 控制器的手指按下动作以及判定是否发生了有效的点击行为。下面是一个简单的例子展示了如何监听按钮状态变化并通过射线投射方式查找最近的目标物进行选中或激活特定反应[^3]。 ```csharp // C# Script for detecting touch/click events using raycasting from the controller's position and direction. using System.Collections; using UnityEngine; using Valve.VR; // Ensure you have included this namespace even though it is specific to SteamVR, similar principles apply. public class ObjectTouchClickHandler : MonoBehaviour { public float maxDistance = 5f; private SteamVR_Input_Sources handType; private SteamVR_Action_Boolean clickAction; void Update () { if (clickAction.GetStateDown(handType)) { RaycastHit hitInfo; bool hasHit = Physics.Raycast(transform.position, transform.forward, out hitInfo, maxDistance); if(hasHit){ Debug.Log($"Touched object name: {hitInfo.collider.name}"); // Perform actions based on what was touched... } } } // Initialization code would go here including setting up 'handType' and assigning an action to 'clickAction'. } ``` 请注意上述代码片段假设使用的是类似于 SteamVR 插件所提供的 API 接口;针对 PICO 平台可能需要调整具体的类名和方法调用来适配官方 SDK 提供的支持函数库。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值