VR Interaction Framework2.0插件的使用(适用于Pico串流)

这篇具有很好参考价值的文章主要介绍了VR Interaction Framework2.0插件的使用(适用于Pico串流)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        随着Pico被字节收购,追踪优化变好了,Pico的串流也越来越好用了,现在已经可以用于开发了,现在所用的设备为Pico Neo3消费版,个人感觉的使用感受是,比起上万的HTC Vive设备,几千的Pico Neo3消费版,某种程度来说是更加好用的,现在我要介绍的VR开发框架为VRIF,全称为VR Interaction Framework。

VRIF插件获取:Unity商店

VRIF官网:VRIF Wiki

为什么去学习这个框架呢?

1、它适合用多个平台,基本上来说,一次开发就可以打包到大部分的主流的平台,如:PC VR设备、Pico设备、Oculus设备等。

2、得益于Openxr和XR Interaction Toolkit的一致性,而VRIF又集成了XR Interaction Toolkit输入输出,所以它可以做到串流调式和Pico打包无缝衔接。

3、开发速度快,VRIF已经在案例中实现了很多VR开发的常用功能,只要拿来用就行。

4、作者更新快,目前已更新到了2.0,集成了 FinalIK和PhotonPUN 示例。

5、Unity主推,经测试此框架,适配了Pico Neo3/Pico Neo4系例设备

串流调式和Pico打包无缝衔接的实现基于OpenXR+XR Interaction Toolkit这方案,现在Pico最新版SDK就是此进行开发的,而Openxr和XR Interaction Toolkit这方案也适用于HTC vive和Oculus的串流。

VRIF框架的配置

可以理解为大框架,先导入大框架,然后根据要用到的设备导入相应的Sdk,这样就可以多种设备一次切换,打出多个包。

第一步:创建一个新项目,导入Unity新版本输入系统包

vr插件,Unity,VR,vr

 安装完要重启,Untiy改变输入类型都是要重启的,选Yes.vr插件,Unity,VR,vr

第二步:导入VRIF2.0包

双击VRIF2.0包导入:

vr插件,Unity,VR,vr

vr插件,Unity,VR,vr

vr插件,Unity,VR,vr

vr插件,Unity,VR,vr

 这样VRIF就导入完成了。

第三步:导入OpenXR和XR Interaction Toolkit插件

vr插件,Unity,VR,vr

打开PackageManager,点击+号,选择Add package by name。然后输入:com.unity.xr.interaction.toolkit

导入XR Interaction Toolkit插件,并更新

 vr插件,Unity,VR,vr

导入Text Mesh Pro插件

 vr插件,Unity,VR,vr

 导入默认的动作绑定资产vr插件,Unity,VR,vr

第四步:完成VRIF串流配置

vr插件,Unity,VR,vr

 修改这两项,第二个一定要选Oculus Touch Controller Profile,在Pico串流的情况手柄才能追踪,选了HTC ViveController Profile会手柄追踪不了的。vr插件,Unity,VR,vr

设置VRIF的输入输出,也可什么也不勾,一样能正常使用,UI射线也不会有问题。

 vr插件,Unity,VR,vr

vr插件,Unity,VR,vr

 vr插件,Unity,VR,vr

好了,现在运行这个XR Demo,用Pico串流就可以走SteamVR平台来流玩这个场景了

vr插件,Unity,VR,vr

勾选了XR Interaction Toolkit,会导致UI射线有问题,则:

vr插件,Unity,VR,vr

vr插件,Unity,VR,vr

vr插件,Unity,VR,vr

 取消勾选后,VRIF的射线就没问题了vr插件,Unity,VR,vr

第五步:导入PicoSDK,完成项目配置

 去官网下载最新的SDKvr插件,Unity,VR,vr

 解压并将此包放到项目的Assets同级目录下,防止此包某天被删除,再打开就报错了。

vr插件,Unity,VR,vr

 打开PackageManager,点击+号,选择Add package by disl.....。然后找到此包并导入,导入后Apply一下 

vr插件,Unity,VR,vr

勾选Pico

vr插件,Unity,VR,vr

 vr插件,Unity,VR,vr

vr插件,Unity,VR,vr

最后,打包 

vr插件,Unity,VR,vr

vr插件,Unity,VR,vr

现在打包出来Pico就可以使用了

打包的不同平台

之前已经打包了Pico平台了,现在打包Oculus设备

安装Oculus XR Plugin插件

vr插件,Unity,VR,vr

 取消勾选Pico,勾选OCulus直接打包就可以了

vr插件,Unity,VR,vr

 打包SteamVR,切换成window平台,要在BNG Framework/Integrations/SteamVR/SteamVR路径里面,导入一个包用于StamVR输入,试一下打包,不行再导入SteamVr2.0整个包,请参考:VR Interaction Framework插件的使用_vrif-CSDN博客文章浏览阅读2.8k次,点赞3次,收藏22次。随着VR技术越来越成熟,Untiy版本的不断更新,steamVR和VRTK等旧版本插件不再完美适配最新版本的Unity编辑器,编辑器和插件经常各种报错,推荐使用VRIF进行VR开发,该框架使可以轻松创建自己的交互对象并快速提高工作效率,最大的优势是可以支持所有与 Unity 兼容的 VR眼镜并且和各种新版本Unity编辑器兼容性好。本文主要记录VRIF的环境搭建,基于SteamVR的HTC设备一、软件和插件的获取软件建议使用一个长期支持(LTS)版本的Unity,比较稳定,并且有广泛的支持。对于大多_vrifhttps://blog.csdn.net/weixin_44733991/article/details/125034189?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170391688816800182774826%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=170391688816800182774826&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-2-125034189-null-null.142^v99^pc_search_result_base6&utm_term=vrif&spm=1018.2226.3001.4187vr插件,Unity,VR,vr

VRIF的UI的Bug问题 

当按下按钮后,不抬起来,Button的颜色变不回来 

vr插件,Unity,VR,vr

修改VRIF的VRUISystem的源码

vr插件,Unity,VR,vr

 修改为,下面这样的:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.InputSystem;
using UnityEngine.UI;

namespace BNG
{

    public class VRUISystem : BaseInputModule
    {

        [Header("XR Controller Options : ")]
        [Tooltip("This setting determines if LeftPointerTransform or RightPointerTransform will be used as a forward vector for World Space UI events")]
        public ControllerHand SelectedHand = ControllerHand.Right;

#if XRIT_INTEGRATION
        [Header("XR Interaction Toolkit Options : ")]
        public bool UseXRInteractionToolkitUISystem = true;

#endif

        [Tooltip("A transform on the left controller to use when raycasting for world space UI events")]
        public Transform LeftPointerTransform;

        [Tooltip("A transform on the right controller to use when raycasting for world space UI events")]
        public Transform RightPointerTransform;

        [Tooltip("Controller Binding to use for input down, up, etc.")]
        public List<ControllerBinding> ControllerInput = new List<ControllerBinding>() { ControllerBinding.RightTrigger };

        [Tooltip("Unity Input Action used to simulate a click or touch event")]
        public InputActionReference UIInputAction;

        [Tooltip("If true a PhysicsRaycaster component will be added to the UI camera, allowing physical objects to use IPointer events such as OnPointClick, OnPointEnter, etc.")]
        public bool AddPhysicsRaycaster = false;

        public LayerMask PhysicsRaycasterEventMask;

        [Tooltip("If true the Right Thumbstick will send scroll events to the UI")]
        public bool RightThumbstickScroll = true;

        [Header("Shown for Debug : ")]
        public GameObject PressingObject;
        public GameObject DraggingObject;
        public GameObject ReleasingObject;

        public PointerEventData EventData { get; private set; }

        Camera cameraCaster;

        private GameObject _initialPressObject;
        private bool _lastInputDown;
        bool inputDown;

        private static VRUISystem _instance;
        public static VRUISystem Instance
        {
            get
            {
                if (_instance == null)
                {
                    _instance = GameObject.FindObjectOfType<VRUISystem>();

                    if (_instance == null)
                    {
                        // Check for existing event system
                        EventSystem eventSystem = EventSystem.current;
                        if (eventSystem == null)
                        {
                            eventSystem = new GameObject("EventSystem").AddComponent<EventSystem>(); ;
                        }

                        _instance = eventSystem.gameObject.AddComponent<VRUISystem>();
                    }
                }

                return _instance;
            }
        }

        protected override void Awake()
        {
#if XRIT_INTEGRATION
            if(!UseXRInteractionToolkitUISystem) {
                initEventSystem();
            }
#else
            initEventSystem();
#endif
        }

        protected virtual void initEventSystem()
        {
            UpdateControllerHand(SelectedHand);

            AssignCameraToAllCanvases(cameraCaster);

            EventData = new PointerEventData(eventSystem);
            EventData.position = new Vector2(cameraCaster.pixelWidth / 2, cameraCaster.pixelHeight / 2);
        }

        protected override void Start()
        {
            base.Start();

#if XRIT_INTEGRATION
            if (UseXRInteractionToolkitUISystem) {
                AssignCameraToAllCanvases(Camera.main);

                if (this.gameObject.activeSelf) {
                    // Debug.Log("Diabling VRIF's VRUISystem since XR Interaction Kit UI support is enabled");
                    this.enabled = false;
                }
            }
#else
            AssignCameraToAllCanvases(cameraCaster);
#endif
        }

        void init()
        {
            if (cameraCaster == null)
            {

                // Create the camera required for the caster.
                // We can reduce the fov and disable the camera component for performance
                var go = new GameObject("CameraCaster");
                cameraCaster = go.AddComponent<Camera>();
                cameraCaster.stereoTargetEye = StereoTargetEyeMask.None;
                cameraCaster.fieldOfView = 5f;
                cameraCaster.nearClipPlane = 0.01f;
                cameraCaster.clearFlags = CameraClearFlags.Nothing;
                cameraCaster.enabled = false;

                // Add PhysicsRaycaster so other objects can subscribe to IPointer events
                if (AddPhysicsRaycaster)
                {
                    var pr = go.AddComponent<PhysicsRaycaster>();
                    pr.eventMask = PhysicsRaycasterEventMask;
                }
            }
        }

        public override void Process()
        {
#if XRIT_INTEGRATION
            // XRIT doesn't process here
            if(UseXRInteractionToolkitUISystem == false) {
                DoProcess();
            }
#else
            DoProcess();
#endif
        }

        public void DoProcess()
        {
            // Input isn't ready if this Camera Caster's gameObject isn't active
            if (EventData == null || !CameraCasterReady())
            {
                return;
            }

            EventData.position = new Vector2(cameraCaster.pixelWidth / 2, cameraCaster.pixelHeight / 2);

            eventSystem.RaycastAll(EventData, m_RaycastResultCache);

            EventData.pointerCurrentRaycast = FindFirstRaycast(m_RaycastResultCache);
            m_RaycastResultCache.Clear();

            // Handle Hover
            HandlePointerExitAndEnter(EventData, EventData.pointerCurrentRaycast.gameObject);

            // Handle Drag
            ExecuteEvents.Execute(EventData.pointerDrag, EventData, ExecuteEvents.dragHandler);

            // Handle scroll
            if (RightThumbstickScroll)
            {
                EventData.scrollDelta = InputBridge.Instance.RightThumbstickAxis;
                if (!Mathf.Approximately(EventData.scrollDelta.sqrMagnitude, 0))
                {
                    ExecuteEvents.Execute(ExecuteEvents.GetEventHandler<IScrollHandler>(EventData.pointerCurrentRaycast.gameObject), EventData, ExecuteEvents.scrollHandler);
                }
            }

            // Press Events
            inputDown = InputReady();

            // On Trigger Down > TriggerDownValue this frame but not last
            if (inputDown && _lastInputDown == false)
            {
                PressDown();
            }
            // On Held Down
            else if (inputDown)
            {
                //Press();
            }
            // On Release
            else
            {
                Release();
            }

            _lastInputDown = inputDown;
        }

        public virtual bool InputReady()
        {

            // Input isn't ready if this Camera Caster's gameObject isn't active
            if (!CameraCasterReady())
            {
                return false;
            }

            // Check Unity Action
            if (UIInputAction != null && UIInputAction.action.ReadValue<float>() == 1f)
            {
                return true;
            }

            // Check for bound controller button
            for (int x = 0; x < ControllerInput.Count; x++)
            {
                if (InputBridge.Instance.GetControllerBindingValue(ControllerInput[x]))
                {
                    return true;
                }
            }

            return false;
        }


        /// <summary>
        /// Returns true if we have a camera caster enabled and ready to send out data
        /// Returns false if the camera caster is null or it's gameobject is disabled
        /// </summary>
        /// <returns></returns>
        public virtual bool CameraCasterReady()
        {
            if (cameraCaster != null && !cameraCaster.gameObject.activeInHierarchy)
            {
                return false;
            }

            return true;
        }

        public virtual void PressDown()
        {
            EventData.pointerPressRaycast = EventData.pointerCurrentRaycast;

            // Deselect if selection changed
            if (_initialPressObject != null)
            {
                ExecuteEvents.Execute(_initialPressObject, EventData, ExecuteEvents.deselectHandler);
                _initialPressObject = null;
            }

            _initialPressObject = ExecuteEvents.GetEventHandler<IPointerClickHandler>(EventData.pointerPressRaycast.gameObject);

            // Set Press Objects and Events
            SetPressingObject(_initialPressObject);
            ExecuteEvents.Execute(EventData.pointerPress, EventData, ExecuteEvents.pointerDownHandler);

            // Set Drag Objects and Events
            SetDraggingObject(ExecuteEvents.GetEventHandler<IDragHandler>(EventData.pointerPressRaycast.gameObject));
            ExecuteEvents.Execute(EventData.pointerDrag, EventData, ExecuteEvents.beginDragHandler);
        }

        public virtual void Press()
        {
            EventData.pointerPressRaycast = EventData.pointerCurrentRaycast;

            // Set Press Objects and Events
            SetPressingObject(ExecuteEvents.GetEventHandler<IPointerClickHandler>(EventData.pointerPressRaycast.gameObject));
            ExecuteEvents.Execute(EventData.pointerPress, EventData, ExecuteEvents.pointerDownHandler);

            // Set Drag Objects and Events
            SetDraggingObject(ExecuteEvents.GetEventHandler<IDragHandler>(EventData.pointerPressRaycast.gameObject));
            ExecuteEvents.Execute(EventData.pointerDrag, EventData, ExecuteEvents.beginDragHandler);
        }

        public virtual void Release()
        {
            SetReleasingObject(ExecuteEvents.GetEventHandler<IPointerClickHandler>(EventData.pointerCurrentRaycast.gameObject));
            // Considered a click event if released after an initial click
            if (EventData.pointerPress == ReleasingObject)
            {
                ExecuteEvents.Execute(EventData.pointerPress, EventData, ExecuteEvents.pointerClickHandler);
            }
            ExecuteEvents.Execute(EventData.pointerPress, EventData, ExecuteEvents.pointerUpHandler);
            ExecuteEvents.Execute(EventData.pointerDrag, EventData, ExecuteEvents.endDragHandler);
            // Send deselect to
            ExecuteEvents.Execute(ReleasingObject, EventData, ExecuteEvents.deselectHandler);
            ClearAll();
        }

        public virtual void ClearAll()
        {
            SetPressingObject(null);
            SetDraggingObject(null);

            EventData.pointerCurrentRaycast.Clear();
        }

        public virtual void SetPressingObject(GameObject pressing)
        {
            EventData.pointerPress = pressing;
            PressingObject = pressing;
        }

        public virtual void SetDraggingObject(GameObject dragging)
        {
            EventData.pointerDrag = dragging;
            DraggingObject = dragging;
        }

        public virtual void SetReleasingObject(GameObject releasing)
        {
            ReleasingObject = releasing;
        }

        public virtual void AssignCameraToAllCanvases(Camera cam)
        {
            Canvas[] allCanvas = FindObjectsOfType<Canvas>();
            for (int x = 0; x < allCanvas.Length; x++)
            {
                AddCanvasToCamera(allCanvas[x], cam);
            }
        }

        public virtual void AddCanvas(Canvas canvas)
        {
#if XRIT_INTEGRATION
            if(UseXRInteractionToolkitUISystem) {
                AddCanvasToCamera(canvas, Camera.main);

                // Add raycaster if not already present
                canvas.gameObject.AddComponent<UnityEngine.XR.Interaction.Toolkit.UI.TrackedDeviceGraphicRaycaster>();
            }
            else {
                AddCanvasToCamera(canvas, cameraCaster);
            }
#else
            AddCanvasToCamera(canvas, cameraCaster);
#endif
        }

        public virtual void AddCanvasToCamera(Canvas canvas, Camera cam)
        {
            if (cam != null)
            {
                canvas.worldCamera = cam;
            }
        }

        public virtual void UpdateControllerHand(ControllerHand hand)
        {

            // Make sure variables exist
            init();

            // Setup the Transform
            if (hand == ControllerHand.Left && LeftPointerTransform != null)
            {
                cameraCaster.transform.parent = LeftPointerTransform;
                cameraCaster.transform.localPosition = Vector3.zero;
                cameraCaster.transform.localEulerAngles = Vector3.zero;
            }
            else if (hand == ControllerHand.Right && RightPointerTransform != null)
            {
                cameraCaster.transform.parent = RightPointerTransform;
                cameraCaster.transform.localPosition = Vector3.zero;
                cameraCaster.transform.localEulerAngles = Vector3.zero;
            }
        }
    }
}

Button的导航选为None,这个在Andoroid上点用都没有,还会导致UGUI有Bug

vr插件,Unity,VR,vr

这样VRIF的交互与UGUI就行了,射线进入为Highlighted Color,按下为Pressed Color,Selected Color不触发。

vr插件,Unity,VR,vr

 现在Bug就解决了,也实现了一次开发多个平台的分发,也可以串流实时调式了,如果是Pico要应用加密,则在XR Rig Advanced加上PXR Manager脚本就行了。

完结!!!

撒花!!!文章来源地址https://www.toymoban.com/news/detail-599987.html

到了这里,关于VR Interaction Framework2.0插件的使用(适用于Pico串流)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用U3D、pico开发VR(一)——将unity的场景在设备中呈现

           最近srtp项目在赶进度,自己之前是在电脑端进行的开发。但是项目是VR端,因此需要重新学习,在此记录一下自己的学习经历。        首先,如何将unity的场景在自己的眼镜中进行呈现呢?        对此,我也找了很多教程,也跟着花了很多时间去做。从国内的

    2024年01月17日
    浏览(49)
  • UE5使用Advanced-VR-Framework开发VR介绍

    插件地址:https://www.unrealengine.com/marketplace/zh-CN/product/advanced-vr-framework UE5在三维的表现力上非常优秀;有基于Twinmotion等三维工具支持,制作流程上比较顺畅;UE5场景素材也非常多且优质,VR技术框架也齐全。所以,UE5非常适合开发VR。 Advanced-VR-Framework VR Expansion Plugin : https://

    2024年02月12日
    浏览(28)
  • PIco4发布使用UNITY开发的Vr应用,格式为apk,安装的时候发生解析错误

    参考链接 : adb install APK报错Failure [INSTALL_FAILED_TEST_ONLY: installPackageLI]_调用者不被允许测试的测试程序_小龙在山东的博客-CSDN博客 Pico Developer Answers 完成项目配置 - PICO 开发者平台 如何将apk、obb文件打包至pico设备中 - 掘金 Requires newer sdk version #30 (current version is #28) · Issue #633

    2024年02月04日
    浏览(47)
  • Pico neo3 pico4第三方VR游戏资源分享 Pico 4一体机安装VR游戏教程

    。 当我们入手VR眼镜的初心都是想用来体验身临其境的3D虚拟视觉,无论是玩游戏,还是看电影都是为了体验VR设备给我们带来的顶级感官感受,享受科技带来的视觉体验。 我们的VR设备到手的第一步肯定是要先串流到电脑,然后和steam连接,并下载好steamVR,这样我们的基础设

    2024年02月09日
    浏览(36)
  • Unity VR 开发教程 OpenXR+XR Interaction Toolkit(八)手指触控 Poke Interaction

    此教程相关的详细教案,文档,思维导图和工程文件会放入 Spatial XR 社区 。这是一个高质量知识星球 XR 社区,博主目前在内担任 XR 开发的讲师。此外,该社区提供教程答疑、及时交流、进阶教程、外包、行业动态等服务。 社区链接: Spatial XR 高级社区(知识星球) Spatial

    2024年02月12日
    浏览(29)
  • Unity VR:XR Interaction Toolkit 官方 Demo

    Unity XR Interaction Toolkit 提供了一个官方 Demo,包含了丰富的功能演示,可以供大家更好地学习 VR 开发。 项目地址:https://github.com/Unity-Technologies/XR-Interaction-Toolkit-Examples)(不要选择 CSDN 的 Github 加速打开) 项目里包括多个演示场景,而 XRI_Examples_Main 是多个演示功能的整合,包

    2024年02月06日
    浏览(30)
  • 【PICO】【Unity】【VR】如何对打包后的PICO项目有效Debug

    PICO项目打包后再运行就看不到Console了。当然,会有各类专业的Debug工具。 有一类Debug的工具是Preview形式下展示Debug信息,但是发现Preview成功不见得打包也成功。 打包后也会有一些Debug工具,不过这里我给出自己的简单解决办法。 Unity Console的Debug是展示信息,所以我们也在游

    2024年01月21日
    浏览(34)
  • Unity VR 开发教程 OpenXR+XR Interaction Toolkit (四) 传送

    此教程相关的详细教案,文档,思维导图和工程文件会放入 Spatial XR 社区 。这是一个高质量知识星球 XR 社区,博主目前在内担任 XR 开发的讲师。此外,该社区提供教程答疑、及时交流、进阶教程、外包、行业动态等服务。 社区链接: Spatial XR 高级社区(知识星球) Spatial

    2024年02月12日
    浏览(48)
  • 【unity】【vr】新版Unity中找不到xr interaction toolkit

    unity中开发VR相关游戏和应用少不了一个很重要的Package:XR interaction toolkit。 但是新版unity中发现没了这个包,这篇介绍解决办法。 之前的unity版本中,默认状况下也是看不到XR interaction toolkit的。 需要在package设定中打开高级设定,允许用户看到pre-release版本,然后拉到列表底

    2024年02月11日
    浏览(50)
  • 从零开始的PICO教程(2)--搭建VR场景并打包至PICO中运行

    在开发VR游戏的时候, 第一个要解决的问题就是PICO环境配置 ,为了验证自己的环境配置是否正确,这里以能否打包到PICO 上运行为标准。衡量你们的环境配置是否正确,向注定波澜壮阔的虚拟世界发出一声:Hello World!WoW! 1、大纲 经过该教程你将学会 如何搭建一个简单的场

    2024年02月03日
    浏览(65)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包