交互媒体设计教案unity3D技术分享征服Unity3d

PlayMaker:触发事件

2017-07-27  本文已影响521人  shimmery

事件(event)的触发是PlayMaker交互设计的基础。


鼠标(mouse)、键盘(keyboard)、按钮(button)触发

这类触发逻辑的原理是:
当用户通过输入设备(比如鼠标、键盘、触碰屏、手柄等)向游戏发送信息时(比如按键被按下、滚轮被拨动等等),触发指定event并通过该event实现状态改变。

PlayMaker中Input类别下的动作列表

这类触发事件的相关动作可以在PlayMaker的Input Actions中找到。


1. 鼠标(mouse)

GetMouseButton.png GetMouseButtonDown.png GetMouseButtonUp.png

我们可以在PlayMaker中检测到的鼠标按钮包括:Left、Middle、Right、None。

注意:MouseButtonDown不等于鼠标单击。鼠标单击代表快速执行按键的按下和松开两个操作。如果一定需要检测“单击”输入操作,需要使用多个state来设计一个简单的逻辑:

pm_click_detaction01.png pm_click_detaction02.png pm_click_detaction03.png

触发检测到按键松开则跳转到“单击”所触发的目标状态,同时在State 2中设定一个计时器,设置一个短暂的时间间隔(比如0.1s),一旦超过时间间隔,立即跳转到“


2. 键盘(keyboard)

AnyKey.png GetKey.png GetKeyDown.png GetKeyUp.png

指定按键比较麻烦,要从一个很长的列表中选择,这也算是“可视化”带来的弊端之一吧。

3. 按钮(Button)

GetButton.png GetButtonDown.png GetButtonUp.png

注意,按钮名称需要自行输入,必须严格与Input面板中的名称对应,请注意大小写规范以及是否空格。

按钮(Button)的概念在Unity3D中比较特殊。并不一定专指鼠标按键、键盘或者手柄,而是通过预先的定义可以囊括一系列不同的按键,以方便使用。

从菜单Edit > Project Settings > Input可以打开Input面板:

unity_menu_input.png

这里指定了18个不同的Axes,可以理解为“轴向值”。Name是这个轴向的名称,Positive ButtonAlt Positive Button中所指定的按键被按下时,该轴向的值迅速增长到1,Negative ButtonAlt Negative Button中所指定的按键被按下时,该轴向的值迅速减少为-1,无任何按键被按下时,轴向值迅速归0。

而Button就是指的轴向中所规定的所有按键。比如这个叫做Horizontal的轴向,我们可以理解为“横向输入按钮”,当键盘leftright键或ad键被按下时,就相当于“横向输入按钮”被按下了。

我们经常会使用到的Button有:

我们还可以自己增加更多的Axes。


碰撞(collision)触发

这类触发逻辑的原理是:
Unity3D的游戏物体可以设置碰撞边界(Collider),当有其他的带有collider组件的游戏物体进入/离开/停留这个游戏物体时,可以触发event并由此引起游戏物体的状态改变。

Collision Event行为:

CollisionEvent.png

Get Collision Info行为

GetCollisionInfo.png

在Collider组件上,我们可以勾选Is Trigger选项来将碰撞体变成一个触发器(trigger)。触发器和碰撞体的区别在于,触发器不会实际阻挡其他碰撞体,相当于一个虚拟的开关。

如果设置成了Trigger,不能使用Collision Event和Get Collision Info行为了,而要使用Trigger Event和Get Trigger Info行为,用法是一样的。

Trigger Event

TriggerEvent.png

Get Trigger Info

GetTriggerInfo.png

通常适合使用碰撞触发来制作的交互逻辑有:


射线(raycast)触发

这类触发逻辑的原理是:
从目标点向特定方向发射一条光线(ray),然后获得这条光线与场景物体的碰撞信息。通常是从某个游戏物体沿着特定轴向(x、y、z)发射,或者是摄影机平面上某一点垂直于摄影机平面向场景发射。

Raycast是即时发生的,不论距离多远,都会在同一帧返回碰撞结果,所以适用于需要立即得到反馈的情况。

Raycast:

Raycast.png

Raycast从一个游戏物体(From Game Object)或某个点(From Position)沿着特定坐标空间(Space)某个方向(Direction)发射一条长度为Distance单位长度的探测光线,并将结果储存在相应的变量中:

注意:ray是有长度的,在这个长度范围以内如果没有触碰到物体,那就是“没有击中”。这个长度默认为100米,如果场景过大有可能会出现距离不够而不能正确返回结果的情况。同时特定情况下也可以将这个值缩小以获得特定效果,比如游戏设定手枪射距为30米的话,就要将ray设成30。

Raycast All:

RaycastAll.png

Raycast All和Raycast用法几乎完全一样,但Raycast All会返回Ray碰撞到的所有游戏物体并返回为一个GameObject类型的数组(array)变量Store Hit Objects

Get Raycast Hit Info:

GetRaycastHitInfo.png

Get Raycast All Info:

GetRaycastAllInfo.png

这两个行为用在Raycast行为之后用以获得更多的碰撞信息。

有一些action同样基于Raycast原理,但名字中没有“ray”这个词,也没有被归类在Physics动作组中。

Mouse Pick:

MousePick.png

Mouse Pick会由鼠标屏幕二维坐标转换成摄影机平面二维坐标,再将这一坐标对应的三维空间位置沿着垂直于摄影机平面的方向发射一条长度为Ray Distance的ray,并返回碰撞结果为相应数据类型的变量值。

Mouse Pick Event:

MousePickEvent.png

Mouse Pick Event同样基于上述原理,是用来查看鼠标是否在特定游戏物体(Game Object)上,并根据不同的鼠标状态而触发不同的事件:

Mouse Pick 2d与Mouse Pick 2d Event这两个行为与上两个行为完全一致,只不过专门适用于2D游戏,因为它们返回的位置坐标数据类型是Vector2而不是Vector3

MousePick2d.png MousePick2dEvent.png

通常适合使用碰撞触发来制作的交互逻辑有:


数据触发

关于“数据”和“数据格式”的详细介绍,可以参看《Unity3D的变量及数据类型》

数据触发的基本原理是:
通过监控数据的数值状态或数值变化,并使用各种数值比较action来触发不同的事件。

Bool Test检查一个bool变量的值,然后根据“True/False”可以触发最多2个不同的event

BoolTest.png

Int Compare和Float Compare检查两个不同的int数值或者float数值,根据“第一个数值等于/小于/大于第二个数值”可以触发最多3个不同的event

IntCompare.png
FloatCompare.png

String Compare检查两个字符串是否一致,根据“一致/不一致”可以触发最多2个不同的event

StringCompare.png

Object Compare检查两个Object(也就是组件)是否一致,根据“一致/不一致”可以触发最多2个不同的event

ObjectCompare.png

Object Compare检查两个数组是否一致(一致的意思是A数组中每一个数据都等于B数组中对应序号的数据),根据“一致/不一致”可以触发最多2个不同的event

ArrayCompare.png

Enum Compare检查两个Enum状态是否一致,根据“一致/不一致”可以触发最多2个不同的event

EnumCompare.png

Fsm State Test检查特定游戏物体上某个FSM是否正处于某个特定State,根据“True/False”可以触发最多2个不同的event

FsmStateTest.png

这些检查都可以将结果储存进一个bool变量中(Store Result)。

Every Frame选项如果被勾选,则代表该action会一直不断执行,也就是实时监控数据是否满足比较标准。如果不被勾线,则只在刚进入该state时执行一次数值比较。

在这些情况下我们通常使用这种数值触发来设计交互逻辑:


上一篇 下一篇

猜你喜欢

热点阅读