本文章由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;}
void Update(){CameraYaw();CameraPitch();ShiftCameraUseKey();ShowLookDirect();}
private void CameraPitch(){
if(
null != YRotateObject){YRotateObject.Rotate(
new Vector3(Speed * Time.deltaTime * Input.GetAxis(
"Vertical"),
0,
0));}}
private void CameraYaw(){
if (
null != XRotateObject){XRotateObject.Rotate(
new Vector3(
0, Speed * Time.deltaTime * Input.GetAxis(
"Horizontal"),
0));}}
private void ShiftCameraUseKey(){
if (Input.GetKey(ShiftKey) && Time.time - shiftStartTime >= shiftDelayTime){shiftStartTime = Time.time;cameraType++;cameraType = (CameraType)((
int)cameraType % (
int)CameraType.Size);CameraChoose();}}
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}
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{Normal =
0, Stereo =
1,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
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生
總結
以上是生活随笔為你收集整理的Unity中Oculus分屏相机和普通相机一键切换的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。