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. Just a Hook HDU - 1698Just a Hook HDU - 1698 线段树区间替换

    #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> us ...

  2. 关于 DP 的一些内容

    0.关于         动态规划是编程解题的一种重要手段.1951 年美国数学家 R.Bellman 等人,根据一类多阶段问题的特点,把多阶段决策问题变换为一系列互相联系的单阶段问题,然后逐个加以解 ...

  3. Markdown数学公式如何打出回归符号

    来源:https://blog.csdn.net/garfielder007/article/details/51646604 函数.符号及特殊字符 语法 效果 语法 效果 语法 效果 \bar{x} ...

  4. Wannafly Winter Camp 2020 Day 6J K重排列 - dp

    求 \(K\) 是多少个 \(n\) 元置换的周期.\(T\leq 100, n\leq 50, K \leq 10^{18}\) Solution 置换可以被试做若干个环组成的有向图,于是考虑 dp ...

  5. Python第三方库requests的编码问题

    PS:这个解决方法可能很简单,但是这是平时的一些细节问题,所以有必要提醒一下! 首先代码不多,就是通过get方法去获取豆瓣首页信息,如图:但是会报UnicodeEncodeError: 'gbk' c ...

  6. 跨站请求伪造(Cross-site request forgery), 简称为 XSRF

    跨站请求伪造(Cross-site request forgery), 简称为 XSRF,是 Web 应用中常见的一个安全问题.前面的链接也详细讲述了 XSRF 攻击的实现方式. 当前防范 XSRF ...

  7. 获取URL地址参数方法

    //获取url参数 getQueryVariable(variable){ var query =decodeURIComponent(window.location.search.substring ...

  8. 使用git将本地项目上传至git仓库

    个人博客 地址:https://www.wenhaofan.com/article/20190508220440 介绍 一般来说开发过程中都是先在git创建远程仓库,然后fetch到本地仓库,再进行c ...

  9. ubuntu更改mysql配置文件,使其产生日志文件mysql.log

    1.打开mysql配置文件,将68,69行的注释取消掉,保存关闭 sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf 2.重启mysql服务 sudo servic ...

  10. 0级搭建类011-Oracle Linux 7.x安装(OEL 7.7) 公开

    项目文档引子系列是根据项目原型,制作的测试实验文档,目的是为了提升项目过程中的实际动手能力,打造精品文档AskScuti. 项目文档引子系列目前不对外发布,仅作为博客记录.如学员在实际工作过程中需提前 ...