Как уже было сказано, я бы предпочел, чтобы каждый VRInteractiveItem
сам обрабатывал OnOver
, а не делал все это из одного компонента менеджера.
Однако вы могли бы сделать что-то (хотя яне рекомендовал бы), использует лямбда-выражения с циклом for
вместо 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;
}
};
}
}