Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unity3d 凝视3秒后如何添加凝视输入定时器触发动作?_Unity3d_Unityscript_Google Cardboard_Virtual Reality_360 Virtual Reality - Fatal编程技术网

Unity3d 凝视3秒后如何添加凝视输入定时器触发动作?

Unity3d 凝视3秒后如何添加凝视输入定时器触发动作?,unity3d,unityscript,google-cardboard,virtual-reality,360-virtual-reality,Unity3d,Unityscript,Google Cardboard,Virtual Reality,360 Virtual Reality,我不熟悉统一和虚拟现实。我一直在使用GoogleCardwardSDK在unity中创建VR应用程序,我被gazetimer困住了。我只想在用户查看任何对象达3秒但无法执行的情况下触发操作。请帮助VR摄像机通常包含主摄像机和人眼摄像机(左右)。由于主摄像机的中心点始终是用户视角的眼睛中心,因此您可以使用光线投射从其变换。定位到其变换。向前并检查其是否击中您的对象。然后,只需添加一个计时器,它将在动作达到您设置的持续时间后调用该动作 例如: using UnityEngine; using Sys

我不熟悉统一和虚拟现实。我一直在使用GoogleCardwardSDK在unity中创建VR应用程序,我被gazetimer困住了。我只想在用户查看任何对象达3秒但无法执行的情况下触发操作。请帮助

VR摄像机通常包含主摄像机和人眼摄像机(左右)。由于主摄像机的中心点始终是用户视角的眼睛中心,因此您可以使用
光线投射
从其
变换。定位
到其
变换。向前
并检查其是否击中您的对象。然后,只需添加一个计时器,它将在动作达到您设置的持续时间后调用该动作

例如:

using UnityEngine;
using System;

[RequireComponent(typeof(Collider))]
public class LookableObject : MonoBehaviour {

    [SerializeField]
    Transform cam; // This is the main camera.
    // You can alternately use Camera.main if you've tagged it as MainCamera

    [SerializeField]
    float gazeDuration; // How long it should be gazed to trigger the action

    public Action OnGazeAction; // Your object's action after being gazed

    Collider gazeArea; // Your object's collider

    float timer; // Gaze timer

    public void Start () {
        gazeArea = GetComponent<Collider> ();
    }

    public void Update () {
        RaycastHit hit;

        if (Physics.Raycast (cam.position, cam.forward, out hit, 1000f)) {
            if (hit.collider == gazeArea) {

                timer += Time.deltaTime;

                if (timer >= gazeDuration) {
                    if (OnGazeAction != null)
                        OnGazeAction ();
                }

            } else {
                timer = 0f;
            }
        } else {
            timer = 0f;
        }
    }
}
使用UnityEngine;
使用制度;
[要求组件(对撞机类型))]
公共类LookableObject:MonoBehavior{
[序列化字段]
Transform cam;//这是主摄像机。
//如果已将Camera.main标记为MainCamera,则可以交替使用它
[序列化字段]
float gazeDuration;//应该注视多长时间才能触发操作
public Action OnGazeAction;//对象被注视后的动作
Collider gazeArea;//对象的碰撞器
浮点计时器;//凝视计时器
公共无效开始(){
gazeArea=GetComponent();
}
公共无效更新(){
雷卡斯特击中;
if(物理光线投射(凸轮位置、凸轮向前、外击、1000f)){
if(hit.collider==gazeArea){
timer+=Time.deltaTime;
如果(计时器>=持续时间){
if(操作!=null)
行动();
}
}否则{
定时器=0f;
}
}否则{
定时器=0f;
}
}
}

希望您能理解。

请在此处查看类似的问题和答案

总之,创建一个脚本,通过在注视对象时在每个帧上累积添加
time.deltaTime
,来计时注视。当凝视时间达到预先指定的持续时间时,触发按钮的
OnClick
事件

在对象上,使用事件触发器
指针进入
指针退出
激活脚本的凝视计时功能。请参见屏幕截图:


通常对Unity中的计时器使用Invoke和InvokeRepeating。请访问forum.unity3d或gamedev进行技术方面的一般性讨论。这是一种糟糕的方法。如果场景中有100个对象,则它们每帧将执行100次光线投射。您至少可以将Physics Raycaster连接到主摄像头,并对每一帧进行点击检查。但这正是Carboard SDK的GazeInputModule所做的。我来这里是因为我需要调整GazeInputModule,以便它在定时注视后向对象发送OnPointerXXX命令。到目前为止没有运气…@NikaKasradze这只是使用raycast的一个例子。我建议只在相机上的一个脚本上附加光线投射,然后从命中对象调用代理,因此每帧仅1个光线投射。但是是的,我认为我的样本在这里似乎有点误导。。。稍后将更新我的答案。