本文章由cartzhang编写,转载请注明出处。 所有权利保留。
文章链接:http://blog.csdn.net/cartzhang/article/details/50462157
作者:cartzhang

Unity中Oculus分屏相机和普通相机一键切换

一、OCulus 分屏相机介绍

在VR开发工程中,总会觉得OC分屏的处理太慢,严重浪费时间啊!
但是不使用有不好调试,来回切换相机就成为了一个必须。

近来常用,所以就写了一个小功能来实现它。用tab来实现OC分屏相机和普通相机的切换。
说明:过于频繁切换,会导致Unity崩溃,所以限制了2秒的最短切换频率。

二、具体怎么实现呢?

首先,
新建一个工程吧。我使用的Unity版本为5.1.1f,64位版本。当然32位也是可以的。
然后,
导入了2013插件,导入了OC的0.4.4版本,使用顺手了。要是使用Unity5.3版本,并且不需要对OC相机进行控制处理的,只需所要缩放renderScale等功能的,5.3版本已经集成了,更多请参考 蛮牛的Untiy5.3 翻译

网址:http://www.manew.com/thread-45174-1-1.html?_dsign=ad0f20e3。

最后,
都导入以后,如下图:

三、相机

创建了一个相机的预制体,包括一个正常的相机,一个是OC的分屏相机。名字为Player。
如下图:

四、代码:

代码很简单,就是切换显示而已:
如下:

using UnityEngine;
using System.Collections;namespace SLQJ_VR
{public class ShiftCamera : MonoBehaviour{[Header("相机类型")]public CameraType cameraType;[Header("旋转速度")]public float Speed = 100;public KeyCode ShiftKey = KeyCode.Tab;private float shiftStartTime;private float shiftDelayTime = 2.0f;private Transform XRotateObject;private Transform YRotateObject;private string nomalCamera = "NormalCamera";private string stereoCamera = "OVRCameraRig";private GameObject mCurrentCamera = null;void Awake(){shiftStartTime = Time.time;XRotateObject = this.transform;CameraChoose();}public GameObject GetCurrentCamera(){CameraChoose();return mCurrentCamera;}// Update is called once per framevoid Update(){CameraYaw();CameraPitch();//ShiftCameraUseKey();ShowLookDirect();}/// <summary>/// 键盘控制相机的旋转。/// </summary>private void CameraPitch(){  if(null != YRotateObject)// Vertical{YRotateObject.Rotate(new Vector3(Speed * Time.deltaTime * Input.GetAxis("Vertical"), 0, 0));}}private void CameraYaw(){if (null != XRotateObject)//Horizontal {XRotateObject.Rotate(new Vector3(0, Speed * Time.deltaTime * Input.GetAxis("Horizontal"), 0));}}/// <summary>/// 使用tab键,来切换相机/// </summary>private void ShiftCameraUseKey(){if (Input.GetKey(ShiftKey) && Time.time - shiftStartTime >= shiftDelayTime){shiftStartTime = Time.time;cameraType++;cameraType = (CameraType)((int)cameraType % (int)CameraType.Size);CameraChoose();}}/// <summary>/// 在编辑器模式下,显示条方向线/// </summary>private void ShowLookDirect(){#if !UNITY_ANDROID || UNITY_EDITORif (Input.GetKey(KeyCode.Escape)){Application.Quit();}Vector3 StartPt = mCurrentCamera.transform.position;Vector3 TmpDirector = mCurrentCamera.transform.forward;Debug.DrawRay(StartPt, TmpDirector * 1000);
#endif}/// <summary>/// 相机选择/// </summary>void CameraChoose(){if (CameraType.Normal == cameraType){YRotateObject = transform.FindChild(nomalCamera);mCurrentCamera = YRotateObject.gameObject;mCurrentCamera.SetActive(true);transform.FindChild(stereoCamera).gameObject.SetActive(false);}else{YRotateObject = transform.FindChild(stereoCamera);mCurrentCamera = YRotateObject.gameObject;mCurrentCamera.SetActive(true);transform.FindChild(nomalCamera).gameObject.SetActive(false);}}}public enum CameraType{/// <summary>/// 正常相机/// </summary>Normal = 0,        /// /// <summary>/// OC相机/// </summary>Stereo = 1,/// <summary>/// 总类型个数/// </summary>Size = Stereo + 1}
}

代码基本都带了注释,不多说了。
不过,要说的一点,就是代码中,把相机对象的旋转,X方向和Y方向的旋转也就是Pitch和Yaw给分开了,很明显这好处大大的。

五、结论

按下tab 键,不要着急,因为从正常相机切换到双屏渲染,要稍微费些时间。
当然,切换到正常模式相机还是很迅速的。这个切换时间问题,只能这样。

六、源码工程

源码工程地址—Csdn免分下载地址: http://download.csdn.net/detail/cartzhang/9390722

就这样!!
———-THE END—————————
若有问题,请随时联系!!!
非常感谢!!

转载于:https://www.cnblogs.com/qitian1/p/6461929.html

Unity中Oculus分屏相机和普通相机一键切换相关推荐

  1. Cinemachine教程 | Unity中如何快速制作相机切换动画?

    摘要:使用Cinemachine可以快速制作相机切换动画,来看看我是怎么做的吧. 洪流学堂,让你快人几步.你好,我是跟着大智学Unity的萌新,我叫小新,这是我本周的学习总结报告哦. 好久不见.我最近 ...

  2. c语言中如何分屏,如何让双屏发挥最大价值?原来是这样

    在PC领域中,"分屏"的概念以及其应用场景都已经日趋成熟,而在日常使用的时候,也经常会有出现单屏不太够用的情况,在这种时候我们就可以把第二个显示器安排上了,不仅可以大幅提高工作效率 ...

  3. Android OpenGL开发学习(二)手把手教你实现抖音分屏相机

    目录 前言 一.常规操作 二.使用步骤 1.创建SurfaceTexture 2.自定义Renderer 3.坐标系 4.OpenGL和Camera相结合 5.实际运行效果 6.分屏效果 7.项目地址 ...

  4. unity中如何多屏显示

    多屏显示分两种情况: 第一种情况:unity中可以为单独的摄像机设置显示屏,例如camera1的图像显示在屏幕1,camera2的图像显示在屏幕2等等.这方面内容可以根据unity官方文档中的mult ...

  5. 网页设计框架布局代码_网页设计中的分屏切割布局法

    今天和大家聊的是一种关于网页设计中的视觉呈现方法,一般我们称之为"分屏布局",是一种常见的网页设计排版方式,将页面分割为均等或者不均等的两部分,这种方式的好处就是可以将文字信息和图 ...

  6. linux分屏命令,Linux中如何分屏显示的指令是什么

    linux中如果想要把某个命令或者程序执行的输出结果分屏显示,可以使用more工具来实现.是几乎所有linux发行版都自带的一个分屏显示的工具. 1:如果只是输出一个文件的内容,可以直接用more来输 ...

  7. linux分屏显示两个文件内容,在linux中,如何分屏显示一个文件(如.txt)的内容?指令或快捷键...

    linux中如果想要把某个命令或者程序执行的输出结果分屏显示,可以使用more工具来实现.是几乎所有linux发行版都自带的一个分屏显示的工具. 1:如果只是输出一个文件的内容,可以直接用more来输 ...

  8. 眼睛慢慢眯成一条线的人都是实力很强劲的,教你在Unity中通过BlendShape来实现角色面部表情过渡切换(Animation)

    文章目录 一.前言 二.BlendShape(动画师.MAYA) 三.Unity控制BlendShapes 1.SkinnedMeshRenderer控制BlendShape 2.Animation控 ...

  9. 关于Unity中GrabPass截屏的使用和Shader的组织优化

    GrabPass截屏 可以用来截屏,截屏后把纹理传给下一个通道使用. 1:使用抓屏通道, GrabPass {} 或 GrabPass { " 纹理名称"}; 使用GrabPass ...

最新文章

  1. 【问题收录】在ubuntu14.04 64位下运行jd-gui
  2. 行为模式之Intepreter模式
  3. Fedora 30将获得Bash 5.0,淘汰Yum推迟到Fedora 31
  4. C语言 利用malloc()和realloc()动态分配内存
  5. 微信支付通知 php,微信支付开发交易通知实例
  6. python pandas csv读取_如何用 pandas 读取 csv 和 Excel 数据
  7. Kotlin入门(14)继承的那些事儿
  8. java23中设计模式——行为模式——Chain of Responsibility(职责链)
  9. 存储过程之游标笔记小结
  10. [Maven] Project build error: 'packaging' with value 'jar' is invalid. Aggregator projects require
  11. wamp新建虚拟目录无法运行的解决方法
  12. Xcode多Build Configurations环境下使用Reveal
  13. linux下画pcb的软件,Linux下画原理图和PCB
  14. 电力载波通信了解笔记
  15. Linux命令之ss命令
  16. PDF文件怎么转Word文档?教你两种转换方法
  17. js如何删除数组第一个和最后一个元素和数组里添加元素
  18. 计算机加密无法连接打印机,0x00000006无法连接打印机怎么办
  19. java编写猜词游戏
  20. 通过银行卡前缀判断归属

热门文章

  1. POJ 2653 Pick-up sticks (线段相交)
  2. Cisco IPSec *** Gre over --- SVTI
  3. DoTween(HOTween V2) 教程
  4. EM 不能启动,重新设置无效
  5. Android windowSoftInputMode属性解析
  6. Android 音频录制和播放问题
  7. NAT(修改IP包的IP或者Port) NAT穿越 keepalive包(IP包),保持映射关系
  8. 06- 本地方法接口
  9. Android 应用程序发布流程注意事项(整理)
  10. 【UVA1638】杆子的排列