当前位置:   article > 正文

Unity3D+PicoVR两个月开发小结_unity+vr

unity+vr

流程:Unity前端开发一条龙体验:建模->光照->UI&交互->功能

不断探索的Unity+VR开发小白一枚,诸君共勉!

关于场景切换

场景切换时,销毁场景中的一切非全局对象。

要想保持对象或参数不变,两种方法:
场景间传递参数,得到参数后重新生成对象:PlayerPrefs.SetInt(“”) PlayerPrefs.GetInt(“”)

设定跨场景的全局类,将场景共用或需要保留的参数放在其中。例如游戏管理员类,其中需要进行全局控制的参数可设置为静态变量。

关于摄像机

控制摄像机渲染层级:cullingMask
物体有两个常用的分类方式Tag标签+Layer层级,摄像机的渲染层级只与Layer有关。

摄像机有透视视角和正交视角,其中透视视角下有一个物理摄像机选项,勾选后可自定义焦距等,可更加灵活定制。

关于相对位置关系

比如要让一个菜单锚定在用户眼前,可先绑定用户眼前相对位置,再LookAt即可。总之,控制锚定效果时,先考虑坐标位置,再考虑转向。

关于继承

类继承自某些类后,才可使用相应方法。例如继承IPointerEnterHandler类可使用OnPointerEnter方法实现光标移到上面触发效果,继承IPointerExitHandler类可使用OnPointerExit方法实现光标离开上面触发效果。

关于按键检测

使用按键弹起检测方法,因为每个用户按下按键的时间长度不同,为避免多次触发事件,在按键最后一次处于按下状态并将要弹起时,进行检测。检测当前帧和前一帧的按键按下状态,如果前一帧处于按下状态,当前帧处于弹起状态,再触发按键绑定事件。既是防止按太多次出现bug,又可以提高性能。

关于自发光材质

Opaque不透明渲染模式下,可勾选Emission自发光,并可设置其是烘焙效果还是动态效果。

关于物理引擎

产生碰撞的条件:碰撞双方都有碰撞体组件,且碰撞后产生运动的一方需有刚体组件。
能不用重力就不用重力,三维的效果用二维的思路来实现,有时候简单且效果好,所以理解项目需求的时候要考虑清楚。
如果只是玩家主角去发生碰撞,用角色控制器替代碰撞体+刚体更好。

关于本地存储

System.IO类,还没过多研究。

关于Update

要让数值按照每秒多少进行变化时,只需在Update中将数值*Time.deltaTime即可。

关于委托

调用官方的方法接口,一旦触发了该方法,就委托自己的方法执行
PXR_Plugin.System.FocusStateLost = OnFocusStateLost; //头显失去焦点时调用
PXR_Plugin.System.FocusStateAcquired = OnFocusStateAcquired; //头显获得焦点时调用

关于面向对象

C#编程中,万物皆是类。在Unity封装的C#编程中,组件类也属于类,要多用Unity引擎自带的组件类,比如UI中的Button、物理引擎中的xxxCollider等。可以很方便地获取物体身上的组件类或是自定义类。

类的变量和方法尽量使用私有域,在全局需要使用的情况下使用公有域静态变量或方法,在需要在引擎中进行赋值的情况下使用[SerializeField]序列化功能。

调用类中的方法时,使用方法传参+列表,可以省去很多代码行数和拖拽操作。

关于调试

Unity调试:在每一段功能代码最后,写入Debug.log(“xx功能”),这样运行起来,哪个功能是否执行成功一目了然;
运行的时候,可打开Stats面板,看看Batches是否跳得很频繁,视野范围内三角面和顶点数是否过大,根据数据定位问题。
PicoVR调试:多用PicoVR自带调试工具Pico Live Preview,除灯光及少数PicoSDK不开放的功能接口外,其余功能都可以测试。

关于打包

场景中所有用到的资源都会被打包,项目其他未在场景中用到的资源不会被打包。打包后,可查看EditorLog,如果某些资源占容量较大且不会被用到,可以删掉。

关于发布

以安卓平台发布为例,公司名、应用名称、版本名、版本号、附加签名都需要保持一致,否则将不是同一个应用。可不附加签名,但一旦附加签名后,要妥善保管自己的签名。

关于预制体

预制体上只能绑定预制体物体,不能绑定非预制体物体。
因此,场景中需要绑定或被绑定的物体,要么全做成预制体,要么全解开预制体。

关于性能优化!!!

灯光烘焙:不需要过于真实地模拟灯光效果的地方用烘焙贴图,打到人物等动态物体身上的光可用混合光照。

面数高或者附带很多动画、脚本的物体需要反复出现和消失时,可以少用setActive和Instantiate,改用其他方法实现,比如设置摄像机的渲染层级,或者,将目标物体的坐标位置移出视野之外等等。
比如,在控制UI显隐时,最简单实现的方法是setActive,但以下方法可能性能上更优:给目标UI增加CanvasGroup组件,脚本中设置其alpha透明度、interactable可交互性、blocksRaycasts射线点击效果,进而控制其显隐。

场景中用到的RenderTexture,考虑降低其分辨率。

使用多个摄像机时,应用的性能消耗=全部摄像机的性能消耗,因此尽量不要让多个摄像机同时出现。

摄像机组件上,勾选遮挡剔除功能。

关于协程

项目中用到的地方:下载网上的文件并加载出来。一个携程用于一直下载,一个携程用于一直加载下载好的文件,如果没有文件则不执行操作。

关于规范编程(代码可读性、易用性)!!!

物体、类、变量(属性)、方法的命名使用英文常用缩写或全拼,变量采用小驼峰命名法,物体、类、方法采用大驼峰命名法;

每一段功能前写段注释,或者在功能后写Debug.log;变量第一次声明或难以读懂的代码处写行注释。

关于架构

做项目刚开始,一定要对整个项目有个初步规划,搭建合适的架构,并每周花一点时间去整理这个架构。

关于第三方SDK

①ReadyPlayerMe:一个可自定义三维虚拟人的平台。可通过捏脸或者上传照片、视频的方式创造一个三维虚拟人,可导出三维虚拟人模型,免费。

②InworldAI:一个可自定义AI人交互的平台。角色模型可由ReadyPlayerMe导出(两个平台合作的),也可自己上传模型。在平台上可通过文字或者维基百科链接,来定义这个AI人的知识库、个人背景、性格、情绪等,定义好后便可导出一套预制体在Unity中使用。免费版每个月限定一定时长,因服务器在国外有时候连接不上。

③final-IK:一个可实现高自由度虚拟化身的插件。自己准备好虚拟化身模型,在模型下设定好各身体部位的位置,插件导入Unity后,将模型的各部位位置绑定到插件对应位置,比如头部、左右手、左右腿、左右肩膀等等,接下来就看自己如何控制这些位置点移动了。

④Fusion:声网,一个实现多人语音的插件。同事做的,如果我来重构,大概率会采用PicoVR官方提供的RTC实时语音服务。

⑤Photon:光子云,一个用于实现多人网络同步的服务器。同事做的,原理是通过服务器同步多个客户端中的一组参数(比如自己和对方头部在空间中所处位置),获得参数后送到Unity客户端本地处理。服务器可部署到国内,例如放到阿里云或自己公司服务器上。免费版超过一定人数联机,负荷过大会卡顿,付费版会好很多。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小桥流水78/article/detail/779342
推荐阅读
相关标签
  

闽ICP备14008679号