Я новичок в единстве и виртуальной реальности. Я использую Google Card SDK для создания VR-приложений в единстве и застрял на Gaztimer. Я хочу инициировать действие, только если пользователь смотрит на какой-либо объект в течение 3 секунд, но не смог этого сделать. Пожалуйста помоги
как добавить таймер ввода взгляда, чтобы запускать действие после 3 секунд взгляда?
Ответы (2)
См. аналогичный вопрос и ответ здесь Используйте продолжительность ввода взглядом, чтобы выбрать текст пользовательского интерфейса в Google Cardboard
Таким образом, создайте скрипт для определения времени взгляда, кумулятивно добавляя Time.deltaTime
к каждому кадру, когда на объект смотрят. Когда время взгляда достигает заранее заданной продолжительности, вызывается событие кнопки OnClick
.
Активируйте на объекте функции синхронизации взгляда скрипта, используя триггеры событий Pointer Enter
и Pointer Exit
. Смотрите скриншот:
Камера VR обычно содержит основную камеру и камеры-глазки (правую и левую). Поскольку центральная точка основной камеры всегда будет центром глаз с точки зрения пользователя, вы можете использовать Raycast
от ее transform.position
до ее transform.forward
и проверить, попадает ли она в ваш объект. Затем просто добавьте таймер, который будет вызывать действие после того, как оно достигнет установленной вами продолжительности.
Например:
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;
}
}
}
Надеюсь, вы уловили идею.