Unity中Oculus分屏相机和普通相机一键切换
本文章由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分屏相机和普通相机一键切换相关推荐
- Cinemachine教程 | Unity中如何快速制作相机切换动画?
摘要:使用Cinemachine可以快速制作相机切换动画,来看看我是怎么做的吧. 洪流学堂,让你快人几步.你好,我是跟着大智学Unity的萌新,我叫小新,这是我本周的学习总结报告哦. 好久不见.我最近 ...
- c语言中如何分屏,如何让双屏发挥最大价值?原来是这样
在PC领域中,"分屏"的概念以及其应用场景都已经日趋成熟,而在日常使用的时候,也经常会有出现单屏不太够用的情况,在这种时候我们就可以把第二个显示器安排上了,不仅可以大幅提高工作效率 ...
- Android OpenGL开发学习(二)手把手教你实现抖音分屏相机
目录 前言 一.常规操作 二.使用步骤 1.创建SurfaceTexture 2.自定义Renderer 3.坐标系 4.OpenGL和Camera相结合 5.实际运行效果 6.分屏效果 7.项目地址 ...
- unity中如何多屏显示
多屏显示分两种情况: 第一种情况:unity中可以为单独的摄像机设置显示屏,例如camera1的图像显示在屏幕1,camera2的图像显示在屏幕2等等.这方面内容可以根据unity官方文档中的mult ...
- 网页设计框架布局代码_网页设计中的分屏切割布局法
今天和大家聊的是一种关于网页设计中的视觉呈现方法,一般我们称之为"分屏布局",是一种常见的网页设计排版方式,将页面分割为均等或者不均等的两部分,这种方式的好处就是可以将文字信息和图 ...
- linux分屏命令,Linux中如何分屏显示的指令是什么
linux中如果想要把某个命令或者程序执行的输出结果分屏显示,可以使用more工具来实现.是几乎所有linux发行版都自带的一个分屏显示的工具. 1:如果只是输出一个文件的内容,可以直接用more来输 ...
- linux分屏显示两个文件内容,在linux中,如何分屏显示一个文件(如.txt)的内容?指令或快捷键...
linux中如果想要把某个命令或者程序执行的输出结果分屏显示,可以使用more工具来实现.是几乎所有linux发行版都自带的一个分屏显示的工具. 1:如果只是输出一个文件的内容,可以直接用more来输 ...
- 眼睛慢慢眯成一条线的人都是实力很强劲的,教你在Unity中通过BlendShape来实现角色面部表情过渡切换(Animation)
文章目录 一.前言 二.BlendShape(动画师.MAYA) 三.Unity控制BlendShapes 1.SkinnedMeshRenderer控制BlendShape 2.Animation控 ...
- 关于Unity中GrabPass截屏的使用和Shader的组织优化
GrabPass截屏 可以用来截屏,截屏后把纹理传给下一个通道使用. 1:使用抓屏通道, GrabPass {} 或 GrabPass { " 纹理名称"}; 使用GrabPass ...
最新文章
- 【问题收录】在ubuntu14.04 64位下运行jd-gui
- 行为模式之Intepreter模式
- Fedora 30将获得Bash 5.0,淘汰Yum推迟到Fedora 31
- C语言 利用malloc()和realloc()动态分配内存
- 微信支付通知 php,微信支付开发交易通知实例
- python pandas csv读取_如何用 pandas 读取 csv 和 Excel 数据
- Kotlin入门(14)继承的那些事儿
- java23中设计模式——行为模式——Chain of Responsibility(职责链)
- 存储过程之游标笔记小结
- [Maven] Project build error: 'packaging' with value 'jar' is invalid. Aggregator projects require
- wamp新建虚拟目录无法运行的解决方法
- Xcode多Build Configurations环境下使用Reveal
- linux下画pcb的软件,Linux下画原理图和PCB
- 电力载波通信了解笔记
- Linux命令之ss命令
- PDF文件怎么转Word文档?教你两种转换方法
- js如何删除数组第一个和最后一个元素和数组里添加元素
- 计算机加密无法连接打印机,0x00000006无法连接打印机怎么办
- java编写猜词游戏
- 通过银行卡前缀判断归属
热门文章
- POJ 2653 Pick-up sticks (线段相交)
- Cisco IPSec *** Gre over --- SVTI
- DoTween(HOTween V2) 教程
- EM 不能启动,重新设置无效
- Android windowSoftInputMode属性解析
- Android 音频录制和播放问题
- NAT(修改IP包的IP或者Port) NAT穿越 keepalive包(IP包),保持映射关系
- 06- 本地方法接口
- Android 应用程序发布流程注意事项(整理)
- 【UVA1638】杆子的排列