Как сделать объект кликабельным в зависимости от расстояния игрока? - PullRequest
0 голосов
/ 03 апреля 2019

Мне нужно сделать предмет в моей сцене кликабельным, но только когда игрок находится рядом с предметом. В моем сценарии я заставляю рассматриваемый элемент автоматически переходить к пустому GameObject, который является дочерним по отношению к моему Player в иерархии, чтобы определить позицию, но щелчок активен, как только камера установит его. Я использую контроллер персонажей из 2d физики, а не 2drigidbody, поэтому я еще больше запутался, потому что не могу использовать коллайдер.

Ответы [ 3 ]

1 голос
/ 03 апреля 2019

Я почти уверен, что на игровом объекте (по крайней мере, триггерный коллайдер) могут быть и контроллер персонажа, и коллайдер.

Тогда вместо того, что вы используете для определения щелчка, вы должны использовать в цикле обновления что-то вроде Input.GetKeyDown(KeyCode.Mouse0) и использовать raycast, где вы можете указать длину луча. https://docs.unity3d.com/ScriptReference/Physics.Raycast.html

0 голосов
/ 03 апреля 2019

Я предлагаю использовать метод onMouseDown ().Если к вашему gameObject подключен коллайдер или триггер, onMouseDown () обнаружит щелчки мышью на объекте.Затем в теле onMouseDown () вы можете проверить, находится ли он в диапазоне.

Это пример сценария, как он может работать:

public class ItemClickable : MonoBehaviour
{

    public Transform player;        // player-transform reference (depends if you have a singleton or not)
    public float range;             // radius (maybe you have a range or radius already set in your player instance)

    void Start()
    {
        // Setup for your references        
    }


    private void OnMouseDown()
    {   
        // Checks if the item is in the range of the player
        if ((player.position-gameObject.transform.position).magnitude < range) // Vector3.Distance() is also possible
        {
            Destroy(gameObject); // or do whatever you want in here
        }
    }
}
0 голосов
/ 03 апреля 2019

Чтобы сделать что-нибудь кликабельное, я бы порекомендовал 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
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...