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. 使用ASP.NET Core 3.x 构建 RESTful API - 4.1 面向外部的Model

    Entity Framework Core 使用的 Entity Model 是用来表示数据库里面的记录的. 而面向外部的 model 则表示了要传输的东西.这类 model 有时候叫做 Dto,有时 ...

  2. Json与Ajax(注册实例)

    需要在服务器上进行哈 jquery的ajax方法: // jquery请求 $.ajax({ url: "./server/slider.json", type: "po ...

  3. js替换时,空格被替换为双引号

    替换代码 str.replace(/\"/g, "'") 将双引号替换为单引号,如果字符串中,存在space(空格)时,使用以上语句将会导致空格被替换为双引号,可以使用如 ...

  4. vue项目中使用element ui上传图片到七牛

    1.获取token值 后台有接口调用直接返回token值 //请求后台拿七牛云token async getQiniuToken() { //token let uploadtoken = await ...

  5. CF1299D Around the World

    题意 \(n\)阶无向图,\(m\)条带权边,保证\(1\)不会被"超过\(3\)阶的圈"所包含.求删除与\(1\)相邻的边集,使得不存在从\(1\)出发的权值为\(0\)的非平凡 ...

  6. javascript控制台 js的调试

    一.错误查询,按F12键,点击控制台.

  7. 初入python

    初入python 一定要学好python 求1-100的和: i=1 s=0 while i<101: s=s+i i=i+1 print(s)

  8. 获取redis指定实例中所有的key

    需求:获取redis指定的实例中所有的key的名字. 千万不要使用keys *,可以使用scan命令的递归方式获取. 以下给出自己写的脚本,经过测试效果还可以. db_ip=5.5.5.101 db_ ...

  9. SpringBoot之Configuration

      在SpringBoot中可以通过@Configuration对某个类注解将该类申明为配置类,以此在代替先前spring版本中配置xml中的功能,并且增加了可读性与维护性.并且在注解类中的类方法中可 ...

  10. 841. 字符串哈希(hash)

    给定一个长度为n的字符串,再给定m个询问,每个询问包含四个整数l1,r1,l2,r2l1,r1,l2,r2,请你判断[l1,r1l1,r1]和[l2,r2l2,r2]这两个区间所包含的字符串子串是否完 ...