在实例化对象上切换

发布于 2025-02-04 06:56:20 字数 734 浏览 4 评论 0原文

我创建了一个具有Unity UI的切换,并在其中添加了脚本。

因此,关键是我的游戏实例化了许多具有特定标签的对象。我想找到它们,然后切换到他们的网状渲染器。

我已经有了setActive。但是,它完全隐藏了对象,并且不对它存在问题。 很乐意获得任何帮助!

public class ToggleRaycast : MonoBehaviour
{

public Toggle m_Toggle;

public void OnMouseDown()
{
    
    if (m_Toggle.isOn)
    {
        GameObject[] raycasters2 = GameObject.FindGameObjectsWithTag("Raycaster");
        foreach (GameObject raycaster2 in raycasters2)
        {
            raycaster2.SetActive(true);
        }
    }
    else
    {
        GameObject[] raycasters2 = GameObject.FindGameObjectsWithTag("Raycaster");
        foreach (GameObject raycaster2 in raycasters2)
        {
            raycaster2.SetActive(false);
        }
    }
}
}

I have created a Toggle with Unity UI and added a script to it.

So the point is, that my game instantiated a number of objects with a specific tag. I want to find them and toggle on/off their mesh renderer.

I have come so far with SetActive. However, it hides the object completely and there is a problem with unhiding it.
Will be happy to receive any help!

public class ToggleRaycast : MonoBehaviour
{

public Toggle m_Toggle;

public void OnMouseDown()
{
    
    if (m_Toggle.isOn)
    {
        GameObject[] raycasters2 = GameObject.FindGameObjectsWithTag("Raycaster");
        foreach (GameObject raycaster2 in raycasters2)
        {
            raycaster2.SetActive(true);
        }
    }
    else
    {
        GameObject[] raycasters2 = GameObject.FindGameObjectsWithTag("Raycaster");
        foreach (GameObject raycaster2 in raycasters2)
        {
            raycaster2.SetActive(false);
        }
    }
}
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

堇年纸鸢 2025-02-11 06:56:20
var renderers = GameObject.FindGameObjectsWithTag("Raycaster")
    .SelectMany(go => go.GetComponentsInChildren<MeshRenderer>());
foreach(var renderer in renderers ) {
    renderer.enabled = false;
}

那样?您可以从孩子那里得到渲染器,但请注意,它还将包括Trailrenderer,PreacteryStemredenrer等。Meshrenderer和SkinnedMeshrenderer没有明确的基类,因此您可能需要处理这两种情况。

var renderers = GameObject.FindGameObjectsWithTag( "Raycaster" )
    .SelectMany( go => go.GetComponentsInChildren<Renderer>() )
    .Where(renderer => renderer is SkinnedMeshRenderer || renderer is MeshRenderer);

另请注意,FindGameObjectswithTag和GetComponentsInchildren和非常昂贵的操作,您应该在游戏玩法中避免使用它们
您应该为渲染器制作字段,并在开始或清醒一次初始化它们

private IEnumerable<Renderer> _renderers;
void Start(){
     _renderers = GameObject.FindGameObjectsWithTag("Raycaster")
         .SelectMany(go => go.GetComponentsInChildren<MeshRenderer>());
}
var renderers = GameObject.FindGameObjectsWithTag("Raycaster")
    .SelectMany(go => go.GetComponentsInChildren<MeshRenderer>());
foreach(var renderer in renderers ) {
    renderer.enabled = false;
}

Like that? You can Get Renderers from children but note it will also include TrailRenderer, ParticleSystemRedenrer etc. There is no explicit base class for MeshRenderer and SkinnedMeshRenderer so you might need to handle both cases like that feg.

var renderers = GameObject.FindGameObjectsWithTag( "Raycaster" )
    .SelectMany( go => go.GetComponentsInChildren<Renderer>() )
    .Where(renderer => renderer is SkinnedMeshRenderer || renderer is MeshRenderer);

Also note that FindGameObjectsWithTag and GetComponentsInChildren and very expensive operations and you should avoid using them during gameplay
You should make field for renderers and initialize them once in Start or Awake

private IEnumerable<Renderer> _renderers;
void Start(){
     _renderers = GameObject.FindGameObjectsWithTag("Raycaster")
         .SelectMany(go => go.GetComponentsInChildren<MeshRenderer>());
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文