PlayMaker:觸發(fā)事件

事件(event)的觸發(fā)是PlayMaker交互設(shè)計(jì)的基礎(chǔ)。


鼠標(biāo)(mouse)蒿囤、鍵盤(keyboard)粉怕、按鈕(button)觸發(fā)

這類觸發(fā)邏輯的原理是:
當(dāng)用戶通過輸入設(shè)備(比如鼠標(biāo)吼句、鍵盤根资、觸碰屏、手柄等)向游戲發(fā)送信息時(shí)(比如按鍵被按下倒槐、滾輪被撥動(dòng)等等)旬痹,觸發(fā)指定event并通過該event實(shí)現(xiàn)狀態(tài)改變。

PlayMaker中Input類別下的動(dòng)作列表

這類觸發(fā)事件的相關(guān)動(dòng)作可以在PlayMaker的Input Actions中找到。


1. 鼠標(biāo)(mouse)

GetMouseButton.png
GetMouseButtonDown.png
GetMouseButtonUp.png
  • GetMouseButton
    單純檢測(cè)鼠標(biāo)按鍵是否被按下唱凯,并將結(jié)果儲(chǔ)存在一個(gè)bool變量中
  • GetMouseButtonDown
    在鼠標(biāo)按鍵被按下時(shí)立刻觸發(fā)指定event
  • GetMouseButtonUp
    在鼠標(biāo)按鍵被松開時(shí)立刻觸發(fā)指定event

我們可以在PlayMaker中檢測(cè)到的鼠標(biāo)按鈕包括:Left羡忘、Middle、Right磕昼、None卷雕。

注意:MouseButtonDown不等于鼠標(biāo)單擊。鼠標(biāo)單擊代表快速執(zhí)行按鍵的按下和松開兩個(gè)操作票从。如果一定需要檢測(cè)“單擊”輸入操作漫雕,需要使用多個(gè)state來設(shè)計(jì)一個(gè)簡(jiǎn)單的邏輯:

pm_click_detaction01.png
pm_click_detaction02.png
pm_click_detaction03.png
  • State 1檢測(cè)按鍵是否被按下
  • State 2檢測(cè)按鍵是否被松開,但添加了一個(gè)短暫的計(jì)時(shí)器(使用wait動(dòng)作)峰鄙,在時(shí)限內(nèi)如果按鍵松開浸间,單擊操作成立,觸發(fā)LMB down事件
  • 如果在短暫的時(shí)間間隔內(nèi)(比如0.1s)按鍵沒有被松開吟榴,說明單擊操作不成立魁蒜,觸發(fā)cancel事件
  • 因?yàn)閏ancel事件導(dǎo)致State 2休眠,所以之后即便再松開按鍵也不再會(huì)觸發(fā)LMB down事件了

觸發(fā)檢測(cè)到按鍵松開則跳轉(zhuǎn)到“單擊”所觸發(fā)的目標(biāo)狀態(tài)吩翻,同時(shí)在State 2中設(shè)定一個(gè)計(jì)時(shí)器兜看,設(shè)置一個(gè)短暫的時(shí)間間隔(比如0.1s),一旦超過時(shí)間間隔狭瞎,立即跳轉(zhuǎn)到“


2. 鍵盤(keyboard)

AnyKey.png
GetKey.png
GetKeyDown.png
GetKeyUp.png
  • AnyKey
    任何按鍵被按下都會(huì)觸發(fā)event
  • GetKey
    單純檢測(cè)一個(gè)按鍵是否被按下细移,并將結(jié)果儲(chǔ)存在一個(gè)bool變量中
  • GetKeyDown
    在指定按鍵被按下時(shí)立刻觸發(fā)指定event
  • GetKeyUp
    在指定按鍵被松開時(shí)立刻觸發(fā)指定event

指定按鍵比較麻煩,要從一個(gè)很長(zhǎng)的列表中選擇熊锭,這也算是“可視化”帶來的弊端之一吧弧轧。

3. 按鈕(Button)

GetButton.png
GetButtonDown.png
GetButtonUp.png
  • GetButton
    單純檢測(cè)一個(gè)按鈕是否被按下,并將結(jié)果儲(chǔ)存在一個(gè)bool變量中
  • GetButtonDown
    在指定按鈕被按下時(shí)立刻觸發(fā)指定event
  • GetButtonUp
    在指定按鈕被松開時(shí)立刻觸發(fā)指定event

注意碗殷,按鈕名稱需要自行輸入精绎,必須嚴(yán)格與Input面板中的名稱對(duì)應(yīng),請(qǐng)注意大小寫規(guī)范以及是否空格锌妻。

按鈕(Button)的概念在Unity3D中比較特殊代乃。并不一定專指鼠標(biāo)按鍵、鍵盤或者手柄从祝,而是通過預(yù)先的定義可以囊括一系列不同的按鍵襟己,以方便使用引谜。

從菜單Edit > Project Settings > Input可以打開Input面板:

unity_menu_input.png

這里指定了18個(gè)不同的Axes牍陌,可以理解為“軸向值”。Name是這個(gè)軸向的名稱员咽,Positive ButtonAlt Positive Button中所指定的按鍵被按下時(shí)毒涧,該軸向的值迅速增長(zhǎng)到1,Negative ButtonAlt Negative Button中所指定的按鍵被按下時(shí)贝室,該軸向的值迅速減少為-1契讲,無任何按鍵被按下時(shí)仿吞,軸向值迅速歸0。

而Button就是指的軸向中所規(guī)定的所有按鍵捡偏。比如這個(gè)叫做Horizontal的軸向唤冈,我們可以理解為“橫向輸入按鈕”银伟,當(dāng)鍵盤left你虹、right鍵或ad鍵被按下時(shí)彤避,就相當(dāng)于“橫向輸入按鈕”被按下了傅物。

我們經(jīng)常會(huì)使用到的Button有:

  • 使用Horizontal、Vertical來設(shè)置運(yùn)動(dòng)方向或旋轉(zhuǎn)方向
  • 使用Fire1來控制攻擊行為
  • 使用Jump來控制跳躍
  • 使用Cancel來取消或者呼出游戲菜單

我們還可以自己增加更多的Axes琉预。


碰撞(collision)觸發(fā)

這類觸發(fā)邏輯的原理是:
Unity3D的游戲物體可以設(shè)置碰撞邊界(Collider)董饰,當(dāng)有其他的帶有collider組件的游戲物體進(jìn)入/離開/停留這個(gè)游戲物體時(shí),可以觸發(fā)event并由此引起游戲物體的狀態(tài)改變圆米。

Collision Event行為:

CollisionEvent.png

  • 當(dāng)Collision中所指定的情況發(fā)生卒暂,且碰撞對(duì)象帶有Collide Tag中所指定的Tag時(shí)隅很,觸發(fā)Send Event中指定的事件砂心,并可以將碰撞對(duì)象儲(chǔ)存為一個(gè)GameObject類型變量,將碰撞力量?jī)?chǔ)存為一個(gè)Vector3類型變量
  • On Collision Enter能扒、On Collision Stay块茁、On Collision Exit三個(gè)選項(xiàng)針對(duì)其他碰撞體collider進(jìn)入齿坷、停留、離開本碰撞體的狀況
  • On Controller Collider Hit選項(xiàng)針對(duì)Controller類型的碰撞體與本碰撞體碰撞的狀況
  • On Particle Collision選項(xiàng)針對(duì)與粒子物體發(fā)生碰撞的狀況

Get Collision Info行為

GetCollisionInfo.png

  • 這個(gè)行為可以緊接著Collision Event行為使用数焊,用來儲(chǔ)存更多關(guān)于碰撞的信息永淌,比如:碰撞物體、相對(duì)速度(vector3)佩耳、相對(duì)速度(float)遂蛀、碰撞點(diǎn)坐標(biāo)(vector3)、碰撞點(diǎn)法線方向(vector3)干厚、物理材質(zhì)名稱李滴。

在Collider組件上,我們可以勾選Is Trigger選項(xiàng)來將碰撞體變成一個(gè)觸發(fā)器(trigger)蛮瞄。觸發(fā)器和碰撞體的區(qū)別在于所坯,觸發(fā)器不會(huì)實(shí)際阻擋其他碰撞體,相當(dāng)于一個(gè)虛擬的開關(guān)挂捅。

如果設(shè)置成了Trigger芹助,不能使用Collision Event和Get Collision Info行為了,而要使用Trigger Event和Get Trigger Info行為,用法是一樣的状土。

Trigger Event

TriggerEvent.png

Get Trigger Info

GetTriggerInfo.png

通常適合使用碰撞觸發(fā)來制作的交互邏輯有:

  • 拾取游戲物體:
    將道具放置在場(chǎng)景中无蜂,設(shè)置成trigger類碰撞體,玩家進(jìn)入碰撞體范圍時(shí)觸發(fā)相應(yīng)事件
  • 玩家“獲得”物品
  • 道具模型消失
  • 游戲積分增加
  • 啟動(dòng)機(jī)關(guān):
    當(dāng)碰撞發(fā)生時(shí)機(jī)關(guān)被觸發(fā)蒙谓,可以是“開門”斥季、“啟動(dòng)升降機(jī)”、“進(jìn)入下一關(guān)”等等
  • 傷害累驮、死亡:
    當(dāng)“子彈”物體與對(duì)象發(fā)生碰撞時(shí)泻肯,對(duì)對(duì)象造成傷害或者讓對(duì)象死亡
  • 特效:
    當(dāng)“子彈”擊中對(duì)象時(shí),從“傷口”處發(fā)射粒子特效(血慰照、煙霧灶挟、碎片等等)

射線(raycast)觸發(fā)

這類觸發(fā)邏輯的原理是:
從目標(biāo)點(diǎn)向特定方向發(fā)射一條光線(ray),然后獲得這條光線與場(chǎng)景物體的碰撞信息毒租。通常是從某個(gè)游戲物體沿著特定軸向(x稚铣、y、z)發(fā)射墅垮,或者是攝影機(jī)平面上某一點(diǎn)垂直于攝影機(jī)平面向場(chǎng)景發(fā)射惕医。

Raycast是即時(shí)發(fā)生的,不論距離多遠(yuǎn)算色,都會(huì)在同一幀返回碰撞結(jié)果抬伺,所以適用于需要立即得到反饋的情況。

Raycast:

Raycast.png

Raycast從一個(gè)游戲物體(From Game Object)或某個(gè)點(diǎn)(From Position)沿著特定坐標(biāo)空間(Space)某個(gè)方向(Direction)發(fā)射一條長(zhǎng)度為Distance單位長(zhǎng)度的探測(cè)光線灾梦,并將結(jié)果儲(chǔ)存在相應(yīng)的變量中:

  • Hit Event:如果碰到游戲物體峡钓,則觸發(fā)相應(yīng)事件
  • Store Did Hit:是否碰到游戲物體(bool)
  • Store Hit Object:碰撞對(duì)象物體(GameObject)
  • Store Hit Point:碰撞接觸點(diǎn)(Vector3)
  • Store Hit Normal:碰撞法線方向(Vector3)
  • Store Hit Distance:發(fā)射點(diǎn)距離碰撞點(diǎn)距離(float)
  • Repeat Interval:射線發(fā)射頻率(0代表僅發(fā)射1次;1代表每幀發(fā)射一次若河;2代表每?jī)蓭l(fā)射一次…)
  • Layer Mask:可以指定僅探測(cè)與特定層中的物體之間的碰撞
  • Debug:可以在視圖中顯示一條直線方便我們判斷raycast是否正確

注意:ray是有長(zhǎng)度的能岩,在這個(gè)長(zhǎng)度范圍以內(nèi)如果沒有觸碰到物體,那就是“沒有擊中”萧福。這個(gè)長(zhǎng)度默認(rèn)為100米拉鹃,如果場(chǎng)景過大有可能會(huì)出現(xiàn)距離不夠而不能正確返回結(jié)果的情況。同時(shí)特定情況下也可以將這個(gè)值縮小以獲得特定效果鲫忍,比如游戲設(shè)定手槍射距為30米的話膏燕,就要將ray設(shè)成30。

Raycast All:

RaycastAll.png

Raycast All和Raycast用法幾乎完全一樣悟民,但Raycast All會(huì)返回Ray碰撞到的所有游戲物體并返回為一個(gè)GameObject類型的數(shù)組(array)變量Store Hit Objects

Get Raycast Hit Info:

GetRaycastHitInfo.png

Get Raycast All Info:

GetRaycastAllInfo.png

這兩個(gè)行為用在Raycast行為之后用以獲得更多的碰撞信息坝辫。

有一些action同樣基于Raycast原理,但名字中沒有“ray”這個(gè)詞逾雄,也沒有被歸類在Physics動(dòng)作組中阀溶。

Mouse Pick:

MousePick.png

Mouse Pick會(huì)由鼠標(biāo)屏幕二維坐標(biāo)轉(zhuǎn)換成攝影機(jī)平面二維坐標(biāo),再將這一坐標(biāo)對(duì)應(yīng)的三維空間位置沿著垂直于攝影機(jī)平面的方向發(fā)射一條長(zhǎng)度為Ray Distance的ray鸦泳,并返回碰撞結(jié)果為相應(yīng)數(shù)據(jù)類型的變量值银锻。

Mouse Pick Event:

MousePickEvent.png

Mouse Pick Event同樣基于上述原理,是用來查看鼠標(biāo)是否在特定游戲物體(Game Object)上做鹰,并根據(jù)不同的鼠標(biāo)狀態(tài)而觸發(fā)不同的事件:

  • Mouse Over:鼠標(biāo)劃入游戲物體范圍內(nèi)
  • Mouse Down:鼠標(biāo)在游戲物體范圍內(nèi)按下左鍵
  • Mouse Up:鼠標(biāo)在游戲物體范圍內(nèi)松開左鍵
  • Mouse Off:鼠標(biāo)從游戲物體范圍內(nèi)劃出

Mouse Pick 2d與Mouse Pick 2d Event這兩個(gè)行為與上兩個(gè)行為完全一致击纬,只不過專門適用于2D游戲,因?yàn)樗鼈兎祷氐奈恢米鴺?biāo)數(shù)據(jù)類型是Vector2而不是Vector3

MousePick2d.png
MousePick2dEvent.png

通常適合使用碰撞觸發(fā)來制作的交互邏輯有:

  • FPS類游戲中的設(shè)計(jì)判定钾麸,使用Raycast來判斷是否擊中目標(biāo)更振,比發(fā)射子彈后再判斷碰撞要準(zhǔn)確得多
  • 獲得鼠標(biāo)指向位置,并通過這個(gè)位置來指引角色運(yùn)動(dòng)
  • 通過鼠標(biāo)與游戲物體進(jìn)行互動(dòng)

數(shù)據(jù)觸發(fā)

關(guān)于“數(shù)據(jù)”和“數(shù)據(jù)格式”的詳細(xì)介紹饭尝,可以參看《Unity3D的變量及數(shù)據(jù)類型》肯腕。

數(shù)據(jù)觸發(fā)的基本原理是:
通過監(jiān)控?cái)?shù)據(jù)的數(shù)值狀態(tài)或數(shù)值變化,并使用各種數(shù)值比較action來觸發(fā)不同的事件钥平。

Bool Test檢查一個(gè)bool變量的值实撒,然后根據(jù)“True/False”可以觸發(fā)最多2個(gè)不同的event

BoolTest.png

Int Compare和Float Compare檢查兩個(gè)不同的int數(shù)值或者float數(shù)值,根據(jù)“第一個(gè)數(shù)值等于/小于/大于第二個(gè)數(shù)值”可以觸發(fā)最多3個(gè)不同的event

IntCompare.png

FloatCompare.png

String Compare檢查兩個(gè)字符串是否一致涉瘾,根據(jù)“一致/不一致”可以觸發(fā)最多2個(gè)不同的event

StringCompare.png

Object Compare檢查兩個(gè)Object(也就是組件)是否一致知态,根據(jù)“一致/不一致”可以觸發(fā)最多2個(gè)不同的event

ObjectCompare.png

Object Compare檢查兩個(gè)數(shù)組是否一致(一致的意思是A數(shù)組中每一個(gè)數(shù)據(jù)都等于B數(shù)組中對(duì)應(yīng)序號(hào)的數(shù)據(jù)),根據(jù)“一致/不一致”可以觸發(fā)最多2個(gè)不同的event

ArrayCompare.png

Enum Compare檢查兩個(gè)Enum狀態(tài)是否一致立叛,根據(jù)“一致/不一致”可以觸發(fā)最多2個(gè)不同的event

EnumCompare.png

Fsm State Test檢查特定游戲物體上某個(gè)FSM是否正處于某個(gè)特定State负敏,根據(jù)“True/False”可以觸發(fā)最多2個(gè)不同的event

FsmStateTest.png

這些檢查都可以將結(jié)果儲(chǔ)存進(jìn)一個(gè)bool變量中(Store Result)。

Every Frame選項(xiàng)如果被勾選秘蛇,則代表該action會(huì)一直不斷執(zhí)行其做,也就是實(shí)時(shí)監(jiān)控?cái)?shù)據(jù)是否滿足比較標(biāo)準(zhǔn)。如果不被勾線赁还,則只在剛進(jìn)入該state時(shí)執(zhí)行一次數(shù)值比較庶柿。

在這些情況下我們通常使用這種數(shù)值觸發(fā)來設(shè)計(jì)交互邏輯:

  • 角色離某個(gè)NPC的距離小于特定數(shù)值的時(shí)候,角色吸引NPC的注意秽浇,NPC開始追逐角色
  • 角色生命值小于等于0的時(shí)候浮庐,角色死亡
  • 當(dāng)時(shí)間間隔超過特定數(shù)值的時(shí)候,開始執(zhí)行某種操作
  • 當(dāng)對(duì)象處于特定state(比如攻擊僵直)的時(shí)候柬焕,指令輸入不起作用

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末审残,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子斑举,更是在濱河造成了極大的恐慌搅轿,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,273評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件富玷,死亡現(xiàn)場(chǎng)離奇詭異璧坟,居然都是意外死亡既穆,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門雀鹃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來幻工,“玉大人,你說我怎么就攤上這事黎茎∧衣” “怎么了?”我有些...
    開封第一講書人閱讀 167,709評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵傅瞻,是天一觀的道長(zhǎng)踢代。 經(jīng)常有香客問我,道長(zhǎng)嗅骄,這世上最難降的妖魔是什么胳挎? 我笑而不...
    開封第一講書人閱讀 59,520評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮溺森,結(jié)果婚禮上串远,老公的妹妹穿的比我還像新娘。我一直安慰自己儿惫,他們只是感情好澡罚,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著肾请,像睡著了一般留搔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上铛铁,一...
    開封第一講書人閱讀 52,158評(píng)論 1 308
  • 那天隔显,我揣著相機(jī)與錄音,去河邊找鬼饵逐。 笑死括眠,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的倍权。 我是一名探鬼主播掷豺,決...
    沈念sama閱讀 40,755評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼薄声!你這毒婦竟也來了当船?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,660評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤默辨,失蹤者是張志新(化名)和其女友劉穎德频,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體缩幸,經(jīng)...
    沈念sama閱讀 46,203評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡壹置,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評(píng)論 3 340
  • 正文 我和宋清朗相戀三年竞思,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钞护。...
    茶點(diǎn)故事閱讀 40,427評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡盖喷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出患亿,到底是詐尸還是另有隱情,我是刑警寧澤押逼,帶...
    沈念sama閱讀 36,122評(píng)論 5 349
  • 正文 年R本政府宣布步藕,位于F島的核電站,受9級(jí)特大地震影響挑格,放射性物質(zhì)發(fā)生泄漏咙冗。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評(píng)論 3 333
  • 文/蒙蒙 一漂彤、第九天 我趴在偏房一處隱蔽的房頂上張望雾消。 院中可真熱鬧,春花似錦挫望、人聲如沸立润。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽桑腮。三九已至,卻和暖如春蛉幸,著一層夾襖步出監(jiān)牢的瞬間破讨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工奕纫, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留提陶,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,808評(píng)論 3 376
  • 正文 我出身青樓匹层,卻偏偏與公主長(zhǎng)得像隙笆,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子升筏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評(píng)論 2 359

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