本文章由cartzhang編寫,轉載請註明出處。 全部權利保留。
文章連接:http://blog.csdn.net/cartzhang/article/details/50419709
做者:cartzhanghtml
1、關於Unity和Oculus插件版本markdown
針對Unity的Oculus開發,Oculus官方給出了官方插件,不一樣的Unity版本,對應不一樣的插件版本,可是在使用中,發現有些不一樣或是bug.app
Oculus的Unity 插件官方地址:https://developer.oculus.com/doc/0.1.0.0-unity/index.html函數
我做爲Unity新人,沒有用過Unity5以前的任何版本,不熟悉任何操做。因此,就根據官方推薦,使用了5.1.1版本,而後根據官方版本對應推薦,果斷選擇下載了PC端的OC的0.6.0.1版本,對應的Unity開發工具當時是下載的0.010beta版本。工具
官方推薦的各個版本對應的runtime表:
https://developer.oculus.com/documentation/game-engines/latest/concepts/unity-sdk-version-compatibility/開發工具
問題是,根據遊戲情節要求,須要在某個時刻或場景下鎖定頭盔,不能讓它轉動了。(先說須要,關於需求是否合理,這個下次接着再說)。this
2、初步瞭解插件spa
首先,先初步瞭解下插件啊。
下載完畢插件,創建個Unity空項目,拖拽到工程下,能夠看到導入後,在資源目錄下如圖:.net
在prefabs下有三個預製,而在0.4.4或0.4.2版本下有兩個預製。插件
就是實現不讓頭盔來回旋轉,這個鎖定相機就行了嘛,很簡單啊。關鍵是找對地方,代碼修改一下,就搞定了。結果並不如我想象。
3、說的容易
要找的代碼速度找到,OC插件的重要使用腳本文件有三個,
OVRCameraRig
head tracking and stereo rendering. Exposes the user's head pose with "anchor" bones.
OVRPlayerController
Represents a standing user and enables locomotion in the world.
OVRManager
A singleton that exposes the VR configuration and status to Unity.
要實現鎖定相機,並非要在Update中實時的給相機的旋轉角度賦值爲某個值的過程。
要是真這麼實現,會有什麼影響麼?
答案是確定的。鎖不住,你動下,它就動下,來回晃。
我只須要OVRCameraRig.cs文件的一個函數就能夠,找到函數:
private void UpdateAnchors()
{
bool monoscopic = OVRManager.instance.monoscopic;
OVRPose tracker = OVRManager.tracker.GetPose(0d);
trackerAnchor.localRotation = tracker.orientation;
centerEyeAnchor.localRotation = VR.InputTracking.GetLocalRotation(VR.VRNode.CenterEye);
leftEyeAnchor.localRotation = monoscopic ? centerEyeAnchor.localRotation : VR.InputTracking.GetLocalRotation(VR.VRNode.LeftEye);
rightEyeAnchor.localRotation = monoscopic ? centerEyeAnchor.localRotation : VR.InputTracking.GetLocalRotation(VR.VRNode.RightEye);
trackerAnchor.localPosition = tracker.position;
centerEyeAnchor.localPosition = VR.InputTracking.GetLocalPosition(VR.VRNode.CenterEye);
leftEyeAnchor.localPosition = monoscopic ? centerEyeAnchor.localPosition : VR.InputTracking.GetLocalPosition(VR.VRNode.LeftEye);
rightEyeAnchor.localPosition = monoscopic ? centerEyeAnchor.localPosition : VR.InputTracking.GetLocalPosition(VR.VRNode.RightEye);
if (UpdatedAnchors != null)
{
UpdatedAnchors(this);
}
}
在OVRCameraRig.cs文件的122行附近。
怎麼辦呢?寫個變量來控制,就是在外面加個if判斷,屏蔽掉全部代碼便可。
結果,是然並卵。
4、作着難,咋就不行呢
我迅速的鬱悶了。
各類糾結和嘗試以後,卸載OC,從新安裝0.4.4版本。我回退了個人OC插件版本,重建工程,使用了0.4.4版本的插件,一樣的文件,一樣的函數,一樣操做,奇蹟就發生了。
附0.4.4版本的OVRCameraRig.cs文件的UpdateAnchors函數:
private void UpdateAnchors()
{
OVRPose leftEye = OVRManager.display.GetEyePose(OVREye.Left);
OVRPose rightEye = OVRManager.display.GetEyePose(OVREye.Right);
leftEyeAnchor.localRotation = leftEye.orientation;
centerEyeAnchor.localRotation = leftEye.orientation; // using left eye for now
rightEyeAnchor.localRotation = rightEye.orientation;
leftEyeAnchor.localPosition = leftEye.position;
centerEyeAnchor.localPosition = 0.5f * (leftEye.position + rightEye.position);
rightEyeAnchor.localPosition = rightEye.position;
}
那還有什麼好說的。輕鬆實現了,鎖定頭盔,在場景中,你不能夠亂看的效果(很是規的反人類的操做!)
就只好使用0.4.4來湊合吧!!
5、實踐是檢驗標準
總結:
在OC開發工程中,要時刻記得OC runtime版本與插件版本相配套。
上面這個結果的出現,多是OC runtime版本的問題,可是也排除不了插件實現問題,比方說,用錯了接口,使用了當前OC版本以前的兼容版本接口,而OC內部怎麼實現的,我一律不知啊!
「0.1.0」–對應的OC 0.6 .0版本有19個接口,不算兼容的老的接口。
0.4.4—對應OC的0.4.4版本,接口實現有57個左右。
我只能說,接口對0.6.0,精簡了,可是我相信大的基礎功能確定都是有的。
怎麼才能避免跳入這樣的坑呢?沒有辦法,只有嘗試。
6、其餘
遇到老闆提這麼怪異的VR問題怎麼解決?
下回再說吧!!
如有問題,請隨時聯繫! 很是感謝!!!