SteamVR2.0开发指南(Yanlz+Unity+SteamVR+Plugin+OpenVR+InputSystem+Kunckles+VIVE+Oculus+OpenXR+立钻哥哥++ok++)

《SteamVR2.0开发指南》

版本

作者

参与者

完成日期

备注

SteamVR2.0_Guide_V01_1.0

严立钻

 

2019.01.23

 

 

 

 

 

 

 

++++SteamVR2.0开发指南https://blog.csdn.net/VRunSoftYanlz/article/details/86618187

++++SteamVR2.2.0开发指南https://blog.csdn.net/VRunSoftYanlz/article/details/88784527

 

##《SteamVR2.0开发指南》发布说明:

++++“SteamVR2.0开发指南”:是对“SteamVR2.0”的入门指导;(2019年度的重点技术突破点确立为:“SteamVR”

++++“SteamVR2.0开发指南”:定位在熟悉SteamVR框架

++++OpenVR的Github:https://github.com/ValveSoftware/openvr

++++OpenXR官网:https://www.khronos.org/openxr

++++SteamVR的Github:https://github.com/ValveSoftware/steamvr_unity_plugin

 

 

 

##《SteamVR2.0开发指南》目录

#第一篇:网络杂谈

#第二篇:视频杂谈

#第三篇:文档杂谈

#第四篇:项目杂谈

SteamVR2.0开发指南(Yanlz+Unity+SteamVR+Plugin+OpenVR+InputSystem+Kunckles+VIVE+Oculus+OpenXR+立钻哥哥++ok++)_第1张图片

 

 

 

 

 

#第一篇:网络杂谈篇

#第一篇:网络杂谈篇

#第一篇:网络杂谈篇

++++立钻哥哥:“网络杂谈篇”是对SteamVR2.0知识的全网搜索,利用“SteamVR2.0”关键字百度整理

++++A.1、SteamVR2.0插件使用指南

++++A.2、

 

 

 

 

##A.1、SteamVR2.0插件使用指南

##A.1、SteamVR2.0插件使用指南

++A.1、SteamVR2.0插件使用指南

++++立钻哥哥:随着VR生态的日益增长,以及Valve Knuckles控制器的逐渐完善,SteamVR未来能够提供给用户更多的交互方式,比如手指跟踪和力反馈

++++近期,Valve在Unity资源商店中将SteamVR插件更新到了2.0版:

SteamVR2.0开发指南(Yanlz+Unity+SteamVR+Plugin+OpenVR+InputSystem+Kunckles+VIVE+Oculus+OpenXR+立钻哥哥++ok++)_第2张图片

 

 

++概述

++++立钻哥哥:三年前(2015年),SteamVR SDK for Unity插件的第一个版本在Unity资源商店发布,在以后的时间里,VR生态发生了很多变化,比较显著的是出现了很多不同类型的控制器,如下图:

SteamVR2.0开发指南(Yanlz+Unity+SteamVR+Plugin+OpenVR+InputSystem+Kunckles+VIVE+Oculus+OpenXR+立钻哥哥++ok++)_第3张图片

++++随着越来越多的VR设备推出,控制器类型逐渐趋向于碎片化;每当有新的控制器发布,都会给开发者带来一些额外的工作量:游戏项目需要修改交互代码以适配新的设备
++++从开发层面上来看,不同的控制器具有不同的键值映射,所以,当现有VR应用程序移植到另外一个VR平台的时候,需要针对目标平台进行交互适配;鉴于此,Valve为Unity开发者推出了SteamVR Unity Plugin2.0(简称SteamVR2.0),能够使开发者在编程中专注于用户的动作,而不是具体的控制器按键

 

 

++重要更新:Input System

++++立钻哥哥:SteamVR2.0的重要更新是加入了[Input System]

++++推出[Input System]的目的,是为了更加符合OpenXR标准,以及配合即将正式推出的Knuckles控制器

++++目前多数主流VR平台均加入了OpenXR开放标准:

SteamVR2.0开发指南(Yanlz+Unity+SteamVR+Plugin+OpenVR+InputSystem+Kunckles+VIVE+Oculus+OpenXR+立钻哥哥++ok++)_第4张图片

 

++++[Input System]与之前处理用户输入有显著的不同,使用[SteamVR Input System],开发人员可以在应用程序之外定义默认的动作并与按键进行绑定,而不需要将输入视为某一特定设备的特定按键;这样新的设备可以快速适配应用程序,无需更改代码

++++比如:当开发者检测玩家是否抓取某个物体的时候,不是检测Vive等控制器的Trigger键或Oculus Touch控制器的Grip键是否被按下,而是检测预定义的“Grab”动作是否为True即可;(作为开发者,可以在SteamVR中为Grab动作设置默认按键和阈值,当程序运行时,也可修改这些数值以满足玩家的个人偏好);基于这种机制,不光能够解决控制器碎片化的问题,也可以快速适配未来发布的设备

 

++动作(Actions)

++++立钻哥哥:[Input System]的核心概念是动作(Action),基于动作的输入系统对于游戏引擎来说更有意义,Unreal一直在沿用这种方案,而Unity目前在开发中的输入系统也将遵循这一原则

++++开发中需要放弃之前关于“按下某个按键发生什么事情”的思想,取而代之的是使用“做出某个动作发生什么事情”的思想

++++SteamVR2.0将动作抽象为以下6种类型:BooleanSingleVector2Vector3PoseSkeleton等类型

++++[Boolean]类型的动作代表只有两种状态的动作:TrueFalse,比如抓取(Grab)动作,只有抓取或未抓取两种状态,不存在中间状态;(在Unity中对应类为:SteamVR_Action_Boolean

++++[Single]类型的动作能够返回0~1之间的数值,比如Trigger键按下到松开的过程;(在Unity中对应类为:SteamVR_Action_Single

++++[Vector2]类型动作能够返回二维数,比如Touchpad上的触摸或手柄摇杆;使用这样的数值能够控制物体在四个方向的运动,典型的应用是使用Touchpad控制无人机或小车的运动;(在Unity中对应类为:SteamVR_Action_Vector2

++++[Vector3]类型的动作能够返回三维数值;(在Unity中对应类为SteamVR_Action_Vector3)

++++[Pose]类型的动作表示三维空间中的位置和旋转,一般用于跟踪VR控制器;(在Unity中对应类为SteamVR_Action_Pose;

++++[Skeleton]类型的动作能够获取用户在持握手柄控制器时的手指关节数据,通过返回数据,结合手部渲染模型,能够更加真实的呈现手部在虚拟世界的姿态,虽然不及像Leap Motion等设备获取手指输入那样精确,但是足以获得良好的沉浸感;(在Unity中对应类为:SteamVR_Action_Skeleton

 

 

++SteamVR2.0目录结构

++++立钻哥哥:首先来利用Xmind看一下目录结构:

SteamVR2.0开发指南(Yanlz+Unity+SteamVR+Plugin+OpenVR+InputSystem+Kunckles+VIVE+Oculus+OpenXR+立钻哥哥++ok++)_第5张图片

 

 

++SteamVR2.0更新说明

++++A.1.1、概述

++++A.1.2、重要更新:[Input System]

++++A.1.3、动作(Actions)

++++A.1.4、动作集(Action Sets)

++++A.1.5、SteamVR Input窗口

++++A.1.6、测试动作

++++A.1.7、动作绑定

++++A.1.8、在代码中使用动作

++++A.1.9、[Interaction System]的变化

++++A.1.10、VRTK是否能够继续结合SteamVR2.0使用

 

 

 

 

 

###A.1.1、概述

###A.1.1、概述

++A.1.1、概述

++++立钻哥哥:随着越来越多的VR设备推出,控制器类型逐渐趋向于碎片化;每当有新的控制器发布,都会给开发者带来一些额外的工作量:游戏项目需要修改交互代码以适配新的设备
++++从开发层面上来看,不同的控制器具有不同的键值映射,所以,当现有VR应用程序移植到另外一个VR平台的时候,需要针对目标平台进行交互适配;鉴于此,ValveUnity开发者推出了SteamVR Unity Plugin2.0(简称SteamVR2.0),能够使开发者在编程中专注于用户的动作,而不是具体的控制器按键

++++SteamVR2.0开发指南https://blog.csdn.net/VRunSoftYanlz/article/details/86618187

++++SteamVR2.2.0开发指南https://blog.csdn.net/VRunSoftYanlz/article/details/88784527

 

 

 

 

###A.1.2、重要更新:[Input System]

###A.1.2、重要更新:[Input System]

++A.1.2、重要更新:[Input System]

++++立钻哥哥:SteamVR2.0的重要更新是加入了[Input System]

++++推出[Input System]的目的,是为了更加符合OpenXR标准,以及配合即将正式推出的Knuckles控制器

++++目前多数主流VR平台均加入了OpenXR开放标准:

++++[Input System]与之前处理用户输入有显著的不同,使用[SteamVR Input System],开发人员可以在应用程序之外定义默认的动作并与按键进行绑定,而不需要将输入视为某一特定设备的特定按键;这样新的设备可以快速适配应用程序,无需更改代码

++++比如:当开发者检测玩家是否抓取某个物体的时候,不是检测Vive等控制器的Trigger键或Oculus Touch控制器的Grip键是否被按下,而是检测预定义的“Grab”动作是否为True即可;(作为开发者,可以在SteamVR中为Grab动作设置默认按键和阈值,当程序运行时,也可修改这些数值以满足玩家的个人偏好);基于这种机制,不光能够解决控制器碎片化的问题,也可以快速适配未来发布的设备

 

 

 

 

 

###A.1.3、动作(Actions)

###A.1.3、动作(Actions)

++A.1.3、动作(Actions)

++++A.1.3.1、骨骼输入

++++A.1.3.2、振动输出

++++立钻哥哥:[Input System]的核心概念是动作(Action),基于动作的输入系统对于游戏引擎来说更有意义,Unreal一直在沿用这种方案,而Unity目前在开发中的输入系统也将遵循这一原则

++++开发中需要放弃之前关于“按下某个按键发生什么事情”的思想,取而代之的是使用“做出某个动作发生什么事情”的思想

++++SteamVR2.0将动作抽象为以下6种类型:BooleanSingleVector2Vector3PoseSkeleton等类型

++++[Boolean]类型的动作代表只有两种状态的动作:TrueFalse,比如抓取(Grab)动作,只有抓取或未抓取两种状态,不存在中间状态;(在Unity中对应类为:SteamVR_Action_Boolean

++++[Single]类型的动作能够返回0~1之间的数值,比如Trigger键按下到松开的过程;(在Unity中对应类为:SteamVR_Action_Single

++++[Vector2]类型动作能够返回二维数,比如Touchpad上的触摸或手柄摇杆;使用这样的数值能够控制物体在四个方向的运动,典型的应用是使用Touchpad控制无人机或小车的运动;(在Unity中对应类为:SteamVR_Action_Vector2

++++[Vector3]类型的动作能够返回三维数值;(在Unity中对应类为SteamVR_Action_Vector3)

++++[Pose]类型的动作表示三维空间中的位置和旋转,一般用于跟踪VR控制器;(在Unity中对应类为SteamVR_Action_Pose;

++++[Skeleton]类型的动作能够获取用户在持握手柄控制器时的手指关节数据,通过返回数据,结合手部渲染模型,能够更加真实的呈现手部在虚拟世界的姿态,虽然不及像Leap Motion等设备获取手指输入那样精确,但是足以获得良好的沉浸感;(在Unity中对应类为:SteamVR_Action_Skeleton

 

 

 

 

++A.1.3.1、骨骼输入

++++立钻哥哥:对于骨骼输入,Knuckles控制器为SteamVR体验带来了手指跟踪功能,能够估算用户手指的位置,然后将数据传递给驱动程序,驱动程序将其对应解析到手部模型的31块骨骼上,从而给用户带来更好的沉浸式体验

++++该功能并不是Knuckles所独有,SteamVR还能够为HTC ViveOculus Touch这样的设备提供手指状态估算,比如判断手部是否打开,手指是否放置在Touchpad上

++++同时Valve公司还将与Microsoft展开合作,以增加对Windows MR控制器的支持

++++默认情况下,运行[Interaction System]示例场景中能够同时看到手部和控制器模型,此外,还有一个辅助组件[SteamVR_Behaviour_Skeleton],如下图所示

SteamVR2.0开发指南(Yanlz+Unity+SteamVR+Plugin+OpenVR+InputSystem+Kunckles+VIVE+Oculus+OpenXR+立钻哥哥++ok++)_第6张图片

 

 

++SteamVR/Input/SteamVR_Action_Skeleton.cs

++++立钻哥哥:\Assets\SteamVR\Input\SteamVR_Action_Skeleton.cs

using UnityEngine;

using System.Collections;

using System;

using System.Runtime.InteropServices;

using System.Collections.Generic;

 

namespace Valve.VR{

     //Skeleton Actions are our best approximation of where your hands are while holding vr controllers and pressing buttons. We give you 31 bones to help you animate hand models. For more information check out this blog past:https://steamcommunity.com/games/250820/announcements/detail/1690421280625220068

 (立钻哥哥:当你手持vr控制器并按下按钮时,骨架动作是你的手的最佳近似值。我们给你31块骨头来帮助你制作手的动画模型。想了解更多信息,请访问这个博客:https://steamcommunity.com/games/250820/announcements/detail/1690421280625220068

    public class SteamVR_Action_Skeleton : SteamVR_Action_Pose{

        public const int numBones = 31;

 

        [NonSerialized]

        protected List<Vector3[]> bonePositions = new List<Vector3[]>();

 

        [NonSerialized]

        protected List<Quaternion[]> boneRotations = new List<Quaternion[]>();

 

        [NonSerialized]

        protected List<Vector3[]> lastBonePositions = new List<Vector3[]>();

 

        [NonSerialized]

        protected List<Quaternion[]> lastBoneRotations = new List<Quaternion[]>();

 

        [NonSerialized]

        protected Dictionary<SteamVR_Input_Sources, EVRSkeletalMotionRange> rangeOfMotion = new Dictionary<SteamVR_Input_Sources, EVRSKeletalMotionRange>(new SteamVR_Input_Sources_Comparer());

 

        [NonSerialized]

        protected VRBoneTransform_t tempBoneTransforms = new VRBoneTransform_t[numBones];

    

        [NonSerialized]

        protected InputSkeletalActionData_t tempSkeletorActionData = new InputSkeletalActionData_t();

 

        [NonSerialized]

        protected uint skeletonActionData_size = 0;

 

        [NonSerialized]

        protected Dictionary<SteamVR_Input_Sources, EVRSkelealTransformSpace> skeletalTransformSpace = new Dictionary<SteamVR_Input_Sources, EVRSkeletalTransformSpace>(new SteamVR_Input_Sources_Comparer());

 

            public override void Initialize(){}

            protected override void InitializeDictionaries(SteamVR_Input_Sources source){}

            public override void UpdateValue(SteamVR_Input_Sources inputSource){}

            public override void UpdateValue(SteamVR_Input_Sources inputSource, bool skipStateAndEventUpdates){}

 

            public Vector3[] GetBonePositions(SteamVR_Input_Sources inputSource){}

            public Quaternion[] GetBoneRotations(SteamVR_Input_Sources inputSource){}

            public Vector3[] GetLastBonePositions(SteamVR_Input_Sources inputSource){}

            public Quaternion[] GetLastBoneRotations(SteamVR_Input_Sources inputSource){}

 

            //Set the range of the motion of the bones in this skeleton. Options are With Controller as if your hand is holding your VR controller. Or Without Controller as if your hand is empty.(立钻哥哥:设定骨骼运动的范围。选项是“With Controller”,就像你的手握着VR控制器一样。或者“没有控制器”,就好像你的手是空的。

            public void SetRangeOfMotion(SteamVR_Input_Sources inputSource, EVRSkeletalMotionRange range){}

 

            //Sets the space that youll get bone data back in. Options are relative to the Model, relative to the Parent bone, and Additive.(立钻哥哥:设置你会得到骨头数据的空间。选项是相对于模型、相对于父骨骼和附加的。

            public void SetSkeletalTransformSpace(SteamVR_Input_Sources inputSource, EVRSkeletalTransformSpace space){}

    

    }    //立钻哥哥:public class SteamVR_Action_Skeleton:SteamVR_Action_Pose{}

 

    //The change in range of the motion of the bones in the skeleton. Options are With Controller as if your hand is holding your VR controller. Or Without Controller as if your hand is empty.(立钻哥哥:骨骼运动范围的变化。选项是“With Controller”,就像你的手握着VR控制器一样。或者“没有控制器”,就好像你的手是空的。

    public enum SkeletalMotionRangeChange{

        None = -1,

        WithController = 0,

        WithoutController = 1,

    }    //立钻哥哥:public enum SkeletalMotionRangeChange{}

 

}    //立钻哥哥:namespace Valve.VR{}

 

 

 

++A.1.3.2、振动输出

++++立钻哥哥:目前还有一种输出动作:振动,用于触发VR控制器上的触觉反馈,调用方法如下:

SteamVR_Input._default.outActions.Haptic.Execute(float secondsFromNow, float durationSeconds, float frequency, float amplitude, SteamVR_Input_Sources inputSource);

 

++SteamVR/Input/SteamVR_Action_Out.cs

++++立钻哥哥:\Assets\SteamVR\Input\SteamVR_Action_Out.cs

using UnityEngine;

using System.Collections;

using System;

using Valve.VR;

using System.Runtime.InteropServices;

 

namespace Valve.VR{

    //There is currently only one output type action - vibration. But there may be more in the future.(立钻哥哥:目前只有一种输出类型的动作-振动。但未来可能会有更多。

    public abstract class SteamVR_Action_Out : SteamVR_Action{

    }    //立钻哥哥:public abstract class SteamVR_Action_Out:SteamVR_Action{}

}    //立钻哥哥:namespace Valve.VR{}

 

 

 

 

 

###A.1.4、动作集(Action Sets)

###A.1.4、动作集(Action Sets)

++A.1.4、动作集(Action Sets)

++++立钻哥哥:动作通过动作集进行逻辑上的分组,以方便进行组织和管理,在Unity中对应的类为SteamVR_ActionSet

++++在不同的场景或应用程序之间可以切换使用不同的动作集,比如,应用程序中有一个场景是在地球上拾取并投掷物体,而另一个场景则是在太空中飞行,那么这两个场景可以使用不同的动作集

++++同时,当针对新设备进行交互适配时,开发者只需对动作进行配置,而不必修改项目代码;(比如,使用Vive控制器时,定义了一个Fire动作,当需要支持Rift Touch时,只需通过配置Touch控制器上符合Fire动作的键值即可)

++++SteamVR插件默认包含了三套动作集:defaultplatformerbuggy,开发者也可以在[SteamVR Input]窗口中自行添加或删除动作集

++++使用组件[SteamVR_ActivateActionSetOnLoad]可以在场景中自动激活和停用指定的动作集;对应激活和停用的方法是在Start()OnDestroy()中实现

SteamVR2.0开发指南(Yanlz+Unity+SteamVR+Plugin+OpenVR+InputSystem+Kunckles+VIVE+Oculus+OpenXR+立钻哥哥++ok++)_第7张图片

 

++SteamVR/Input/SteamVR_ActivateActionSetOnLoad.cs

++++立钻哥哥:\Assets\SteamVR\Input\SteamVR_ActivateActionSetOnLoad.cs

using UnityEngine;

using System.Collections;

 

namespace Valve.VR{

    //Automatically activates an action set on Start() and deactivates the set on OnDestroy(). Optionally deactivating all other sets as well.(立钻哥哥:自动激活Start()和OnDestroy()上的设置。也可以选择停用所有其他设置。

    public class SteamVR_ActivateActionSetOnLoad : MonoBehaviour{

        [SteamVR_DefaultActionSet(default)]

        public SteamVR_ActionSet actionSet;

 

        public bool disableAllOtherActionSets = false;

        public bool activateOnStart = ture;

        public bool deactivateOnDestroy = true;

 

        private void Start(){}

        private void OnDestroy(){}

 

    }    //立钻哥哥:public class SteamVR_ActivateSetOnLoad:MonoBehaviour{}

}    //立钻哥哥:namespace Valve.VR{}

 

++图解SteamVR Input(Actions)

++++立钻哥哥:好吧,我们图解一下Input中相关Actions对话框:

SteamVR2.0开发指南(Yanlz+Unity+SteamVR+Plugin+OpenVR+InputSystem+Kunckles+VIVE+Oculus+OpenXR+立钻哥哥++ok++)_第8张图片

SteamVR2.0开发指南(Yanlz+Unity+SteamVR+Plugin+OpenVR+InputSystem+Kunckles+VIVE+Oculus+OpenXR+立钻哥哥++ok++)_第9张图片

SteamVR2.0开发指南(Yanlz+Unity+SteamVR+Plugin+OpenVR+InputSystem+Kunckles+VIVE+Oculus+OpenXR+立钻哥哥++ok++)_第10张图片

SteamVR2.0开发指南(Yanlz+Unity+SteamVR+Plugin+OpenVR+InputSystem+Kunckles+VIVE+Oculus+OpenXR+立钻哥哥++ok++)_第11张图片

SteamVR2.0开发指南(Yanlz+Unity+SteamVR+Plugin+OpenVR+InputSystem+Kunckles+VIVE+Oculus+OpenXR+立钻哥哥++ok++)_第12张图片

SteamVR2.0开发指南(Yanlz+Unity+SteamVR+Plugin+OpenVR+InputSystem+Kunckles+VIVE+Oculus+OpenXR+立钻哥哥++ok++)_第13张图片

SteamVR2.0开发指南(Yanlz+Unity+SteamVR+Plugin+OpenVR+InputSystem+Kunckles+VIVE+Oculus+OpenXR+立钻哥哥++ok++)_第14张图片

SteamVR2.0开发指南(Yanlz+Unity+SteamVR+Plugin+OpenVR+InputSystem+Kunckles+VIVE+Oculus+OpenXR+立钻哥哥++ok++)_第15张图片

SteamVR2.0开发指南(Yanlz+Unity+SteamVR+Plugin+OpenVR+InputSystem+Kunckles+VIVE+Oculus+OpenXR+立钻哥哥++ok++)_第16张图片

SteamVR2.0开发指南(Yanlz+Unity+SteamVR+Plugin+OpenVR+InputSystem+Kunckles+VIVE+Oculus+OpenXR+立钻哥哥++ok++)_第17张图片

SteamVR2.0开发指南(Yanlz+Unity+SteamVR+Plugin+OpenVR+InputSystem+Kunckles+VIVE+Oculus+OpenXR+立钻哥哥++ok++)_第18张图片

 

 

 

 

 

 

###A.1.5、SteamVR Input窗口

###A.1.5、SteamVR Input窗口

++A.1.5、SteamVR Input窗口

++++立钻哥哥:Unity编辑器中,使用【Window->SteamVR Input】命令,打开【SteamVR Input】窗口

++++SteamVR2.0中,使用【SteamVR Input】窗口作为入口,对所有动作进行管理

++++初次导入SteamVR2.0并运行程序时,会弹出一个对话框,提示没有[actions.json]文件,并询问是否要使用默认值

SteamVR2.0开发指南(Yanlz+Unity+SteamVR+Plugin+OpenVR+InputSystem+Kunckles+VIVE+Oculus+OpenXR+立钻哥哥++ok++)_第19张图片

 

++++如果选择【No】,那么后果很严重(至少对于一堆报错,是有些受不了的,一切才开始,怎么就貌似已经结束呢?)

SteamVR2.0开发指南(Yanlz+Unity+SteamVR+Plugin+OpenVR+InputSystem+Kunckles+VIVE+Oculus+OpenXR+立钻哥哥++ok++)_第20张图片

 

++++那我们就先选择【Yes】(避开那些暂时未知的雷),会将默认的[actions.json]文件以及一些常见的控制器相关绑定文件复制到当前项目的根目录下

SteamVR2.0开发指南(Yanlz+Unity+SteamVR+Plugin+OpenVR+InputSystem+Kunckles+VIVE+Oculus+OpenXR+立钻哥哥++ok++)_第21张图片

 

++生成并使用action等动作类型

++++立钻哥哥:这些文件( [actions.json]、[binding_rift.json]、[binding_vive.json]等)将在程序运行时被载入进来,并在程序最终构建时被复制到与可执行文件同级的目录下;复制完成后,SteamVR Input窗口将读取文件信息并展示其包含的动作集合以及动作集合下的所有动作

++++Actions栏的右下角,可以点击加减号(+、-)按钮添加或删除动作;每个动作具有名称(Name)、类型(Type)、本地化字符串(localization strings)等字段;类型对应动作类型;本地化字符串是面向用户进行绑定的动作名称,开发者可以通过SteamVR API直接访问动作以及动作集

SteamVR2.0开发指南(Yanlz+Unity+SteamVR+Plugin+OpenVR+InputSystem+Kunckles+VIVE+Oculus+OpenXR+立钻哥哥++ok++)_第22张图片

 

++++当点击【Save and Generate】按钮后,SteamVR插件将为动作以及动作集生成可编程访问的对象类,将它们放置在项目的[SteamVR_Input/]目录下

SteamVR2.0开发指南(Yanlz+Unity+SteamVR+Plugin+OpenVR+InputSystem+Kunckles+VIVE+Oculus+OpenXR+立钻哥哥++ok++)_第23张图片

 

++代码中使用动作集

++++立钻哥哥:在项目代码中,使用[SteamVR_Input]类可以静态引用每个动作和动作集,在每个动作集中,可以找到其包含的动作的引用;

//立钻哥哥:当检测到任意控制器发出default动作集中包含的Teleport动作时,执行Teleport()函数

void Update(){

if(SteamVR_Input._default.inActions.Teleport.GetStateUp(SteamVR_Input_Sources.Any)){

    Teleport();

    }

}

 

 

 

 

 

###A.1.6、测试动作

###A.1.6、测试动作

++A.1.6、测试动作

++++立钻哥哥:选择【Window -> [SteamVR Input Live View]】命令,即可打开一个测试输入窗口

++++运行程序,此时该窗口将实时展示所有动作集合的状态;当一个动作的值发生变化时,对应右侧会突出显示绿色,然后逐渐消失:

SteamVR2.0开发指南(Yanlz+Unity+SteamVR+Plugin+OpenVR+InputSystem+Kunckles+VIVE+Oculus+OpenXR+立钻哥哥++ok++)_第24张图片

SteamVR2.0开发指南(Yanlz+Unity+SteamVR+Plugin+OpenVR+InputSystem+Kunckles+VIVE+Oculus+OpenXR+立钻哥哥++ok++)_第25张图片

 

 

 

 

###A.1.7、动作绑定

###A.1.7、动作绑定

++A.1.7、动作绑定

++++立钻哥哥:创建动作以后,需要将动作进行默认绑定

++++打开VR控制器,保持SteamVR客户端开启,在[SteamVR Input]窗口中,点击[Open binding UI]按钮,此时将使用操作系统默认的网页浏览器打开SteamVR动作绑定页面

SteamVR2.0开发指南(Yanlz+Unity+SteamVR+Plugin+OpenVR+InputSystem+Kunckles+VIVE+Oculus+OpenXR+立钻哥哥++ok++)_第26张图片

SteamVR2.0开发指南(Yanlz+Unity+SteamVR+Plugin+OpenVR+InputSystem+Kunckles+VIVE+Oculus+OpenXR+立钻哥哥++ok++)_第27张图片

 

++动作的绑定编辑

++++立钻哥哥:在“SteamVR动作绑定页面”,选择需要绑定的控制器,点击【Edit】按钮,进入绑定编辑页面(类似游戏的手柄设置);这样,对开发者来说,控制器也像对游戏玩家那样变得友好了

SteamVR2.0开发指南(Yanlz+Unity+SteamVR+Plugin+OpenVR+InputSystem+Kunckles+VIVE+Oculus+OpenXR+立钻哥哥++ok++)_第28张图片

SteamVR2.0开发指南(Yanlz+Unity+SteamVR+Plugin+OpenVR+InputSystem+Kunckles+VIVE+Oculus+OpenXR+立钻哥哥++ok++)_第29张图片

 

++++在动作编辑页面中,点击每个按钮旁边的加号(+)按钮,弹出窗口会询问将此按键绑定为哪种模式:

SteamVR2.0开发指南(Yanlz+Unity+SteamVR+Plugin+OpenVR+InputSystem+Kunckles+VIVE+Oculus+OpenXR+立钻哥哥++ok++)_第30张图片

 

++动作设定

++++立钻哥哥:通常情况下,Single类型的动作可以设置为“TRIGGER”,Boolean类型的动作可以设置为“BUTTON”;设定以后,在按键左下角点击编辑按钮,在显示为“None”的位置指定相应的动作:

SteamVR2.0开发指南(Yanlz+Unity+SteamVR+Plugin+OpenVR+InputSystem+Kunckles+VIVE+Oculus+OpenXR+立钻哥哥++ok++)_第31张图片

 

++++所有动作绑定完毕,点击页面底部的“Replace Default Binding”按钮,会将绑定设置保存到配置文件当中;在程序运行时,无论是开发者还是游戏玩家,都可以再次修改绑定配置,并且能够反映到游戏当中

SteamVR2.0开发指南(Yanlz+Unity+SteamVR+Plugin+OpenVR+InputSystem+Kunckles+VIVE+Oculus+OpenXR+立钻哥哥++ok++)_第32张图片

 

++“Mirror Mode”复选框

++++立钻哥哥:默认情况下,每个控制器上相同的按键绑定相同的动作,如果想为每个控制器设置不同的动作,比如,左手控制器按下“TouchPadJoyStick)”实现传送,而右手控制器按下“TouchPad(JoyStick)”使用指针选择物体,那么在这种情况下,可以取消勾选页面中的“Mirror Mode复选框”,然后分别为每个控制器指定不同的动作

SteamVR2.0开发指南(Yanlz+Unity+SteamVR+Plugin+OpenVR+InputSystem+Kunckles+VIVE+Oculus+OpenXR+立钻哥哥++ok++)_第33张图片

 

++“Input Debugger按钮”

++++立钻哥哥:在绑定编辑界面中也可以进行动作测试,点击“Input Debugger”按钮进入测试页面,在此页面中,将实时显示各动作的状态、动作绑定的按键、控制器的实时数据等信息

SteamVR2.0开发指南(Yanlz+Unity+SteamVR+Plugin+OpenVR+InputSystem+Kunckles+VIVE+Oculus+OpenXR+立钻哥哥++ok++)_第34张图片

SteamVR2.0开发指南(Yanlz+Unity+SteamVR+Plugin+OpenVR+InputSystem+Kunckles+VIVE+Oculus+OpenXR+立钻哥哥++ok++)_第35张图片

 

 

 

 

###A.1.8、在代码中使用动作

###A.1.8、在代码中使用动作

++A.1.8、在代码中使用动作

++++立钻哥哥:我们以“/actions/platformer”动作集下的“Move”动作为例,演示如何获取动作状态

SteamVR2.0开发指南(Yanlz+Unity+SteamVR+Plugin+OpenVR+InputSystem+Kunckles+VIVE+Oculus+OpenXR+立钻哥哥++ok++)_第36张图片

 

++1、添加组件,启用“platformer”动作集

++++立钻哥哥:打开SteamVR示例场景“Simple Sample”,好吧,我们“Ctrl+D”复制一个,重命名为:“立钻哥哥的测试场景(Simple Sample)”,只是演示,不修改原来工程构成,这也是一个习惯吧:注意备份保留原有信息

++++选择游戏对象[CameraRig],为其挂载“SteamVR_ActivateActionSetOnLoad”组件,并指定启用“platformer动作集

SteamVR2.0开发指南(Yanlz+Unity+SteamVR+Plugin+OpenVR+InputSystem+Kunckles+VIVE+Oculus+OpenXR+立钻哥哥++ok++)_第37张图片

 

++++\Assets\SteamVR\Input\SteamVR_ActivateActionSetOnLoad.cs

using UnityEngine;

using System.Collections;

 

namespace Valve.VR{

    //Automatically activates an action set on Start() and deactivates the set on OnDestroy(). Optionally deactivating all other sets as well.(立钻哥哥:自动激活Start()和OnDestroy()上的操作集。还可以选择停用所有其他集。

    public class SteamVR_ActivateActionSetOnLoad : MonoBehaviour{

        public SteamVR_ActionSet actionSet = SteamVR_Input.GetActionSet(default);

        public SteamVR_Input_Sources forSources = SteamVR_Input_Sources.Any;

        public bool disableAllOtherActionSets = false;

        public bool activateOnStart = true;

        public bool deactivateOnDestroy = true;

 

        private void Start(){

            if(actionSet != null && activateOnStart){

                //Debug.Log(string.Format(立钻哥哥:[SteamVR] Activating {0} action set., actionSet.fullPath));

                actionSet.Activate(forSources, 0, disableAllOtherActionSets);

             }

        }

 

        private void OnDestroy(){

            if(actionSet != null && deactivateOnDestroy){

                //Debug.Log(string.Format(立钻哥哥:[SteamVR] Deactivating {0} action set., actionSet.fullPath));

                actionSet.Deactivate(forSources);

            }

        }

 

     }    //立钻哥哥:public class SteamVR_ActivateActionSetOnLoad{}

 

}    //立钻哥哥:namespace Valve.VR{}

 

++2、编写YanlzVRGetMyMoveAction.cs

++++立钻哥哥:新建C#脚本,并重命名为YanlzVRGetMyMoveAction.cs

using UnityEngine;

using Valve.VR;

 

//立钻哥哥:监听输出动作集数据

public class YanlzVRGetMyMoveAction : MonoBehaviour{

    void Update(){

        /*注意:SteamVR2.2.0不能使用(SteamVR_Input.platformer了)

        if(SteamVR_Input.platformer.inActions.Move.GetChanged(SteamVR_Input_Sources.Any)){

            Vector2 pos = SteamVR_Input.platformer.inActions.Move.GetAxis(SteamVR_Input_Sources.Any);

            Debug.Log(立钻哥哥:pos: + pos);

        }

        */

 

        //立钻哥哥:SteamVR2.2.0使用GetAction获取动作集

        //SteamVR_Input.GetAction(platformer, Move)

        if(moveAction != null && moveAction.GetChanged(SteamVR_Input_Sources.Any)){

            Vector2 pos = moveAction.GetAxis(SteamVR_Input_Sources.Any);

            Debug.Log(立钻哥哥:pos:  + pos);

        }

    }

 

    //立钻哥哥:SteamVR2.2.0使用GetAction获取动作集

    public SteamVR_Action_Vector2 moveAction = SteamVR_Input.GetAction<SteamVR_Action_Vector2>(platformer, Move);

    public SteamVR_Action_Boolean jumpAction = SteamVR_Input.GetAction<SteamVR_Action_Boolean>(platformer, Jump);

 

}    //立钻哥哥:public class YanlzVRGetMyMoveAction :MonoBehaviour{}

 

++3、运行测试

++++立钻哥哥:将“YanlzVRGetMyMoveAction.cs”脚本挂载到任意游戏对象上,当任意控制器上触摸“TouchPad”时,应该有信息输出的,没有?

SteamVR2.0开发指南(Yanlz+Unity+SteamVR+Plugin+OpenVR+InputSystem+Kunckles+VIVE+Oculus+OpenXR+立钻哥哥++ok++)_第38张图片

 

 

 

 

###A.1.9、[Interaction System]的变化

###A.1.9、[Interaction System]的变化

++A.1.9、[Interaction System]交互系统

++++立钻哥哥:\Assets\SteamVR\InteractionSystem\

++++SteamVR2.0开发指南https://blog.csdn.net/VRunSoftYanlz/article/details/86618187

++++SteamVR2.2.0开发指南https://blog.csdn.net/VRunSoftYanlz/article/details/88784527

 

++[Interaction System]的变化

++++立钻哥哥:示例场景中,加入了一些新的特性;比如,对投掷(Throwing)部分做了扩展,添加了遥控器和遥控车、简易的推动按钮、手榴弹,以及一些关于Hand的示例

++++[Throwing]:Throwing部分,能够实现基于速度估计的交互,类似于另外一个VR开发工具“NewtonVR”能够实现的效果:被抓取的物体不会直接穿过固定静止的障碍物,而是跟随Hand沿障碍物边界滑动;所有这些交互相关的参数都可以在Throwable组件中进行设置

++++[Remotes]:有两个简易控制器,提供了一种与物体进行间接交互的演示

++++[Skeleton]:可以通过点击按钮来显示和隐藏控制器模型,以及切换不同的手部模型

++++[Interaction System]已经支持[Input System]配置的行为进行交互驱动了,可以通过阅读源码进一步学习“Input System”的使用

SteamVR2.0开发指南(Yanlz+Unity+SteamVR+Plugin+OpenVR+InputSystem+Kunckles+VIVE+Oculus+OpenXR+立钻哥哥++ok++)_第39张图片

 

++[Throwable]组件(SteamVR2.2.0

++++立钻哥哥:\Assets\SteamVR\InteractionSystem\Core\Scripts\Throwable.cs

//立钻哥哥:Purpose: Basic throwable object

using UnityEngine;

using UnityEngine.Events;

using System.Collections;

 

namespace Valve.VR.InteractionSystem{

    [RequireComponent(typeof(Interactable))]

    [RequireComponent(typeof(Rigidbody))]

    [RequireComponent(typeof(VelocityEstimator))]

    public class Throwable : MonoBehaviour{

        public Transform attachmentOffset;

        public float catchingSpeedThreshold = -1;

        public float releaseVelocityTimeOffset = -0.011f;

        public float scaleReleaseVelocity = 1.1f;

 

        public UnityEvent onPickUp;

        public UnityEvent onDetachFromHand;

        public UnityEvent<Hand> onHeldUpdate;

 

        protected new Rigidbody rigidbody;

 

        [HideInInspector]

        public Interactable interactable;

 

        protected virtual void Awake(){}

        protected virtual void OnHandHoverBegin(Hand hand){}

        protected virtual void OnHandHoverEnd(Hand hand){}

        protected virtual void HandHoverUpdate(Hand hand){}

        protected virtual void OnAttachedToHand(Hand hand){}

        protected virtual void OnDetachedFromHand(Hand hand){}

        protected virtual void GetReleaseVelocities(Hand hand, out Vector3 velocity, out Vector3 angularVelocity){}

        protected virtual void HandAttachedUpdate(Hand hand){}

        protected virtual IEnumerator LateDetach(Hand hand){}

        protected virtual void OnHandFocusAcquired(Hand hand){}

        protected virtual void OnHandFocusLost(Hand hand){}

    }    //立钻哥哥:public class Throwable:MonoBehaviour{}

 

    public enum ReleaseStyle{

        NoChange,

        GetFromHand,

        ShortEstimation,

        AdvancedEstimation,

    }    //立钻哥哥:public enum ReleaseStyle{}

  

}    //立钻哥哥:namespace Valve.VR.InteractionSystem{}

 

 

 

 

###A.1.10、VRTK是否能够继续结合SteamVR2.0使用

###A.1.10、VRTK是否能够继续结合SteamVR2.0使用

++A.1.10、VRTK是否能够继续结合SteamVR2.0使用

++++立钻哥哥:如果VRTK没有新版更新的话,理论上来说不能使用VRTKV3.3.0以下版本)结合SteamVR2.0进行开发,除非克隆VRTK源码,自行对其进行修改;(TipsSteamVR版本还不稳定,所以谨慎使用!)

++++SteamVR2.0开发指南https://blog.csdn.net/VRunSoftYanlz/article/details/86618187

++++SteamVR2.2.0开发指南https://blog.csdn.net/VRunSoftYanlz/article/details/88784527

SteamVR2.0开发指南(Yanlz+Unity+SteamVR+Plugin+OpenVR+InputSystem+Kunckles+VIVE+Oculus+OpenXR+立钻哥哥++ok++)_第40张图片

 

++继续使用VRTK的建议

++++立钻哥哥:当前版本VRTK3.3.0以下版本)并不支持SteamVR2.0以上版本

++++使用VRTK的开发者可继续使用SteamVR1.2.3进行开发

++++SteamVR Plugin的过往版本可访问:https://github.com/ValveSoftware/steamvr_unity_plugin/releases

++++SteamVR2.0开发指南https://blog.csdn.net/VRunSoftYanlz/article/details/86618187

++++SteamVR2.2.0开发指南https://blog.csdn.net/VRunSoftYanlz/article/details/88784527

SteamVR2.0开发指南(Yanlz+Unity+SteamVR+Plugin+OpenVR+InputSystem+Kunckles+VIVE+Oculus+OpenXR+立钻哥哥++ok++)_第41张图片

 

 

 

 

 

 

 

##A.2、SteamVR Unity Plugin官方文档

##A.2、SteamVR Unity Plugin官方文档

++A.2、SteamVR Unity Plugin官方文档

++++立钻哥哥:https://valvesoftware.github.io/steamvr_unity_plugin/

++++SteamVR2.0开发指南https://blog.csdn.net/VRunSoftYanlz/article/details/86618187

++++SteamVR2.2.0开发指南https://blog.csdn.net/VRunSoftYanlz/article/details/88784527

SteamVR2.0开发指南(Yanlz+Unity+SteamVR+Plugin+OpenVR+InputSystem+Kunckles+VIVE+Oculus+OpenXR+立钻哥哥++ok++)_第42张图片

 

 

++++SteamVR2.0开发指南https://blog.csdn.net/VRunSoftYanlz/article/details/86618187

++++SteamVR2.2.0开发指南https://blog.csdn.net/VRunSoftYanlz/article/details/88784527

 

 

 

 

SteamVR2.0开发指南(Yanlz+Unity+SteamVR+Plugin+OpenVR+InputSystem+Kunckles+VIVE+Oculus+OpenXR+立钻哥哥++ok++)_第43张图片

++立钻哥哥推荐的拓展学习链接(Link_Url)

立钻哥哥推荐的拓展学习链接(Link_Url)

++++立钻哥哥Unity 学习空间: http://blog.csdn.net/VRunSoftYanlz/

++++HTC_VIVE开发基础https://blog.csdn.net/VRunSoftYanlz/article/details/81989970

++++Oculus杂谈https://blog.csdn.net/VRunSoftYanlz/article/details/82469850

++++Oculus安装使用https://blog.csdn.net/VRunSoftYanlz/article/details/82718982

++++SteamVR简介https://blog.csdn.net/VRunSoftYanlz/article/details/86484254

++++SteamVR脚本功能分析https://blog.csdn.net/VRunSoftYanlz/article/details/86531480

++++SteamVR2.0开发指南https://blog.csdn.net/VRunSoftYanlz/article/details/86618187

++++SteamVR/Extrashttps://blog.csdn.net/VRunSoftYanlz/article/details/86584108

++++SteamVR/Inputhttps://blog.csdn.net/VRunSoftYanlz/article/details/86601950

++++OpenXR简介https://blog.csdn.net/VRunSoftYanlz/article/details/85726365

++++VRTK杂谈https://blog.csdn.net/VRunSoftYanlz/article/details/82562993

++++VRTK快速入门(杂谈)https://blog.csdn.net/VRunSoftYanlz/article/details/82955267

++++VRTK官方示例(目录)https://blog.csdn.net/VRunSoftYanlz/article/details/82955410

++++VRTK代码结构(目录)https://blog.csdn.net/VRunSoftYanlz/article/details/82780085

++++VRTK(SceneResources)https://blog.csdn.net/VRunSoftYanlz/article/details/82795400

++++VRTK_ControllerEventshttps://blog.csdn.net/VRunSoftYanlz/article/details/83099512

++++VRTK_InteractTouchhttps://blog.csdn.net/VRunSoftYanlz/article/details/83120220

++++VR实验:以太网帧的构成https://blog.csdn.net/VRunSoftYanlz/article/details/82598140

++++FrameVR示例V0913https://blog.csdn.net/VRunSoftYanlz/article/details/82808498

++++FrameVR示例V1003https://blog.csdn.net/VRunSoftYanlz/article/details/83066516

++++SwitchMachineV1022https://blog.csdn.net/VRunSoftYanlz/article/details/83280886

++++PlaySceneManagerV1022https://blog.csdn.net/VRunSoftYanlz/article/details/83280886

++++Unity5.x用户手册https://blog.csdn.net/VRunSoftYanlz/article/details/81712741

++++Unity面试题ABChttps://blog.csdn.net/vrunsoftyanlz/article/details/78630687

++++Unity面试题Dhttps://blog.csdn.net/VRunSoftYanlz/article/details/78630838

++++Unity面试题Ehttps://blog.csdn.net/vrunsoftyanlz/article/details/78630913

++++Unity面试题Fhttps://blog.csdn.net/VRunSoftYanlz/article/details/78630945

++++Cocos2dx面试题https://blog.csdn.net/VRunSoftYanlz/article/details/78630967

++++禅道[zentao]https://blog.csdn.net/VRunSoftYanlz/article/details/83964057

++++Lua快速入门篇(Xlua拓展):https://blog.csdn.net/VRunSoftYanlz/article/details/81173818

++++Lua快速入门篇(XLua教程):https://blog.csdn.net/VRunSoftYanlz/article/details/81141502

++++Lua快速入门篇(基础概述)https://blog.csdn.net/VRunSoftYanlz/article/details/81041359

++++框架知识点https://blog.csdn.net/VRunSoftYanlz/article/details/80862879

++++游戏框架(UI框架夯实篇)https://blog.csdn.net/vrunsoftyanlz/article/details/80781140

++++游戏框架(初探篇)https://blog.csdn.net/VRunSoftYanlz/article/details/80630325

++++设计模式简单整理https://blog.csdn.net/vrunsoftyanlz/article/details/79839641

++++专题:设计模式(精华篇)https://blog.csdn.net/VRunSoftYanlz/article/details/81322678

++++U3D小项目参考https://blog.csdn.net/vrunsoftyanlz/article/details/80141811

++++Unity案例(Vehicle)https://blog.csdn.net/VRunSoftYanlz/article/details/82355876

++++UML类图https://blog.csdn.net/vrunsoftyanlz/article/details/80289461

++++PowerDesigner简介https://blog.csdn.net/VRunSoftYanlz/article/details/86500084

++++Unity知识点0001https://blog.csdn.net/vrunsoftyanlz/article/details/80302012

++++Unity知识点0008https://blog.csdn.net/VRunSoftYanlz/article/details/81153606

++++U3D_Shader编程(第一篇:快速入门篇)https://blog.csdn.net/vrunsoftyanlz/article/details/80372071

++++U3D_Shader编程(第二篇:基础夯实篇)https://blog.csdn.net/vrunsoftyanlz/article/details/80372628

++++Unity引擎基础https://blog.csdn.net/vrunsoftyanlz/article/details/78881685

++++Unity面向组件开发https://blog.csdn.net/vrunsoftyanlz/article/details/78881752

++++Unity物理系统https://blog.csdn.net/vrunsoftyanlz/article/details/78881879

++++Unity2D平台开发https://blog.csdn.net/vrunsoftyanlz/article/details/78882034

++++UGUI基础https://blog.csdn.net/vrunsoftyanlz/article/details/78884693

++++UGUI进阶https://blog.csdn.net/vrunsoftyanlz/article/details/78884882

++++UGUI综合https://blog.csdn.net/vrunsoftyanlz/article/details/78885013

++++Unity动画系统基础https://blog.csdn.net/vrunsoftyanlz/article/details/78886068

++++Unity动画系统进阶https://blog.csdn.net/vrunsoftyanlz/article/details/78886198

++++Navigation导航系统https://blog.csdn.net/vrunsoftyanlz/article/details/78886281

++++Unity特效渲染https://blog.csdn.net/vrunsoftyanlz/article/details/78886403

++++Unity数据存储https://blog.csdn.net/vrunsoftyanlz/article/details/79251273

++++Unity中Sqlite数据库https://blog.csdn.net/vrunsoftyanlz/article/details/79254162

++++WWW类和协程https://blog.csdn.net/vrunsoftyanlz/article/details/79254559

++++Unity网络https://blog.csdn.net/vrunsoftyanlz/article/details/79254902

++++C#事件https://blog.csdn.net/vrunsoftyanlz/article/details/78631267

++++C#委托https://blog.csdn.net/vrunsoftyanlz/article/details/78631183

++++C#集合https://blog.csdn.net/vrunsoftyanlz/article/details/78631175

++++C#泛型https://blog.csdn.net/vrunsoftyanlz/article/details/78631141

++++C#接口https://blog.csdn.net/vrunsoftyanlz/article/details/78631122

++++C#静态类https://blog.csdn.net/vrunsoftyanlz/article/details/78630979

++++C#中System.String类https://blog.csdn.net/vrunsoftyanlz/article/details/78630945

++++C#数据类型https://blog.csdn.net/vrunsoftyanlz/article/details/78630913

++++Unity3D默认的快捷键https://blog.csdn.net/vrunsoftyanlz/article/details/78630838

++++游戏相关缩写https://blog.csdn.net/vrunsoftyanlz/article/details/78630687

++++UnityAPI.Rigidbody刚体https://blog.csdn.net/VRunSoftYanlz/article/details/81784053

++++UnityAPI.Material材质https://blog.csdn.net/VRunSoftYanlz/article/details/81814303

++++UnityAPI.Android安卓https://blog.csdn.net/VRunSoftYanlz/article/details/81843193

++++UnityAPI.AndroidJNI安卓JNIhttps://blog.csdn.net/VRunSoftYanlz/article/details/81879345

++++UnityAPI.Transform变换https://blog.csdn.net/VRunSoftYanlz/article/details/81916293

++++UnityAPI.WheelCollider轮碰撞器https://blog.csdn.net/VRunSoftYanlz/article/details/82356217

++++UnityAPI.Resources资源https://blog.csdn.net/VRunSoftYanlz/article/details/83155518

++++JSON数据结构https://blog.csdn.net/VRunSoftYanlz/article/details/82026644

++++CocosStudio快速入门https://blog.csdn.net/VRunSoftYanlz/article/details/82356839

++++Unity企业内训(目录)https://blog.csdn.net/VRunSoftYanlz/article/details/82634668

++++Unity企业内训(第1讲)https://blog.csdn.net/VRunSoftYanlz/article/details/82634733

++++Unity企业内训(第2讲)https://blog.csdn.net/VRunSoftYanlz/article/details/82861180

++++Unity企业内训(第3讲)https://blog.csdn.net/VRunSoftYanlz/article/details/82927699

++++Unity企业内训(第4讲)https://blog.csdn.net/VRunSoftYanlz/article/details/83479776

++++Unity企业内训(第5讲)https://blog.csdn.net/VRunSoftYanlz/article/details/83963811

++++Unity企业内训(第6讲)https://blog.csdn.net/VRunSoftYanlz/article/details/84207696

++++插件https://blog.csdn.net/VRunSoftYanlz/article/details/83963905

++++计算机组成原理(教材篇)https://blog.csdn.net/VRunSoftYanlz/article/details/82719129

++++立钻哥哥Unity 学习空间: http://blog.csdn.net/VRunSoftYanlz/

--_--VRunSoft:lovezuanzuan--_--

SteamVR2.0开发指南(Yanlz+Unity+SteamVR+Plugin+OpenVR+InputSystem+Kunckles+VIVE+Oculus+OpenXR+立钻哥哥++ok++)_第44张图片

你可能感兴趣的:(SteamVR)