Полагаю, ваш Raycast должен вызывать OnPointerEnter
для всех результатов.
Вам нужно будет использовать ExecuteEvents.Execute
, например,
ExecuteEvents.Execute(result.gameObject, eventDataCurrentPosition, ExecuteEvents.pointerEnterHandler);
И также в какой-то момент придется вызвать pointerExitHandler
.
Поэтому я бы сохранил HashSet наподобие
using System.Linq;
private HashSet<GameObject> previousEnters = new HashSet<GameObject>();
...
foreach (var result in results.Select(r => r.gameObject))
{
Debug.Log(result.name);
ExecuteEvents.Execute(result, eventDataCurrentPosition, ExecuteEvents.pointerEnterHandler);
// Store the item so you can later invoke exit on them
if(!previousEnters.Contains(result)) previousEnters.Add(result);
}
// This uses Linq in order to get only those entries from previousEnters that are not in the results
var exits = previousEnters.Except(results);
foreach(var item in exits)
{
if(item) ExecuteEvents.Execute(item, eventDataCurrentPosition, ExecuteEvents.pointerExitHandler);
}
Возможно, вы захотите реализовать свой собственный пользовательский PointerInputModule
.
Альтернатива / Пример
В качестве начала вы также можете использовать мой ответ на Использование Raycast вместо указателя взгляда через некоторое время go, где я создал скрипт на основе VR Laserpointer от Steam, который позволяет взаимодействовать с трехмерными объектами и элементами пользовательского интерфейса.
Примечание: напечатано на смартфоне, но я надеюсь, что идея станет ясной