Чтобы сделать что-нибудь кликабельное, я бы порекомендовал IPointerXHandler
интерфейсы (замените X на Click
, Enter
, Exit
, Down
, Up
и т. Д.).
Примечание:
Убедитесь, что в сцене есть EventSystem
, чтобы разрешить обнаружение щелчков. Для обнаружения щелчков на не-UI GameObjects убедитесь, что PhysicsRaycaster
подключен к камере.
Если вы хотите только нажать IPointerClickHandler
достаточно. Если вам нужна визуальная обратная связь, например, изменение цвета и т. Д., Вам нужно расширить ее как минимум на IPointerEnterHandler
и IPointerExitHandler
.
public class MyClickable : MonoBehaviour, IPointerClickHandler
{
public void OnPointerClick(PointerEventData pointerEventData)
{
...
}
}
Затем, чтобы получить расстояние между двумя объектами, вы можете просто использовать Vector3.Distance
, например. с кератиновым порогом
// configure those e.g. in the Inspector
public float distanceThreshold;
public Transofrm playerTransform;
public Transform itemTransform;
и чем использовать что-то вроде
if(Vector3.Distance(playerTransform.position, itemTransform.position) <= distanceThreshold)
{
...
}
, поэтому, если вы непосредственно внедрите это в MyClickable
, вы можете сделать визуальную обратную связь также в Update
что-то вроде
public class MyClickable : MonoBehaviour, IPointerClickHandler
{
public float distanceThreshold;
public Transofrm playerTransform;
// this gives you an event you can configure in the Inspector
// exactly like you would with a button
public UnityEvent onClick;
private bool isInRange;
public void OnPointerClick(PointerEventData pointerEventData)
{
// if too far away do nothing
if(Vector3.Distance(playerTransform.position, transform.position) > distanceThreshold) return;
....
onClick.Invoke();
}
private void Update()
{
if(Vector3.Distance(playerTransform.position, transform.position) <= distanceThreshold)
{
// e.g. make object green
}
else
{
// e.g. make object grey
}
}
}