Взгляд всегда выполняется даже после PointExit

У меня проблема с моим взглядом на VR . Я пытаюсь посмотреть на кнопку, которую я хочу выбрать, затем спрятать первого родителя игрового объекта и показать второго родителя игрового объекта. Теперь будет показан второй родительский объект игрового объекта, и когда я попытаюсь посмотреть на кнопку "Назад", он покажет первого родительского игрового объекта и скроет второго родительского игрового объекта. Проблема возникает здесь, когда я пытаюсь ничего и не смотрю на кнопки, он автоматически показывает моего второго родителя игрового объекта и возвращается к первому родительскому игровому объекту и скрывает и показывает, скрывает и показывает всегда.

public float gazeTime = 2f;
private float timer;
private bool gazedAt;

public Setting setting;

private void Start()
{

}

public void Update()
{
    if (gazedAt)
    {
        timer += Time.deltaTime;

        if (timer >= gazeTime)
        {
            // execute pointerdown handler
            ExecuteEvents.Execute(gameObject, new PointerEventData(EventSystem.current), ExecuteEvents.pointerDownHandler);
            timer = 0f;
        }
        else
        {
            return;
        }
    }
    else
    {
        return;
    }

}

public void PointerEnter()
{
    gazedAt = true;
    Debug.Log("PointerEnter");
}

public void PointerExit()
{
    gazedAt = false;
    Debug.Log("PointerExit");
}

//Method for going to setting
public void Setting()
{
    setting.ActivateSetting();
}
//Method for going back to main menu
public void GoBack()
{
    setting.GoBackToMainMenu();
}

Вот как мой Setting код настроен

public GameObject setting;
public GameObject back; 

public void ActivateSetting()
{
    setting.SetActive(false);
    back.SetActive(true);
}

public void GoBackToMainMenu()
{
    back.SetActive(false);
    setting.SetActive(true);
}  

Что я хочу, так это то, что он покажет родителя игрового объекта, только если я посмотрю на него.

1 ответ

Решение

После нажатия кнопки, как только вы сбросите timer но вы не сбросили gazedAt

=> Update Метод все еще запускает таймер и снова вызывает щелчок.

Кажется, что ваш PointerExit не вызывается вообще и поэтому кнопка никогда не сбрасывается.


Вместо EventTrigger Я настоятельно рекомендую использовать интерфейсы IPointerEnterHandler а также IPointerExitHandler лайк

public class YourClass : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler
{
    //...

    public void OnPointerEnter()
    {

    }

    public void OnPointerExit()
    {

    }

Я бы на самом деле не использовал Update вообще, но предпочитаю сопрограмму. Также не используйте сложный вызов ExecuteEvents.Execute(gameObject, new PointerEventData(EventSystem.current), ExecuteEvents.pointerDownHandler); вместо этого используйте либо Getcomponent<Button>().onClick.Invoke(); или вызовите метод напрямую

private Button _button;

private void Awake()
{
    // Get the reference only once to avoid 
    // having to get it over and over again
    _button = GetComponent<Button>();
}

private IEnumerator Gaze()
{
    // wait for given time
    yield return new WaitForSeconds(gazeTime);

    // call the buttons onClick event
    _button.onClick.Invoke();

    // or as said alternatively directly use the methods e.g.
    setting.ActivateSetting();
}

public void OnPointerEnter()
{
    Debug.Log("PointerEnter");

    // start the coroutine
    StartCoroutine(Gaze());
}

public void OnPointerExit()
{
    Debug.Log("PointerExit");

    // stop/interrupt the coroutine
    StopCoroutine(Gaze());
}

Как вы можете видеть, нет никакой необходимости в timer а также gazedAt значения, так что вы не можете забыть сбросить их где-нибудь. Это также позволяет избежать повторного вызова метода.


Если вы не хотите использовать Button вообще вы могли бы добавить свой собственный UnityEvent лайк

// add callbacks e.g. in the Inspector or via script
public UnityEvent onGazedClick;

// ...

onGazedClick.Invoke();
Другие вопросы по тегам