Zion插件分析——ZionVR.cs
发表于2016-10-31
导语
ZionVR类以单例形式存在,项目中的其他类会通过Zion.ZionVR,instance得到它的引用。
ZionVR.cs
ZionVR类实现了System.IDisposable接口。C#和Java一样,在内存管理这方面提供了GC(Garbage Collection),负责自动释放托管资源和内存回收的工作,如果希望手动释放非托管资源,就可以实现该接口。
ZionVR类以单例形式存在,项目中的其他类会通过Zion.ZionVR,instance得到它的引用。它的主要功能是,通过调用底层的OVRPlugin、OpenVR、等,判断当前连接设备的类型(Oculus、暴风魔镜、SteamVR等),然后提供接口,根据设备类型,实例化相应平台的Camera,Tracker,Controller等等。
ZionVR类的另一作用是保存一些与VR有关的全局参数,供其他类使用。
字段
- _enabled:是否禁用
- renderManually:是否需要手动渲染
- monoscopic:是否只生成单眼图像
- sceneWidth:场景的宽
- sceneHeight:场景的高
- aspect:宽度比
- fieldOfView:视场角(应该从VR设备中取出)
- _useNativeVRSupport:是否使用Unity的VR支持
- supportTrackedController:是否支持跟踪控制器
- needCompanionWindow:是否需要伴随窗口(同步头盔画面,在PC端显示)
- poseType:姿态类型,默认为坐式
属性
- active:当前脚本是否为null
- enabled:如果_enabled为false,则释放资源
- eyes:两只眼睛的偏移
- instance:单例
- useNativeVRSupport:是否使用Unity的VR支持
- vrType:底层VR设备的类型
注: 目前支持的VR平台类型
1 2 3 4 5 6 7 8 | public enum EVRType { None = 0, SteamVR = 1, // HTC Vive Oculus = 2, // Oculus Mojing = 3, // 暴风魔镜 GearVR = 4 // GearVR } |
方法
ZionVR()
构造方法,获取底层VR设备类型,为vrType赋值;初始化eyes数组,长度为2。
~ZionVR()
析构方法,与构造方法对应,在对象的生命周期结束时,隐式地对对象的基类调用Finalize()方法,释放非托管资源,可以看到,析构函数中调用Dispose(bool disposing)时传入的是false,该方法就知道只需要释放非托管资源。
Dispose()
用于显式地释放资源,调用Dispose(bool disposing)时传入的是true,并且
1 | System.GC.SuppressFinalize( this ); |
阻止对象调用Finalize()。
Dispose(bool disposing)
将_instance置为null,并根据设备的种类,进行各自对应的资源释放。
CreateInstance()
静态方法,实例化对象。
SafeDispose()
静态方法。安全释放资源,其实就是判断_instance不为null后再调用Dispose()方法而已。
DetectVRType()
返回EVRType。
通过调用底层的OVRPlugin、OpenVR的设备检测连接方法,判断当前连接设备的类型,传给字段vrType。在实例化其他组件之前,必须要先进行设备检测,不然插件不知道该初始化哪种设备的组件。
Setup()
先根据vrType,创建当前连接设备的ZionSetting,然后调用其Setup()方法,对环境进行一些设置,在ZionVR.cs中体现为相关字段的赋值,如场景的宽高,视场角等。
其他Create开头的方法
均为静态方法,根据设备类型,实例化各自平台的相机,设置,手柄,追踪器等等。返回其基类。