使用鼠标左键事件实现VR中的Eye Gaze Input
1.光标以及光标动画的显示
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI; [ExecuteInEditMode]
public class Pointer : MonoBehaviour
{
public Transform ArrowNormal;
public Image ArrowActive; // Use this for initialization
void Start ()
{
ArrowNormal = transform.Find("ArrowNormal");
ArrowActive = transform.Find("ArrowNormal/ArrowActive").GetComponent<Image>();
}
}
2.头盔相机射线确定光标位置以及点击逻辑的实现
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI; [RequireComponent(typeof(Pointer))]
public class PointerCaster : MonoBehaviour
{
private GameObject currentTarget;
private GameObject lastActivedTarget;
private PointerEventData pointerEventData; private Pointer pointer;
[SerializeField]
private float clickedDelta;
private float nextfocusTime; // Use this for initialization
void Start ()
{
// 如果没有开启XR的支持关闭些模块
if (!UnityEngine.XR.XRSettings.enabled)
gameObject.SetActive(false);
else
{
pointer = GetComponent<Pointer>();
nextfocusTime = Time.time + clickedDelta;
pointerEventData = new PointerEventData(EventSystem.current);
}
} private void SimulateInput(PointerEventData pointerData)
{
List<RaycastResult> raycastResults = new List<RaycastResult>();
EventSystem.current.RaycastAll(pointerData, raycastResults);
if (raycastResults.Count > )
{
if (currentTarget == raycastResults[].gameObject &&
currentTarget != lastActivedTarget)
{
// 进度条的展示
pointer.ArrowActive.fillAmount = Mathf.Lerp(, , (nextfocusTime - Time.time) / clickedDelta); if (currentTarget.GetComponent<Selectable>())
currentTarget.GetComponent<Selectable>().OnPointerEnter(pointerData); if (Time.time >= nextfocusTime)
{
lastActivedTarget = currentTarget;
// 鼠标左键点击
if (currentTarget.GetComponent<ISubmitHandler>() != null)
{
// 点击后重置[可以进行下一次点击]
lastActivedTarget = null;
nextfocusTime = Time.time + clickedDelta;
currentTarget.GetComponent<ISubmitHandler>().OnSubmit(pointerData);
}
else if (currentTarget.GetComponentInParent<ISubmitHandler>() != null)
{
// 点击后重置[可以进行下一次点击]
lastActivedTarget = null;
nextfocusTime = Time.time + clickedDelta;
currentTarget.GetComponentInParent<ISubmitHandler>().OnSubmit(pointerData);
}
}
}
// 当前对象不是currentTarget
// 或者当前对象已经触发点击[currentTarget=lastActivedTarget]
else
{
if (currentTarget && currentTarget.GetComponent<Selectable>())
currentTarget.GetComponent<Selectable>().OnPointerExit(pointerData); if (currentTarget != raycastResults[].gameObject)
{
currentTarget = raycastResults[].gameObject;
pointer.ArrowActive.fillAmount = ;
nextfocusTime = Time.time + clickedDelta;
}
}
}
// 没有目标状态重置
else
{
lastActivedTarget = null;
if (currentTarget && currentTarget.GetComponent<Selectable>())
currentTarget.GetComponent<Selectable>().OnPointerExit(pointerData); currentTarget = null;
pointer.ArrowActive.fillAmount = ;
nextfocusTime = Time.time + clickedDelta;
}
} // Update is called once per frame
void Update ()
{
RaycastHit hit;
Ray ray = new Ray(Camera.main.transform.position, Camera.main.transform.forward);
if (Physics.Raycast(ray, out hit, ))
{
//pointer.ArrowNormal.position = hit.point;
//Debug.LogWarning(hit.point);
var sp = Camera.main.WorldToScreenPoint(hit.point);
pointerEventData.position = sp;
pointerEventData.button = PointerEventData.InputButton.Left;
// 模拟输入处理
SimulateInput(pointerEventData);
}
}
}
3.射线碰撞面的大小适应
using System.Collections;
using System.Collections.Generic;
using UnityEngine; [RequireComponent(typeof(BoxCollider))]
public class ScreenAdapter : MonoBehaviour
{
private BoxCollider bc;
// Use this for initialization
void Start ()
{
bc = GetComponent<BoxCollider>();
bc.size = transform.parent.GetComponent<RectTransform>().sizeDelta;
bc.size += new Vector3(, );
} // Update is called once per frame
void Update () { }
}
4.unity3d的层次结构
使用鼠标左键事件实现VR中的Eye Gaze Input的更多相关文章
- html 获取鼠标左键事件,滚轮点击事件,右键点击事件
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- SetCapture() & ReleaseCapture() 捕获窗口外的【松开左键事件】: WM_LBUTTONUP
今天在窗口上绘图的时候,遇到一个问题:在特殊情况下,当用户在窗口中按下鼠标左键,然后移动到窗口外松开鼠标左键,这时程序中只能捕获到 WM_LBUTTONDOWN(按下) 和 WM_MOUSEMOVE( ...
- Swing中如何比较好的判断鼠标左键双击
import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; im ...
- zend studio中ctrl+鼠标左键无法转到类或函数定义文件的解决方法
转载自:http://blog.csdn.net/wide288/article/details/21622183 zend studio中ctrl+鼠标左键无法转到类或函数定义文件的解决方法: ze ...
- [Eclipse] eclipse中打开xml文件,使用ctrl+鼠标左键无法跳转至Java源文件【待解决】
eclipse中打开xml文件,使用ctrl+鼠标左键无法跳转至Java源文件: 1. 设置eclipse ctrl + 左键打开源文件代码,如下图,设置都正常 2. 在网上找了很多种办法,均失败,在 ...
- Eclipse 中 ctrl+鼠标左键 快捷查看资源失效
Eclipse 中 ctrl+鼠标左键 快捷查看资源失效 看看eclipse 工作空间配置的jdk是什么版本,看看本地环境变量中的jdk是什么版本,将二者的版本统一即可. 笔者从git上clone一个 ...
- C# GDI绘制矩形框,鼠标左键拖动可移动矩形框,滚轮放大缩小矩形框
最近工作需要,要做一个矩形框,并且 用鼠标左键拖动矩形框移动其位置.网上查了一些感觉他们做的挺复杂的.我自己研究一天,做了一个比较简单的,发表出来供大家参考一下.如觉得简单,可路过,谢谢.哈哈. 先大 ...
- 【转】 js怎么区分出点击的是鼠标左键还是右键?
IE 下 onMouseDown 事件有个 events.button 可以返回一个数值,根据数值判断取得用户按了那个鼠标键 events.button==0 默认.没有按任何按钮. events. ...
- JavaScript经典代码【二】【javascript判断用户点了鼠标左键还是右键】
IE 下 onMouseDown 事件有个 events.button 可以返回一个数值,根据数值判断取得用户按了那个鼠标键 events.button==0 默认.没有按任何按钮. events.b ...
随机推荐
- Just a Hook HDU - 1698Just a Hook HDU - 1698 线段树区间替换
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> us ...
- 【新人赛】阿里云恶意程序检测 -- 实践记录11.3 - n-gram模型调参
主要工作 本周主要是跑了下n-gram模型,并调了下参数.大概看了几篇论文,有几个处理方法不错,准备下周代码实现一下. xgboost参数设置为: param = {'max_depth': 6, ' ...
- SP7258 SUBLEX - Lexicographical Substring Search - 后缀自动机,dp
给定一个字符串,求本质不同排名第k小的子串 Solution 后缀自动机上每条路径对应一个本质不同的子串 按照 TRANS 图的拓扑序,DP 计算出每个点发出多少条路径 (注意区别 TRANS 图的拓 ...
- linux 多并发 连接限制修改
1. 修改 ulimit -a 查看 open files 表示单个用户能打开的最大句柄 如果开发的高并发当个进程打开的句柄需要很大. 修改/etc/security/limits.conf 里面有 ...
- 【Pyecharts可视化分享】杭州步行热门路线等~
前言 本文包括内容如下: 杭州步行热门路线 渐变效果散点图 均是Echarts官方提供等示例,本文将会通过Pyecharts来进行实现. 杭州步行热门路线 因为代码中需要调用百度地图,所以开始之前你需 ...
- P1041 传染病控制【暴搜】
P1041 传染病控制 提交 10.78k 通过 3.74k 时间限制 1.00s 内存限制 125.00MB 题目提供者CCF_NOI 难度提高+/省选- 历史分数100 提交记录 查看题解 标签 ...
- PAT (Basic Level) Practice (中文)1056 组合数的和 (15 分)
给定 N 个非 0 的个位数字,用其中任意 2 个数字都可以组合成 1 个 2 位的数字.要求所有可能组合出来的 2 位数字的和.例如给定 2.5.8,则可以组合出:25.28.52.58.82.85 ...
- StarUML 2下载、安装、破解全过程
StarUML官方下载地址: http://staruml.io/download 破解: 1.使用Editplus或者Notepad++等特殊的文本编辑器打开 安装位置下/www/lic ...
- 0级搭建类009-Fedora 30 安装(F30) 公开
项目文档引子系列是根据项目原型,制作的测试实验文档,目的是为了提升项目过程中的实际动手能力,打造精品文档AskScuti. 项目文档引子系列目前不对外发布,仅作为博客记录.如学员在实际工作过程中需提前 ...
- springboot~工作流activiti的搭建
概念 工作流产品使用activiti的算是比较多了,自带了一套UI界面,可以直接使用,用来设计流程,下面简单总结一下它的步骤: 1 设计模型 2 发布为流程,一个模型可以发布多个版本的流程 3 建立一 ...