【GearVR】 Gear VR 入門(mén)教程之二 獲取用戶輸入

首先簡(jiǎn)單介紹下Gear? VR頭盔上的功能按鍵:

Gear VR 第一代 的功能按鍵全部位于頭盔右側(cè)漱贱,分別如下:

兩個(gè)音量增減鍵掂僵,用來(lái)調(diào)節(jié)手機(jī)的音量反惕,功能和手機(jī)本身的音量鍵完全一樣

一個(gè)返回鍵昌渤,類似android手機(jī)上的返回鍵齐邦,在VR游戲中可以用來(lái)實(shí)現(xiàn)椎侠,返回主菜單,或者退出游戲之類的操作

觸控區(qū)域措拇,可以通過(guò)該區(qū)域識(shí)別玩家的點(diǎn)擊我纪,按下,松開(kāi)丐吓,雙擊浅悉,長(zhǎng)按,以及滑動(dòng)操作券犁,這將是玩家在游戲內(nèi)的主要操作方式(還有一個(gè)就是頭部的轉(zhuǎn)動(dòng))术健。當(dāng)然從個(gè)人體驗(yàn)來(lái)講,因?yàn)樵搮^(qū)域位于頭部側(cè)方粘衬,不同于手機(jī)屏幕荞估,不適合讓玩家通過(guò)滑動(dòng)來(lái)完成太復(fù)雜的操作,超過(guò)上下左右四方向以外的滑動(dòng)識(shí)別稚新,體驗(yàn)都不是很好勘伺。

通過(guò)圖片和按鍵講解可以看到,gearVR 與暴風(fēng)魔鏡之流的設(shè)備的區(qū)別就是褂删,它通過(guò)USB口連接手機(jī)飞醉,然后玩家可以通過(guò)頭戴設(shè)備的輸入完成一些相對(duì)完善的操作。

Unity是如何映射這些功能按鍵的:

用Unity創(chuàng)建一個(gè)空項(xiàng)目屯阀,GearVRTest_1_2,然后打開(kāi)InputManager:通過(guò)Edit-> Project Settings ->Input

點(diǎn)開(kāi)第一個(gè)Fire1:可以看到這個(gè)名稱對(duì)應(yīng)的按鍵是Left Ctrl(鍵盤(pán)上的左Ctrl鍵)缅帘,以及mouse 0(鼠標(biāo)左鍵,同時(shí)也是觸屏手機(jī)的單點(diǎn)觸屏操作难衰,也是GearVR touchpad的點(diǎn)擊操作)

點(diǎn)開(kāi)第二個(gè)Fire1:可以看到對(duì)應(yīng)的是joystick button 0 (也就是手柄上第二排第一個(gè)按鍵)

點(diǎn)開(kāi)唯一的一個(gè)Cancel:可以看到對(duì)應(yīng)的是escape(鍵盤(pán)左上角的esc鍵和安卓手機(jī)和GearVR的返回鍵)股毫,以及joystick button 1(手柄上的第二個(gè)按鍵)

通過(guò)這些按鍵映射可以看到,我們可以通過(guò)合理的按鍵映射召衔,可以使我們的VR游戲做到手機(jī),頭顯和藍(lán)牙手柄公用一套按鍵邏輯(VR頭顯bing)

通過(guò)代碼獲取玩家操作:

我們要實(shí)現(xiàn)的是一個(gè)獲取玩家輸入的腳本祭陷,而不處理具體邏輯苍凛,行為邏輯代碼通過(guò)委托的方式從該腳本獲取玩家的操作


[csharp]view plaincopy

usingUnityEngine;

usingSystem.Collections;

usingSystem;

namespacecom.bt.gearVR

{

publicclassVRInput?:?MonoBehaviour

{

publicenumSwipeDirection

{

NONE,

UP,

DOWN,

LEFT,

RIGHT,

};

publiceventAction?OnSwipe;//在touchPad上滑動(dòng)

publiceventAction?OnClick;//點(diǎn)擊touchPad

publiceventAction?OnDown;//按下

publiceventAction?OnUp;//抬起

publiceventAction?OnDoubleClick;//雙擊

publiceventAction?OnCancel;//點(diǎn)擊touchPad的返回鍵

[SerializeField]privatefloatm_DoubleClickTime=0.3f;//有效雙擊的最大時(shí)間間隔

[SerializeField]privatefloatm_SwipeWidth=0.3f;//有效滑動(dòng)的最小位移

privateVector2?m_MouseDownPosition;//記錄手指按下的位置

privateVector2?m_MouseUpPosition;//記錄手指抬起的位置

privatefloatm_LastMouseUpTime;//上一次手指抬起的時(shí)間趣席,用來(lái)檢測(cè)雙擊

privatefloatm_LastHorizontalValue;

privatefloatm_LastVerticalValue;

publicfloatDoubleClickTime?{get{returnm_DoubleClickTime;?}?}

//?Use?this?for?initialization

voidStart()

{

}

//?Update?is?called?once?per?frame

privatevoidUpdate()

{

CheckInput();

}

privatevoidCheckInput()

{

SwipeDirection?swipe?=?SwipeDirection.NONE;

if(Input.GetButtonDown("Fire1"))//手指觸碰到touchPad

{

m_MouseDownPosition?=newVector2(Input.mousePosition.x,?Input.mousePosition.y);

if(OnDown!=null)

{

OnDown();

}

}

if(Input.GetButtonUp("Fire1"))//手指離開(kāi)touchPad

{

m_MouseUpPosition?=newVector2(Input.mousePosition.x,?Input.mousePosition.y);

swipe?=?DetectSwipe();//

}

if(swipe==SwipeDirection.NONE)

{

swipe?=?DetectKeyboardEmulatedSwipe();

}

if(OnSwipe!=null)

{

OnSwipe(swipe);

}

if(Input.GetButtonUp("Fire1"))

{

if(OnUp!=null)

{

OnUp();

}

if(Time.time-m_LastMouseUpTime

{

if(OnDoubleClick!=null)

{

OnDoubleClick();

}

}

else

{

if(OnClick!=null)

{

OnClick();

}

}

m_LastMouseUpTime?=?Time.time;

}

if(Input.GetButtonDown("Cancel"))//點(diǎn)擊頭顯上的返回鍵

{

if(OnCancel!=null)

{

OnCancel();

}

}

}

///?

///?檢測(cè)滑動(dòng)方向

///?

///??滑動(dòng)方向,上下左右

privateSwipeDirection?DetectSwipe()

{

Vector2?swipeData?=?(m_MouseUpPosition?-?m_MouseDownPosition).normalized;

boolswipeIsVertical?=?Mathf.Abs(swipeData.x)?<?m_SwipeWidth;

boolswipeIsHorizontal?=?Mathf.Abs(swipeData.y)?<?m_SwipeWidth;

if(swipeData.y>0f?&&?swipeIsVertical)

{

returnSwipeDirection.UP;

}

if(swipeData.y<0?&&?swipeIsVertical)

{

returnSwipeDirection.DOWN;

}

if(swipeData.x>0?&&?swipeIsHorizontal)

{

returnSwipeDirection.RIGHT;

}

if(swipeData.x<0&&?swipeIsHorizontal)

{

returnSwipeDirection.LEFT;

}

returnSwipeDirection.NONE;

}

//檢測(cè)鍵盤(pán)或者手柄模擬的晃動(dòng)方向

privateSwipeDirection?DetectKeyboardEmulatedSwipe()

{

floathorizontal?=?Input.GetAxis("Horizontal");

floatvertical?=?Input.GetAxis("Vertical");

boolnoHorizontalInputPreviously?=?Mathf.Abs(m_LastHorizontalValue)?

boolnoVerticalInputPreviously?=?Mathf.Abs(m_LastVerticalValue)?

m_LastHorizontalValue?=?horizontal;

m_LastVerticalValue?=?vertical;

if(vertical?>?0f?&&?noVerticalInputPreviously)

returnSwipeDirection.UP;

if(vertical?<?0f?&&?noVerticalInputPreviously)

returnSwipeDirection.DOWN;

if(horizontal?>?0f?&&?noHorizontalInputPreviously)

returnSwipeDirection.RIGHT;

if(horizontal?<?0f?&&?noHorizontalInputPreviously)

returnSwipeDirection.LEFT;

returnSwipeDirection.NONE;

}

privatevoidOnDestroy()

{

OnSwipe?=null;

OnClick?=null;

OnDoubleClick?=null;

OnDown?=null;

OnUp?=null;

}

}

}

然后是測(cè)試代碼醇蝴,后面會(huì)上傳項(xiàng)目路徑宣肚,會(huì)有一個(gè)控制玩家移動(dòng)的腳本,這里不再貼出

[csharp]view plaincopy

usingUnityEngine;

usingSystem.Collections;

namespacecom.bt.gearVR

{

publicclassVRInputTest?:?MonoBehaviour

{

[SerializeField]privateVRInput?m_VRInput;

//該腳本激活時(shí)悠栓,注冊(cè)對(duì)玩家操作的監(jiān)聽(tīng)

voidOnEnable()

{

m_VRInput.OnCancel?+=?OnCalcel;

m_VRInput.OnClick?+=?OnClick;

m_VRInput.OnDown?+=?OnDown;

m_VRInput.OnUp?+=?OnUp;

m_VRInput.OnDoubleClick?+=?OnDoubleClick;

m_VRInput.OnSwipe?+=?OnSwip;

}

voidOnSwip(VRInput.SwipeDirection?swipeDirection)

{

if(swipeDirection!=VRInput.SwipeDirection.NONE)

{

Debug.Log("Unity+OnSwipe"+?swipeDirection);

}

}

//取消對(duì)玩家輸入的監(jiān)聽(tīng)

voidOnDisable()

{

m_VRInput.OnCancel?-=?OnCalcel;

m_VRInput.OnClick?-=?OnClick;

m_VRInput.OnDown?-=?OnDown;

m_VRInput.OnUp?-=?OnUp;

m_VRInput.OnDoubleClick?-=?OnDoubleClick;

m_VRInput.OnSwipe?-=?OnSwip;

}

voidOnCalcel()

{

Debug.Log("Unity+OnCancel");

}

voidOnClick()

{

Debug.Log("Unity+OnClick");

}

voidOnDown()

{

Debug.Log("Unity+OnDown");

}

voidOnUp()

{

Debug.Log("Unity+OnUp");

}

voidOnDoubleClick()

{

Debug.Log("Unity+OnDoubleClick");

}

//?Use?this?for?initialization

voidStart()

{

}

}

}

注1:GearVR第二代又新加了一個(gè)Home鍵霉涨,功能類似于手機(jī)上的Home鍵,游戲內(nèi)用不到這里不再列出

注2:玩家在游戲內(nèi)移動(dòng)時(shí)惭适,不可以直接移動(dòng)攝像機(jī)本身笙瑟,因?yàn)镚earVR限制了攝像機(jī)的移動(dòng),但是可以把攝像機(jī)掛到一個(gè)父節(jié)點(diǎn)下癞志,通過(guò)移動(dòng)父節(jié)點(diǎn)來(lái)移動(dòng)攝像機(jī)

注3:本教程中的部分代碼和圖片來(lái)源于Unity官方的教程往枷,VRSamples,感興趣的讀者可以去AssetsStore下載

Demo下載地址:https://git.coding.net/bt_coder/GearVRTurorial_1_2.git

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末凄杯,一起剝皮案震驚了整個(gè)濱河市错洁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌戒突,老刑警劉巖屯碴,帶你破解...
    沈念sama閱讀 222,000評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異膊存,居然都是意外死亡导而,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)膝舅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)嗡载,“玉大人,你說(shuō)我怎么就攤上這事仍稀⊥莨觯” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,561評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵技潘,是天一觀的道長(zhǎng)遥巴。 經(jīng)常有香客問(wèn)我,道長(zhǎng)享幽,這世上最難降的妖魔是什么铲掐? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,782評(píng)論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮值桩,結(jié)果婚禮上摆霉,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好携栋,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布搭盾。 她就那樣靜靜地躺著,像睡著了一般婉支。 火紅的嫁衣襯著肌膚如雪鸯隅。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,394評(píng)論 1 310
  • 那天向挖,我揣著相機(jī)與錄音蝌以,去河邊找鬼。 笑死何之,一個(gè)胖子當(dāng)著我的面吹牛跟畅,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播帝美,決...
    沈念sama閱讀 40,952評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼碍彭,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了悼潭?” 一聲冷哼從身側(cè)響起庇忌,我...
    開(kāi)封第一講書(shū)人閱讀 39,852評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎舰褪,沒(méi)想到半個(gè)月后皆疹,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,409評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡占拍,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評(píng)論 3 341
  • 正文 我和宋清朗相戀三年略就,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片晃酒。...
    茶點(diǎn)故事閱讀 40,615評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡表牢,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出贝次,到底是詐尸還是另有隱情崔兴,我是刑警寧澤,帶...
    沈念sama閱讀 36,303評(píng)論 5 350
  • 正文 年R本政府宣布蛔翅,位于F島的核電站敲茄,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏山析。R本人自食惡果不足惜堰燎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望笋轨。 院中可真熱鬧秆剪,春花似錦赊淑、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,470評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至何什,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間等龙,已是汗流浹背处渣。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,571評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蛛砰,地道東北人罐栈。 一個(gè)月前我還...
    沈念sama閱讀 49,041評(píng)論 3 377
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像泥畅,于是被迫代替她去往敵國(guó)和親荠诬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 首先簡(jiǎn)單介紹下Gear VR頭盔上的功能按鍵: Gear VR 第一代 的功能按鍵全部位于頭盔右側(cè)位仁,分別如下: 兩...
    壹米玖坤閱讀 1,266評(píng)論 0 0
  • ¥開(kāi)啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開(kāi)一個(gè)線程柑贞,因...
    小菜c閱讀 6,444評(píng)論 0 17
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,302評(píng)論 25 707
  • 有一日與一個(gè)朋友在家中閑聊,我們談自己的往事聂抢,她小時(shí)候是外公外婆帶大成人的钧嘶,從很小的時(shí)候父母為了生計(jì)奔赴一線城市進(jìn)...
    凡卡閱讀 371評(píng)論 0 3
  • 英簽的等待時(shí)間較長(zhǎng),好在有效期給了兩年琳疏。 既然人家給面子有决,那么去了就要細(xì)細(xì)地觀察。就倫敦一地可去的地方多了...
    行天下2016閱讀 2,155評(píng)論 4 8