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. Windows玩转Kubernetes系列4-搭建K8S Dashboard

    下载官方yaml文件 最新的配置文件v2.0.0-beta8版本recommended.yaml,UI地址 wget https://raw.githubusercontent.com/kuberne ...

  2. 图像读取函数cv::imread()的几种使用方式

    string imgpath = "C:\Users\Y\Pictures\miao.jpg"; OpenCV的imread()函数不支持单右斜线形式的路径,即不支持上述形式的路径 ...

  3. u盘变成Read-only file system

    先查看U盘的设备号,然后修改后重新挂载 fdisk -l sudo dosfsck -v -a /dev/sdb4  

  4. 01、学习c++必知的几个网站

    1.https://zh.cppreference.com/ 2.http://www.cplusplus.com/ 3.https://gcc.gnu.org/onlinedocs/libstdc+ ...

  5. Nginx proxy_cache 缓存静态文件

    原文链接:https://blog.csdn.net/bjgaocp/article/details/87867521 创建缓存目录mkdir /tmp/ngx_cache 添加下面语句在http{ ...

  6. How to Install Oracle Java 11 on Ubuntu 18.04 LTS (Bionic) Written by Rahul, Updated on April 3, 20

    本文系转载备份 请阅读点击下面链接阅读原文以获取更佳地阅读体验.谢谢. How to Install Oracle Java 11 on Ubuntu 18.04 LTS (Bionic) Writt ...

  7. new SparkContext()发生错误java.lang.NoSuchMethodError: scala.Predef

    参考:https://blog.csdn.net/weixin_40137479/article/details/80320324 new SparkContext(conf)发生错误: Except ...

  8. java8的ConcurrentHashMap为何放弃分段锁,为什么要使用CAS+Synchronized取代Segment+ReentrantLock

    原文地址:https://cloud.tencent.com/developer/article/1509556 推荐一篇 ConcurrentHashMap 和 HashMap 写的比较的的文章 j ...

  9. 微信小程序——自定义菜单切换栏tabbar组件

    效果图: wxml代码: <view class="top_tabbar" > <block wx:for="{{itemName}}" wx ...

  10. 5.Dockerfile 定制镜像

    概述 Dockerfile 是一个文本文件,其内包含了一条条的 指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建. 以之前的 Nginx 镜像为例,这 ...