Printscreen from Unity我正在为Oculus Go在Unity中创建一个VR应用。我想在精灵上显示一些文本,而激光指针悬停在某些游戏对象上,当它不在时消失。我试图通过创建一个数组来做到这一点,当激光指针悬停在特定对象上时,该数组应该显示特定的游戏对象组件(文本网格+精灵)。在这个阶段,无论激光指针悬停在哪个游戏对象上,都只显示列表中的最后一个对象text+sprite。
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的解决方案,但没有得到它的工作在虚拟现实。
发布于 2019-02-06 02:08:34
正如前面所说的,我实际上建议让每个VRInteractiveItem自己处理OnOver,而不是从一个管理器组件来做所有的事情。
但是,您可以做的一件事是使用带有for循环的lambda表达式,而不是foreach作为回调函数,而不是像这样的方法
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中,如下所示
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;
}
};
}
}https://stackoverflow.com/questions/54538168
复制相似问题