燧光Rhino-X+Unity开发笔记

Castle2048 / 2023-08-18 / 原文

一.前言

  该文档的目的是记录开发过程中使用的燧光RhinoX眼镜和Unity引擎和所遇到的问题及解决方式。

二.相关文档

1.PhinoX-Unity开发文档
2.官网设备介绍

三.开发环境

1.Unity2020.3.47
2.Rhino-For-Unity-2020 Plugin

四.问题列表

1.RhinoX设备基本参数如下:
image
  操作系统为Android 7.1,头显和控制器为6DOF。其中,6GB的运存无法支撑大场景或复杂场景的加载和渲染,需要提前在这里预留余量。
2.Unity-apk打包
image
  在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机去测试,但是那样看日志输出又麻烦了些~
image
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错误
image
image

10.性能问题
  MR项目的开发对于美术资源还是有一定的要求,无论是贴图精度还是光影,都需要进行打磨才能保证交互的流畅度,具体操作参考官方性能优化建议。
image

五.其他

1.RhinoX为国产MR设备,对于一些敏感类项目可以作为优先选择对象。
2.个人而言,PhinoX使用效果上还是有进步空间的,效果上和之前接触过的影创ActionOne相近(PS:刚发现影创好像解散了...),哪怕在室内空间,光线较强或颜色单一,就可能会出现画面闪烁的问题。