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的更多相关文章

  1. html 获取鼠标左键事件,滚轮点击事件,右键点击事件

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  2. SetCapture() & ReleaseCapture() 捕获窗口外的【松开左键事件】: WM_LBUTTONUP

    今天在窗口上绘图的时候,遇到一个问题:在特殊情况下,当用户在窗口中按下鼠标左键,然后移动到窗口外松开鼠标左键,这时程序中只能捕获到 WM_LBUTTONDOWN(按下) 和 WM_MOUSEMOVE( ...

  3. Swing中如何比较好的判断鼠标左键双击

    import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; im ...

  4. zend studio中ctrl+鼠标左键无法转到类或函数定义文件的解决方法

    转载自:http://blog.csdn.net/wide288/article/details/21622183 zend studio中ctrl+鼠标左键无法转到类或函数定义文件的解决方法: ze ...

  5. [Eclipse] eclipse中打开xml文件,使用ctrl+鼠标左键无法跳转至Java源文件【待解决】

    eclipse中打开xml文件,使用ctrl+鼠标左键无法跳转至Java源文件: 1. 设置eclipse ctrl + 左键打开源文件代码,如下图,设置都正常 2. 在网上找了很多种办法,均失败,在 ...

  6. Eclipse 中 ctrl+鼠标左键 快捷查看资源失效

    Eclipse 中 ctrl+鼠标左键 快捷查看资源失效 看看eclipse 工作空间配置的jdk是什么版本,看看本地环境变量中的jdk是什么版本,将二者的版本统一即可. 笔者从git上clone一个 ...

  7. C# GDI绘制矩形框,鼠标左键拖动可移动矩形框,滚轮放大缩小矩形框

    最近工作需要,要做一个矩形框,并且 用鼠标左键拖动矩形框移动其位置.网上查了一些感觉他们做的挺复杂的.我自己研究一天,做了一个比较简单的,发表出来供大家参考一下.如觉得简单,可路过,谢谢.哈哈. 先大 ...

  8. 【转】 js怎么区分出点击的是鼠标左键还是右键?

    IE 下 onMouseDown 事件有个 events.button 可以返回一个数值,根据数值判断取得用户按了那个鼠标键 events.button==0  默认.没有按任何按钮. events. ...

  9. JavaScript经典代码【二】【javascript判断用户点了鼠标左键还是右键】

    IE 下 onMouseDown 事件有个 events.button 可以返回一个数值,根据数值判断取得用户按了那个鼠标键 events.button==0 默认.没有按任何按钮. events.b ...

随机推荐

  1. Lodash是什么?

    lodash:是一个一致性.模块化.高性能的 JavaScript 实用工具库.(也就是相当于自己封装的私有方法) node里引入 // Load the full build. var _ = re ...

  2. Byte 一个字节的数据大小范围为什么是-128~127

    一个字节是8位,最高位是符号位,最高位为0则是正数.最高位为1则是负数 如果一个数是正数,最大数则为:01111111,转为十进制为127, 如果一个数是负数,按照一般人都会觉得是11111111,转 ...

  3. qt creator源码全方面分析(1)

    目录介绍 首先我们对软件源代码根目录下的各个重要文件(夹)做一个简单的介绍,对整体有一个大概的了解. 下面对目录及其内容做一个大概的初步的介绍,后面我尽量按照目录顺序进行依次介绍,当然可能会有一些交叉 ...

  4. 初识linux&常用命令&目录文件的浏览和管理

    Linux系统的主要用途:主要用于服器务器,特别是网络服务 Linux命令格式 命令   [选项]  [ 参数] 命令:告诉操作系统做什么,执行什么 选项:说明命令的运行方式(可以改变命令的功能).选 ...

  5. UVA1401 (字典树加简单dp)

    #pragma GCC optimize(2) #include <bits/stdc++.h> #define ll long long using namespace std; ; ; ...

  6. 字符串问题----去掉字符串中连续出现K个0的子串

    去掉字符串中连续出现K个0的子串 给定一个字符串str,和一个整数k, 如果str中正好有连续K 个'0'字符出现,把连续的 k 个 '0'去掉,返回处理后的子串. [解题思路] 1. 定义两个变量, ...

  7. 微信小程序调起支付API

    官方文档: https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=7_7 https://developers.weixin.q ...

  8. GYCTF easyphp 【反序列化配合字符逃逸】

    基础知识可以参考我之前写的那个 0CTF 2016 piapiapia  那个题只是简单记录了一下,学习了一下php反序列化的思路 https://www.cnblogs.com/tiaopideju ...

  9. 【大道至简】NetCore3.1快速开发框架一:集成Swagger

    在上一章节中,我们创建了基本的框架结构:https://www.cnblogs.com/fuyu-blog/p/12217647.html 下面我们测试接口和集成Swagger接口文档 一.接口测试 ...

  10. java学习笔记之IO编程—打印流和BufferedReader

    1.打印流(PrintWriter) 想要通过程序实现内容输出,其核心一定是要依靠OutputStream类,但是OutputStream类有一个最大缺点,就是这个类中的输出操作功能有限,所有的数据一 ...