VR 获取EyeController的关注事件
来源:互联网 发布:php微信一级菜单 编辑:程序博客网 时间:2024/06/01 10:05
1. 创建一个LookPoint指示点
LookPoint配置信息
Image配置信息
调整Image的Rotation Z 为-180度, 为了接下来的进度条 符合大家所熟悉的顺时针慢慢填满.
这里需要先创建一个 Sprite, 称之为lookPoint, 也就是EyeController的焦点位置
这里Material 使用的shader如下,目的是为了让这个指示点始终显示, 即使被物体遮挡.
创建好LookPoint之后, 运行,你会发现视线中心有一个圆圈指示点, 调整Panel的 scale ,让圆圈显示到合适大小, 接下来在代码里处理EyeController的关注事件
2 获取EyeController的关注事件
using UnityEngine;using System.Collections;using UnityEngine.UI;public class EyeController : MonoBehaviour { public GameObject cameraRig; public GameObject image; public Sprite initSprite; public Sprite watchingSprite; // Use this for initialization private Image img; private bool isWatching; private string lastObjName; private GameObject lastWatchedObj; public delegate void WatchingObjectDelegate(); public static event WatchingObjectDelegate watchingObject; void Start () { img = image.GetComponent<Image>(); } // Update is called once per frame void Update() { //射线 Ray ray = new Ray(this.transform.position, transform.forward ); RaycastHit hit;//存储发射射线后产生的碰撞信息hit.point /hit.distance /hit.collider //发生碰撞 if (Physics.Raycast(ray, out hit, Mathf.Infinity)) { WatchableObject obj = hit.collider.gameObject.GetComponent<WatchableObject>(); if (obj && obj.enabled == true)//有WatchableObject组件的物体,并且组件有效 { if(lastObjName == obj.name)//为同一个物体 { img.sprite = watchingSprite; if (!isWatching)//第一次进入视野 { if (obj.gameObject.GetComponent<TeleportPointObject>() == null)//如果不是TeleportPoint { cloneObject(obj); } img.fillAmount = 0f; isWatching = true; } else { if (img.fillAmount < 1f) { img.fillAmount += 0.00833333333f; } else { destroyCloneObj(); //注视时间1.5s后 if (obj.gameObject.GetComponent<TeleportPointObject>() != null)//如果是TeleportPoint { //cameraRig.transform.position = obj.transform.position; Vector3 vec = transform.position - cameraRig.transform.position; //先计算偏移量 Vector3 newPos = obj.transform.position;//获取新的position newPos.y = transform.position.y;//Eye的Y值并不改变 transform.position = newPos;//设置Eye的新position cameraRig.transform.position = transform.position - vec;//调整cameraRig的position,防止定位重新改变Eye的位置 } if (EyeController.watchingObject == null) { EyeController.watchingObject += obj.WatchingObjectDelegate; } watchingObject(); } } }else { lastObjName = obj.name; initImage(); destroyCloneObj(); if(EyeController.watchingObject != null) { EyeController.watchingObject -= obj.WatchingObjectDelegate; } } }else//为其他Collider ,但是没有WatchableObject组件 { initImage(); destroyCloneObj(); EyeController.watchingObject = null; } }else//没有碰撞 { initImage(); destroyCloneObj(); EyeController.watchingObject = null; } } //还原image为初始状态 private void initImage() { if (img.type == Image.Type.Filled) { img.fillAmount = 1f; img.sprite = initSprite; } isWatching = false; } //克隆物体 private void cloneObject(WatchableObject collidedItem) { GameObject cloneObj = Object.Instantiate(collidedItem.transform.gameObject, collidedItem.transform.position, collidedItem.transform.rotation) as GameObject; if (collidedItem.transform.parent) { cloneObj.transform.SetParent(collidedItem.transform.parent); cloneObj.transform.localScale = collidedItem.transform.localScale; } foreach (Component comp in cloneObj.GetComponents<Component>()) { if (!(comp is Transform) && !(comp is Renderer)) { Destroy(comp); } } Shader shader = Shader.Find("Valve/VR/Silhouette"); Material material = new Material(shader); material.name = "silhouette"; material.SetColor("g_vOutlineColor", Color.green); cloneObj.GetComponent<Renderer>().material = material; lastWatchedObj = cloneObj; } //销毁克隆的物体 private void destroyCloneObj() { if (lastWatchedObj) { Destroy(lastWatchedObj); } }}
0 0
- VR 获取EyeController的关注事件
- 这款在德国IFA展上广受关注的VR全景相机要开卖了
- unity3D VR开发 手柄射线的事件回调增加
- 关注最新钓鱼岛事件
- 2010互联网行业需关注的事件分析-翔子!
- 过去十年值得关注的十大技术事件
- JS 事件的获取
- input事件的获取
- input事件的获取
- 微信公众号获取未关注的用户基本信息信息(已关注或者未关注都可以)
- 微信 关注/取消关注事件
- 微信 关注/取消关注事件
- 微信开发-获取用户关注公众号的状态(是否关注公众号)
- 同步get获取所关注的最新微博
- Android获取最新技术资讯可关注的网站
- 虚拟现实-VR-UE4-获取UE4
- Xbox负责人谈为何不支持VR:过度关注VR很危险
- 微信api 关注事件
- Hough forest编译问题
- mongodb数据库操作指令
- 用安卓手机调试Logcat不显示日志的解决办法
- 关于html中iframe自动调节高度
- Spring Bean的生命周期(非常详细)
- VR 获取EyeController的关注事件
- 《peopleware》摘抄(一)
- error while loading shared libraries: libgtk-x11-2.0.so.0: cannot open shared object file
- 关于编译的一些事儿
- present半透明视图
- memcached的简单使用以及spring的集成
- java安全架构____MD5加密原理和简介
- AndroidStudio在真机运行报错
- Xposed 常用方法和技巧