凝视总是在PointExit之后执行

用户9804443

我对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);
}  

我想要的是,如果我凝视它,它只会显示游戏对象的父对象。

雨果

重置点击后,您点击一次timer但未重置gazedAt

=>该Update方法仍然运行计时器并再次调用click。

似乎PointerExit根本没有调用your ,因此该按钮永远不会重置。


取而代之的是EventTrigger我会强烈建议使用界面IPointerEnterHandlerIPointerExitHandler类似

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());
}

如您所见,timerandgazedAt根本不需要,因此您不能忘记将它们重置在某个地方。它还避免了重复调用该方法。


如果你不希望使用Button在所有的,你也可以添加自己UnityEvent喜欢

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

// ...

onGazedClick.Invoke();

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

总是在重载的构造函数之后执行一些代码

“最终”是否总是在Python中执行?

函数总是在回声期间首先执行?

Verilog 总是在启动期间阻止执行

总是在onError之后为WebSocket调用onclose

为什么总是在__new __()之后调用__init __()?

如何让vim总是在任何拉动之后调用函数

React Checkbox总是在handleFormSubmit之后返回false

Tkinter命令总是在诸如print(),Input()等命令之后吗?

dispatch_sync()总是在主线程中执行块

如果出于某种原因,Python else 总是在执行

新任务是否总是在ThreadPool线程上执行?

为什么这个项目总是在Makefile中执行?

JFrame总是在右边

strsplit并不总是在'?

事件处理程序似乎总是在主线程等待循环之后完成

li的最后一个元素总是在内容之后更改为特定的

在谷歌表中正确排序 yyyy/mm 列(1991/10 总是在 1991/01 之后)

是否总是在调度程序调用之后进行时间中断?

initState() 方法中的异步函数调用是否总是在 Flutter 中的 build() 方法之后调用?

使用“ nohup&”总是在进入ENTER之后获得[1] +退出1

有什么方法可以保证代码总是在主线程上执行?

Spring JPA保存并非总是在数据库上执行

文档头中的脚本是否总是在DOMContentLoaded触发之前执行?

Firebase Android:总是在主UI线程中执行onDataChange()事件?

发生异常时,@ After注释是否总是在Selenium中执行?

代码总是在响应发送到浏览器后执行

可执行文件是否总是在MacOS上打开终端窗口?

为什么 while 循环之后的语句并不总是执行?