一、头盔模式下的编辑器
配置好头盔组建后,点击运行按钮,你会发现你的编辑器Game窗口是这样的,你无法交互
二、修改后可以在编辑器运行模式下交互的样子
先看示例,2dUI 和3D 物体都可以交互,而且触发的的事件都可以通过OnPointerEnter/Exit/Down/BeginDrag/Drag/EndDrag接口来自定义业务逻辑
三、如何进行编辑器的环境设置(版本切换)
原理:自己写一个编辑器脚本,根据需求,启用或者停用相关组件来设置Unity的环境,使之匹配纯PC 或VR模式。
- 发布模式:比如要发布VR版本的时候,设置成VR模式,然后发布
- 调试模式:要在Unity Editor中调试逻辑时,直接设置成PC模式
- 物体上脚本(组件)启用或者停用一览表
gameObject对象 脚本/组件 PC VR active 备注
====================================================================
Pvr_UnitySDK Pvr_UnitySDKManager 0 1
Event Pvr_InputModule 0 1
Event InputWith3D 0 1
Event BaseInput 1 0 PC输入法
Event StandaloneInputModule 1 0 PC输入法
HeadSetControl Pvr_UIPointer 0 1
[EyeMask] Pvr_UnityEyeMask 0 1
Head Camera 1 1
Head Pvr_UnitySDKHeadTrack 0 1
Head Pvr_UnitySDKEyeManager 0 1
FPS Pvr_UnitySDKFPS 0 0
LeftEye Pvr_UnitySDKEye 0 1
RightEye Pvr_UnitySDKEye 0 1
BothEye Pvr_UnitySDKEye 0 1
ControllerManager Pvr_ControllerManager 0 1
ControllerManager Pvr_Controller 0 1
PvrController0 hide
PvrController1 hide
Canvas Pvr_UICanvas 0 1
Canvas GraphicRaycaster 1 0
四、 主要脚本【ChangeEditorMode.cs】的代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Linq;
using UnityEngine.EventSystems;
using UnityEngine.UI;
/*
工作原理:根据版本类别,启用或者停用指定的脚本和物体
gameObject对象 脚本/组件 PC VR active 备注
====================================================================
Pvr_UnitySDK Pvr_UnitySDKManager 0 1
Event Pvr_InputModule 0 1
Event InputWith3D 0 1
Event BaseInput 1 0 PC输入法
Event StandaloneInputModule 1 0 PC输入法
HeadSetControl Pvr_UIPointer 0 1
[EyeMask] Pvr_UnityEyeMask 0 1
Head Camera 1 1
Head Pvr_UnitySDKHeadTrack 0 1
Head Pvr_UnitySDKEyeManager 0 1
FPS Pvr_UnitySDKFPS 0 0
LeftEye Pvr_UnitySDKEye 0 1
RightEye Pvr_UnitySDKEye 0 1
BothEye Pvr_UnitySDKEye 0 1
ControllerManager Pvr_ControllerManager 0 1
ControllerManager Pvr_Controller 0 1
PvrController0 hide
PvrController1 hide
Canvas Pvr_UICanvas 0 1
Canvas GraphicRaycaster 1 0
*/
/// <summary>
/// 设置编辑器的模式:PC版本或者VR版本
/// </summary>
public class ChangeEditorMode : MonoBehaviour
{
/// <summary>
/// pico的unity sdk
/// </summary>
[Header("pico VR头盔组件")]
public GameObject picoSdk;
/// <summary>
/// 需要处理的画布列表
/// </summary>
[Header("需要处理的画布列表")]
public List<Canvas> canvas;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
}
#if UNITY_EDITOR
[ContextMenu("设置成PC版本")]
#endif
void PcEditor()
{
SetMode("pc");
}
#if UNITY_EDITOR
[ContextMenu("设置成VR版本")]
#endif
void VrEditor()
{
SetMode("vr");
}
void SetMode(string mode)
{
if (mode != "pc" && mode != "vr") throw new System.Exception("错误的类型,只能是【pc】或者【vr】");
bool vrOn = mode == "vr" ? true : false;
bool pcOn = mode == "pc" ? true : false;
var allParts = picoSdk.GetComponentsInChildren<Transform>(true).ToList();
var Pvr_UnitySDK = allParts.Where(x => x.name == "Pvr_UnitySDK").First();
Pvr_UnitySDK.GetComponent<Pvr_UnitySDKManager>().enabled = vrOn;
var Event = allParts.Where(x => x.name == "Event").First();
Event.GetComponent<Pvr_InputModule>().enabled = vrOn;
Event.GetComponent<InputWith3D>().enabled = vrOn;
Event.GetComponent<BaseInput>().enabled = pcOn;
Event.GetComponent<StandaloneInputModule>().enabled = pcOn;
var HeadSetControl = allParts.Where(x => x.name == "HeadSetControl").First();
HeadSetControl.GetComponent<Pvr_UIPointer>().enabled = vrOn;
var EyeMask = allParts.Where(x => x.name == "[EyeMask]").First();
EyeMask.GetComponent<Pvr_UnityEyeMask>().enabled = vrOn;
var Head = allParts.Where(x => x.name == "Head").First();
Head.GetComponent<Camera>().enabled = true;
Head.GetComponent<Pvr_UnitySDKHeadTrack>().enabled = vrOn;
Head.GetComponent<Pvr_UnitySDKEyeManager>().enabled = vrOn;
var FPS = allParts.Where(x => x.name == "FPS").First();
FPS.GetComponent<Pvr_UnitySDKFPS>().enabled = false;
var LeftEye = allParts.Where(x => x.name == "LeftEye").First();
LeftEye.GetComponent<Pvr_UnitySDKEye>().enabled = vrOn;
var RightEye = allParts.Where(x => x.name == "RightEye").First();
RightEye.GetComponent<Pvr_UnitySDKEye>().enabled = vrOn;
var BothEye = allParts.Where(x => x.name == "BothEye").First();
BothEye.GetComponent<Pvr_UnitySDKEye>().enabled = vrOn;
var ControllerManager = allParts.Where(x => x.name == "ControllerManager").First();
ControllerManager.GetComponent<Pvr_ControllerManager>().enabled = vrOn;
ControllerManager.GetComponent<Pvr_Controller>().enabled = vrOn;
var PvrController0 = allParts.Where(x => x.name == "PvrController0").First();
PvrController0.gameObject.SetActive(vrOn);
var PvrController1 = allParts.Where(x => x.name == "PvrController1").First();
PvrController1.gameObject.SetActive(vrOn);
canvas.ForEach(x=>
{
x.GetComponent<Pvr_UICanvas>().enabled = vrOn;
x.GetComponent<GraphicRaycaster>().enabled = pcOn;
});
}
}
五、总结
VR一体机要点:
- 1、电脑上调试逻辑
- 2、设备上调试效果
- 3、官方不提供模拟器,那就自己撸一个