首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用OnOver和OnOut (C#)的Unity VR中的交互对象

使用OnOver和OnOut (C#)的Unity VR中的交互对象
EN

Stack Overflow用户
提问于 2019-02-05 23:48:51
回答 1查看 161关注 0票数 0

Printscreen from Unity我正在为Oculus Go在Unity中创建一个VR应用。我想在精灵上显示一些文本,而激光指针悬停在某些游戏对象上,当它不在时消失。我试图通过创建一个数组来做到这一点,当激光指针悬停在特定对象上时,该数组应该显示特定的游戏对象组件(文本网格+精灵)。在这个阶段,无论激光指针悬停在哪个游戏对象上,都只显示列表中的最后一个对象text+sprite。

代码语言:javascript
运行
复制
using System;
using UnityEngine;
using VRStandardAssets.Utils;

public class ObjectManager : MonoBehaviour
{

[SerializeField] VRInteractiveItem[] InteractiveObjects;
[SerializeField] Transform reticleTransform;

private VRInteractiveItem currentObject;

void Start()
{

    foreach (VRInteractiveItem t in InteractiveObjects)
    {

        foreach (MeshRenderer renderer in t.GetComponentsInChildren<MeshRenderer>())
        {
            renderer.enabled = false;
        }


        foreach (SpriteRenderer renderer in t.GetComponentsInChildren<SpriteRenderer>())
        {
            renderer.enabled = false;
        }
    }

}


void OnEnable()
{
    foreach (VRInteractiveItem t in InteractiveObjects)
    {
        currentObject = t;
        currentObject.OnOver += Popup;
    }
}


void Popup()
{
        foreach (MeshRenderer renderer in currentObject.GetComponentsInChildren<MeshRenderer>())
        {
            renderer.enabled = true;
        }

        foreach (SpriteRenderer renderer in currentObject.GetComponentsInChildren<SpriteRenderer>())
        {
            renderer.enabled = true;
        }

        currentObject.OnOut += Popdown;
}


void Popdown()
{ 
        foreach (MeshRenderer renderer in currentObject.GetComponentsInChildren<MeshRenderer>())
        {
            renderer.enabled = false;
        }

        foreach (SpriteRenderer renderer in currentObject.GetComponentsInChildren<SpriteRenderer>())
        {
            renderer.enabled = false;
        }

}

}

我如何让激光笔知道我正在与哪个特定的游戏对象交互,并使其只显示该对象的组件?我试图找到一个ID的解决方案,但没有得到它的工作在虚拟现实。

EN

回答 1

Stack Overflow用户

发布于 2019-02-06 02:08:34

正如前面所说的,我实际上建议让每个VRInteractiveItem自己处理OnOver,而不是从一个管理器组件来做所有的事情。

但是,您可以做的一件事是使用带有for循环的lambda表达式,而不是foreach作为回调函数,而不是像这样的方法

代码语言:javascript
运行
复制
void OnEnable()
{
    for(var i= 0; i < InteractiveObjects.Length; i++)
    {
        var index = i;
        InteractiveObjects[index].OnOver += () => {
            foreach (MeshRenderer renderer in InteractiveObjects[index].GetComponentsInChildren<MeshRenderer>())
            {
                renderer.enabled = true;
            }

            foreach (SpriteRenderer renderer in InteractiveObjects[index].GetComponentsInChildren<SpriteRenderer>())
            {
                renderer.enabled = true;
            }

            InteractiveObjects[index].OnOut += () => {
                foreach (MeshRenderer renderer in InteractiveObjects[index].GetComponentsInChildren<MeshRenderer>())
                {
                    renderer.enabled = false;
                }

                foreach (SpriteRenderer renderer in InteractiveObjects[index].GetComponentsInChildren<SpriteRenderer>())
                {
                    renderer.enabled = false;
                }
            };
        };
    }
}

这样做的一个问题是,您不能像处理方法那样删除这些回调(InteractiveObjects[index].OnOut -= XYZ)。

因此,您实际上不应该在每次对象悬停时都添加InteractiveObjects[index].OnOut +=,因为您可能会多次执行禁用代码。您也可以将其添加到OnEnable中,如下所示

代码语言:javascript
运行
复制
void OnEnable()
{
    for(var i= 0; i < InteractiveObjects.Length; i++)
    {
        var index = i;
        InteractiveObjects[index].OnOver += () => {
            foreach (MeshRenderer renderer in InteractiveObjects[index].GetComponentsInChildren<MeshRenderer>())
            {
                renderer.enabled = true;
            }

            foreach (SpriteRenderer renderer in InteractiveObjects[index].GetComponentsInChildren<SpriteRenderer>())
            {
                renderer.enabled = true;
            }
        };

        InteractiveObjects[index].OnOut += () => {
            foreach (MeshRenderer renderer in InteractiveObjects[index].GetComponentsInChildren<MeshRenderer>())
            {
                renderer.enabled = false;
            }

            foreach (SpriteRenderer renderer in InteractiveObjects[index].GetComponentsInChildren<SpriteRenderer>())
            {
                renderer.enabled = false;
            }
        };
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54538168

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档