创建一个抽屉 (Creating a Drawer)
总览 (Overview)
“抽屉(Drawer)”可以为游戏中的对象(如:家具)增加“深度”。
在这个插件中,包含了3个家具的示例:demoBasicDesk预制体、DemoComplexDesk预制体 和 DemoDresser_A预制体。
目录
[TOC]
常用的抽屉的部件 (Common Drawer Components)
所有抽屉都有一组常用的(通用的)部件,这些部件有助于让抽屉正常的工作。
这些部件中,有一些部件是可选的,有些是必须的。
部件名 | 部件名的中文翻译 | 说明 |
---|---|---|
Drawer Mesh | 抽屉的网格 | 这是一个可见的“抽屉盒”(也就是抽屉的模型),作为主要的抽屉的主体。 |
Drawer Pull Mesh(es) | 抽屉把手的网格 | 这是一个抽屉的把手(的模型)。玩家在瞄准(看向)这个把手的时候,就可以与抽屉进行互动(拉开抽屉,关闭抽屉)。 |
Sliding Part | 滑动的部件 | 在这个部件中,会包含所有的可以被移动的部分 (例如:抽屉的网格、抽屉把手和其他的对象)。 |
Drawer Pull Interaction(s) (uses FPEInteractableActivateScript component) | 抽屉把手的交互(使用FPEInteractableActivateScript组件) | 这些是允许玩家打开和关闭抽屉的可激活对象(可激活交互的对象)。 我们建议你将“抽屉把手的交互”与“抽屉把手的网格”对齐。也许你也可以让“抽屉把手的交互”更大一点,这样可以方便玩家瞄准。 |
Hit Helpers (uses FPEDoorAndDrawerHitHelper component) | 击中助手(使用FPEDoorAndDrawerHitHelper组件) | 这是一个可选的部件,这个部件用于检测抽屉应该何时停止。 这个部件用于确保:当我们在抽屉中放入大型(或高大)的物体时,关闭抽屉不会造成穿模。 (当抽屉关闭时,如果抽屉里有能阻挡抽屉关闭的大型(或高大)的物体时,抽屉就会停下来 (停止运动)。开启时也一样。) |
Drawer Colliders | 抽屉的碰撞体 | 这个部件可以将“可拾取道具(Pickups)”和其他物品,保留在抽屉内(这个碰撞体是为了:不让抽屉里的东西掉到抽屉外)。 为了获得最佳的效果,请使用Box Collider(少量的使用),而不是使用Mesh Collider。 |
Drawer Contents Grabber | 抽屉中的物体的抓取器 | 这是一个特殊的部件。它的作用是:当抽屉移动时,抽屉中的物体会粘在这个部件上面。 |
注意:
大多数情况下,你可以把“抽屉把手的交互(Drawer Pull Interaction)”对象的碰撞体,设置为触发器(trigger)。
这样可以防止抽屉把手与其他对象发生碰撞。
所有的抽屉都有一组相同的变量。
变量名———————— | 变量名的中文翻译———————— | 说明 |
---|---|---|
Start Internally Locked | 开始时内部锁定 | 内部锁定就是:使用内部的锁,锁住这个抽屉。 也就是说,我们是在抽屉把手上,锁住这个抽屉。 如果要打开抽屉,就需要拿钥匙,与抽屉把手进行互动。 如果为true,则在游戏开始时,抽屉会被锁住,并且需要特定的“库存物品”来解锁这个抽屉。 |
Required Key Type | 需要的钥匙类型 | 解锁“内部锁定”的抽屉时,所需要的“库存物品”的类型。 |
Start Externally Locked | 开始时外部锁定 | 外部锁定就是:使用外部的锁,锁住这个抽屉。 如果为true,则在游戏开始时,抽屉会被锁住。如果要解锁这个抽屉,那么外部对象(如:安全系统)需要先被解锁,才能打开这个抽屉。 (也就是说,如果一个抽屉是被外部锁定,就说明需要先解锁一个另外的对象,才能解锁这个抽屉。比如:你需要拉动一个拉闸,才能够打开抽屉。或者你需要在一个输入器上输入一组密码,才能够打开抽屉。) |
Start Opened | 开始时打开 | 如果为true,则在游戏开始时,抽屉是打开的状态。 可能,你还需要在视觉上移动这个“抽屉的网格”,来让玩家感觉抽屉是打开的。 |
Stop If Drawer Hits Something | 当抽屉碰到了障碍物就停止运动 | 如果为true,那么当抽屉的“Hit Helper”部件,击中另一个物体(比如玩家)或有物理效果的对象(比如可拾取道具)时,这个抽屉将使用它Hit Helpers部件,来让这个抽屉停止运动。 |
Drawer Pull Handle Interaction Text Overrides | 覆盖抽屉把手的交互文字 | 当玩家对抽屉进行不同的操作时,这个选项中对应的文字,将覆盖掉抽屉把手原本的交互文字(Interaction String选项)。 |
Play Sounds | 是否播放声音 | 如果为true,当玩家对抽屉进行不同的操作时,这个抽屉将发出对应的声音。 |
Drawer Sounds | 抽屉的声音 | 在这里设置抽屉的声音(指定“声音库”文件,这个“声音库”是FPE Simple Sound Bank类型的文件)。如果Play Sounds变量为true,那么这些声音就会被用来产生音效。 |
Slide Distance | 滑动的距离 | 抽屉打开的时候,将会滑动多远? |
Slide Open Time | 滑动的时间 | 抽屉打开或关闭时,滑动动画需要播放多长的时间? |
Drawer Slide Snap Distance | 抽屉滑动的捕捉距离 | 请设置一个你认为“足够近”的距离。当小于这个距离的时候,可以让抽屉猛地(迅速)关上或打开。较小的抽屉需要较小的值。 |
Auto Move Player To Safe Zone | 自动将玩家移动到安全区 | 如果是真的,当玩家打开或关闭抽屉时,玩家将被自动移动到安全区域,这样抽屉就不太可能撞到玩家。 |
创建一个抽屉 (Creating a Drawer)
这个插件中,附带了一些用于示例的家具(这些家具中,都包含了抽屉):demoBasicDesk预制体、demoComplexDesk预制体、demoDresser_A预制体。
如果要使用这些预制体,你只需要将它们拖到场景中即可。如果使用带锁(_Locked )的预制体,请确保玩家可以拿到打开抽屉所需的“钥匙”(默认为demoSimpleKey.prefab)。如果使用被外部锁定(_ExternallyLocked)的预制体,请确保场景中包含了一些对象 (比如demoSecuritySystem预制体),以便玩家可以从外部解锁抽屉。
完成啦,现在就可以运行场景并使用抽屉啦!
你也可以从这些预制件中,拿出抽屉里的物品,然后把这些物品放进你想要的任何家具里。
如果你需要从头创建一个自定义的抽屉,请执行以下的步骤:
创建一个新的场景,并在(0,0,0)的位置,添加一个Plane和一个FPECore预制体。
絮酱备注: 当游戏运行时,FPECore游戏物体将会自动实例化一个叫做FPEPlayerController的游戏物体, 这个FPEPlayerController里会自带一个相机。 因此,为了保证不发生冲突,在游戏运行之前,最好删除(或者禁用)场景中的其他相机。
创建一个空的游戏物体,将它命名为“MyCustomDrawer”
在MyCustomDrawer游戏物体上,添加FPEDrawer组件。
这样会在MyCustomDrawer身上,自动添加2个子对象: SlidingPart SlidingPart\DrawerPull
我们添加一个“抽屉的网格(抽屉模型)”吧!向SlidingPart中添加子游戏物体,那我们就在SlidingPart里面添加一些模型吧,例如插件自带的Drawer_C.fbx。确保这个模型位于(0,0,0)的位置,并根据需要旋转它。
我们创建一个“抽屉把手的网格”吧!向DoorHandle中添加子游戏物体,那我们在DoorHandle里面添加一些模型吧,例如插件自带的DrawerPull_A.fbx。确保这个模型位于(0,0,0)的位置,并根据需要旋转它。
移动并缩放Drawer Pull游戏物体,使其朝向抽屉的Z轴正方向(Z+),并与“抽屉把手的网格”的网格重叠。
你的抽屉现在看起来应该是这样的:
在SlidingPart中添加一个空的子游戏物体,并将其命名为“Colliders”
在Colliders游戏物体身上添加5个Box Collider组件。并相应地调整每个BoxCollider组件的大小,以覆盖抽屉的Back(后面)、 Front(前面)、 Left(左边)、Right(右边)、Bottom(下面)。现在你的抽屉应该是这样的:
选择DrawerPull对象,并将“Event Fire Type”选项设置为“EVERYTIME(每次)”。然后,将MyCustomDrawer身上的FPEDrawer脚本中的activateDrawer()函数,指定给这个抽屉的激活事件(Activation Event)。
将DrawerPull游戏物体的Box Collider组件,设置为Trigger。
运行场景,然后通过与抽屉把手进行交互,来打开抽屉。现在这个抽屉应该可以在激活时,慢慢地滑动打开和关闭啦。
如果你需要让抽屉在碰到某物时停止运动,请执行以下的步骤:
请在SlidingPart下面创建2个子对象,并将这2个子对象命名为“OpenHitHelper ”和“CloseHitHelper”。
在“OpenHitHelper游戏物体”和“CloseHitHelper游戏物体”身上,各添加一个Box Collider组件和一个FPEDoorAndDrawerHitHelper组件。
调整HitHelper的大小(Scale),使黄色的Gizmo轮廓与抽屉模型的宽度大致相同。但黄色Gizmo(黄色的线框)的厚度,大概是抽屉木板厚度的2倍(如下图所示)。
选中MyCustomDrawer 游戏物体,在Inspector面板上找到FPEDrawer脚本,取消勾选“ Stop If Drawer Hits Something(抽屉碰到了障碍物就停止运动)”选项。
你的抽屉现在看起来应该是这样的:
- 你可以运行场景,测试一下啦。现在抽屉再关闭时,如果碰到了比较大的物体,抽屉应该会停止运动。但是,如果不把抽屉放在一件家具内,你很难测试这个功能。这里我们可以根据需要参考demoBasicDesk.prefab预制体中的“BasicDeskLeftDrawer”子游戏物体。运行时,这个抽屉看起来会像这样:
这是一张动图,你可以点击这里查看
如果你需要一个“抓取器(Drawer Contents Grabber)”,请执行以下的步骤:
在SlidingPart游戏物体中,创建一个空的子游戏物体,并将其命名为“DrawerContentsGrabber”
在DrawerContentsGrabber游戏物体身上,添加FPEDrawerContentsGrabber组件
调整Box Collider的大小(注意:不是缩放Transform!),请让粉红色的Gizmo在抽屉的边界内,而且不会太高。
你的抽屉现在看起来应该是这样的:
如果你需要设置“安全区(Safe Zone)”,请执行以下的步骤:
- 默认情况下,抽屉安全区与抽屉的距离大概是1.3个单位。根据你的抽屉尺寸和滑动打开时间,你可以将这个距离调整得更近。
- 如果你要测试安全区,请在靠近它的同时打开抽屉。如果抽屉滑动的过程中,玩家没被抽屉撞到,或者抽屉没有卡主,如果我们能顺利的打开抽屉,那么这可能是一个很好的数值。
- 你可以禁用安全区,只需要取消勾选“Auto Move Player To Safe Zone(自动将玩家移动到安全区)”选项。但是,我们不建议你这样做。
- 有关这个的详细信息,请参阅下面的Drawer Collision and the Player)(抽屉与玩家之间的碰撞)章节。
如果要把抽屉锁住,请执行以下的步骤:
要把抽屉锁住很简单,你只需要选中MyCustomDrawer游戏物体,在Inspector面板上找到FPEDrawer脚本,勾选“Start Internally Locked(开始时内部锁定)”选项,并设置“Required Key Type(充当钥匙的物品类型)”选项。这里我们把Required Key Type选项设置为SIMPLEKEY吧~
将demoSimpleKey预制体添加到场景中(这个demoSimpleKey预制体是SIMPLEKEY类型的物体,它可以作为这个抽屉的钥匙)。
如果你希望你的抽屉能够发出声音,那么请将声音库(FPE Simple Sound Bank文件)分配到“Drawer Sounds”选项(这个选项位于MyCustomDrawer游戏物体身上的FPEDrawer脚本中)。本插件自带的声音库位于\Sounds\Soundbanks\DoorsAndDrawers\文件夹中。
如果上面的步骤你都完成了,那么这个抽屉也就完成啦! 你也可以继续设置MyCustomDrawer身上的FPEDrawer脚本中,“Drawer-Specific Behaviour”部分里的选项,然后将新做好的这个抽屉保存为预制体。
注意:
为了让保存和加载功能正常工作,你的抽屉必须在场景中具有唯一的名称。
如果你使用了预制体,那么如果你将预制体命名为“MyCustomDrawer”,将场景里的抽屉命名为“MyCustomDrawer(1)”,就完全没问题!:)
(总之只要保证每一个抽屉(包括预制体)的名字都是独一无二的,就可以啦!)
抽屉和玩家之间的碰撞 (Drawer Collision and the Player)
有时,我们很难衡量抽屉相对于玩家的大小。导致的结果就是,玩家很难与抽屉进行互动。为了获得最佳的效果,请确保你的家具的设计便于放置和使用抽屉。
默认情况下,使用“安全区域”将确保流畅的游戏体验。但是,你可以让抽屉推动玩家,虽然有时可能会有点奇怪。
你还可以做一些事情来防止抽屉完全撞击玩家。例如,将具有锁定旋转的运动刚体,添加到抽屉的SlidingPart \ Collider子对象上,这样做就可以允许玩家“靠近”抽屉。但对于真正的深(厚)抽屉,可能是一个问题,并且可能会具有其他的连锁效果,因此请谨慎使用。
请参阅以下有关各种方法的示例:
Default Behaviour(默认行为):抽屉轻轻顺畅地打开,并轻轻顺畅地将玩家推移开(这是最棒的效果)
这是一张动图,你可以点击这里查看
抽屉在撞击到玩家时停止(这种情况非常真实,但在游戏里可能有点不好)
这是一张动图,你可以点击这里查看
抽屉使用物理碰撞将玩家推开(可能会很奇怪,也许屏幕会奇怪的抖动)
这是一张动图,你可以点击这里查看
抽屉和其他物体之间的碰撞 (Drawer Collision and Other Objects)
有时候,我们需要把高大的物体会放在抽屉里。在大多数的示例中,当玩家把高大的物体放进抽屉时,物体阻碍了抽屉关闭,我们都是让抽屉停止移动来解决这个问题。
但是,你可能希望更多地能够依靠物理引擎,来允许玩家在抽屉中塞入东西并尝试关闭它们。
为避免在你这样做时,出现“卡住的抽屉”感觉,你可以调整抽屉的“CloseHitHelper”游戏物体的厚度。
下图是一个效果,这个以物理引擎驱动的抽屉,更接近真实的操作(关闭抽屉时,如果物体被卡住,物体会微微倾斜)。
这是一张动图,你可以点击这里查看
为了能够实现这种效果,我们需要把CloseHitHelper游戏物体变得更薄,如下所示:
你可以在自己的抽屉上做尝试,看看你自己的游戏物体,放进抽屉里将会得到什么样的结果。
工作流程建议 (Workflow Notes)
一般来说,“抽屉”是一个独立的预制体。
将抽屉放入家具或其他物品时,你可以选择将抽屉作为家具的子游戏物体。
为获得最佳效果,在对家具和抽屉进行建模的时候,请将抽屉的模型导出为单独的模型文件。类似地,你可以也把抽屉把手的模型导出为单独的模型文件。这样你就可以更灵活的定制和重用抽屉和抽屉把手啦。
外部的锁 (External Locks)
当你希望任何一个抽屉被外部的锁(例如:一个密码锁)锁住时,你必须勾选“Start Externally Locked”选项。
最重要的是,你还必须提供另外一个物体(例如,插件中的demoSecuritySystem预制体),并将这个物体指定为解锁抽屉所需要的物体。被外部的锁锁住的抽屉,只能从外部系统解锁。否则,它们将被永远的锁住!:)