一.前言
该文档的目的是记录开发过程中使用的燧光RhinoX眼镜和Unity引擎和所遇到的问题及解决方式。
二.相关文档
三.开发环境
1.Unity2020.3.47
2.Rhino-For-Unity-2020 Plugin
四.问题列表
1.RhinoX设备基本参数如下:
操作系统为Android 7.1,头显和控制器为6DOF。其中,6GB的运存无法支撑大场景或复杂场景的加载和渲染,需要提前在这里预留余量。
2.Unity-apk打包
在ProjectSetting-Player中,将Minimum API Level设置为7.1以满足RhinoX要求,Target Architectures设置为ARMv7
其次,Android打包所涉及的SDK、JDK及NDK,最好是在UnityHUB中联同目标引擎一同下载,既方便,又省心,不然很容易出现丢库、版本问题等。
3.Unity Editor Debugger调试功能
该功能目前还是很不完善,测试过程中卡顿严重,基本上无法达到调试目的。
4.调试方式
需要注意的是,RhinoX在连接PC机的时候,是无法连接手柄的,所以很多需要交互的触发只能放在头盔上的ok按键去完成,这点还是很不方便的。
当然你也可以在安装好apk后不连接PC机去测试,但是那样看日志输出又麻烦了些~
5.第三视角展示
很多项目中为了向除操作用户外的其他用户展示MR程序运行中的效果,就需要参考官网文档第三视角展示功能,Phinox是不支持类似串流的功能,无法直接通过类似视频线的方式进行数据输出。
6.Beacon
Beacon是起到定位虚拟场景的原点位置的作用,但在笔者的开发过程中使用Beacon始终无法精准的定位位置信息和高度,怀疑可能是环境光线较强,头盔摄像头无法很好的捕捉到Beacon的位置。
这里只能后续在交付场地再完善,这也提醒大家MR设备对使用环境有一定要求。
7.输入监听
点击查看代码
/// <summary>
/// 检测右手控制器
/// </summary>
private void CheckRightController()
{
if (RXInput.IsButton(RhinoXButton.ControllerTrigger, ControllerIndex.Controller_Right_Controller))
{
Debug.Log("User is pressing button : trigger"); //用户一直按着右手控制器的trigger按键,每帧触发。
OnRightController_TriggerHold?.Invoke();
}
if (RXInput.IsButtonTap(RhinoXButton.ControllerTrigger, ControllerIndex.Controller_Right_Controller))
{
Debug.Log("User clicks button : trigger"); //用户点击右手控制器的trigger按键, 只会在点击的时候触发一次。
OnRightController_TriggerPress?.Invoke();
}
if (RXInput.IsButtonLongHeldDown(RhinoXButton.ControllerTrigger, ControllerIndex.Controller_Right_Controller))
{
Debug.Log("User long hold button : trigger"); //用户长按右手控制器的trigger按键, 只会在松开按键之前触发一次。长按时间配置见 ProjectSetting/RhinoX Setting
OnRightController_TriggerHoldOver?.Invoke();
}
if (RXInput.IsButtonTap(RhinoXButton.App, ControllerIndex.Controller_Right_Controller))
{
Debug.Log("User is pressing button : APP"); //用户点击菜单键
OnRightController_AppPress?.Invoke();
}
if (RXInput.IsButtonTap(RhinoXButton.ControllerTouchPadButton, ControllerIndex.Controller_Right_Controller))
{
Debug.Log("User is pressing button : TouchPad"); //用户点击圆盘
OnRightController_TouchPadPress?.Invoke();
}
m_TouchPadHoverDirection = TouchPadButtonDirection.Center; //用户触摸圆盘
bool ret = RXInput.GetTouchPadPointer(ref m_TouchPadHoverDirection, ControllerIndex.Controller_Right_Controller);
if (ret) Debug.Log("User is Hover button : TouchPad");
OnRightController_TouchPadHover?.Invoke((RhinoxTouchPadButtonDirection)m_TouchPadHoverDirection, ret);
if (RXInput.IsTouchPadButtonDoubleTap(TouchPadButtonDirection.Bottom, ControllerIndex.Controller_Right_Controller))
{
Debug.Log("User is pressing button : TouchPad DoublePress"); //用户双击圆盘
OnRightController_TouchPadDoublePress?.Invoke();
}
ret = RXInput.IsTouchPadButton(TouchPadButtonDirection.Bottom, ControllerIndex.Controller_Right_Controller);
if (ret) Debug.Log("User is pressing button : TouchPad Hold"); //用户按住圆盘
OnRightController_TouchPadHold?.Invoke(ret);
}
8.ARCameraRig及RxEventSystem相关组件
保证最终的场景中只有一套相关组件,尤其是资源和程序主体拆分分别打包的时候,一定需要注意,否则程序会直接崩溃。
9.Android mmap failed errno 12 out of memory错误
10.性能问题
MR项目的开发对于美术资源还是有一定的要求,无论是贴图精度还是光影,都需要进行打磨才能保证交互的流畅度,具体操作参考官方性能优化建议。
五.其他
1.RhinoX为国产MR设备,对于一些敏感类项目可以作为优先选择对象。
2.个人而言,PhinoX使用效果上还是有进步空间的,效果上和之前接触过的影创ActionOne相近(PS:刚发现影创好像解散了...),哪怕在室内空间,光线较强或颜色单一,就可能会出现画面闪烁的问题。