Взгляд всегда выполняется даже после 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();