创建一个抽屉 (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预制体),以便玩家可以从外部解锁抽屉。

完成啦,现在就可以运行场景并使用抽屉啦!

你也可以从这些预制件中,拿出抽屉里的物品,然后把这些物品放进你想要的任何家具里。


如果你需要从头创建一个自定义的抽屉,请执行以下的步骤:

  1. 创建一个新的场景,并在(0,0,0)的位置,添加一个Plane和一个FPECore预制体。

    絮酱备注:
    当游戏运行时,FPECore游戏物体将会自动实例化一个叫做FPEPlayerController的游戏物体,
    这个FPEPlayerController里会自带一个相机。
    因此,为了保证不发生冲突,在游戏运行之前,最好删除(或者禁用)场景中的其他相机。
    
  2. 创建一个空的游戏物体,将它命名为“MyCustomDrawer”

  3. 在MyCustomDrawer游戏物体上,添加FPEDrawer组件。

    这样会在MyCustomDrawer身上,自动添加2个子对象:
    SlidingPart
    SlidingPart\DrawerPull
    
  4. 我们添加一个“抽屉的网格(抽屉模型)”吧!向SlidingPart中添加子游戏物体,那我们就在SlidingPart里面添加一些模型吧,例如插件自带的Drawer_C.fbx。确保这个模型位于(0,0,0)的位置,并根据需要旋转它。

  5. 我们创建一个“抽屉把手的网格”吧!向DoorHandle中添加子游戏物体,那我们在DoorHandle里面添加一些模型吧,例如插件自带的DrawerPull_A.fbx。确保这个模型位于(0,0,0)的位置,并根据需要旋转它。

  6. 移动并缩放Drawer Pull游戏物体,使其朝向抽屉的Z轴正方向(Z+),并与“抽屉把手的网格”的网格重叠。

  7. 你的抽屉现在看起来应该是这样的:

    CustomDrawer1.jpg


  8. 在SlidingPart中添加一个空的子游戏物体,并将其命名为“Colliders”

  9. 在Colliders游戏物体身上添加5个Box Collider组件。并相应地调整每个BoxCollider组件的大小,以覆盖抽屉的Back(后面)、 Front(前面)、 Left(左边)、Right(右边)、Bottom(下面)。现在你的抽屉应该是这样的:

    CustomDrawer2.jpg


  10. 选择DrawerPull对象,并将“Event Fire Type”选项设置为“EVERYTIME(每次)”。然后,将MyCustomDrawer身上的FPEDrawer脚本中的activateDrawer()函数,指定给这个抽屉的激活事件(Activation Event)。

    CustomDrawer3.jpg

  11. 将DrawerPull游戏物体的Box Collider组件,设置为Trigger。

  12. 运行场景,然后通过与抽屉把手进行交互,来打开抽屉。现在这个抽屉应该可以在激活时,慢慢地滑动打开和关闭啦。

  13. 如果你需要让抽屉在碰到某物时停止运动,请执行以下的步骤:

    • 请在SlidingPart下面创建2个子对象,并将这2个子对象命名为“OpenHitHelper ”和“CloseHitHelper”。

    • 在“OpenHitHelper游戏物体”和“CloseHitHelper游戏物体”身上,添加一个Box Collider组件和一个FPEDoorAndDrawerHitHelper组件。

    • 调整HitHelper的大小(Scale),使黄色的Gizmo轮廓与抽屉模型的宽度大致相同。但黄色Gizmo(黄色的线框)的厚度,大概是抽屉木板厚度的2倍(如下图所示)。

    • 选中MyCustomDrawer 游戏物体,在Inspector面板上找到FPEDrawer脚本,取消勾选“ Stop If Drawer Hits Something(抽屉碰到了障碍物就停止运动)”选项。

    • 你的抽屉现在看起来应该是这样的:

    CustomDrawer4.jpg


    • 你可以运行场景,测试一下啦。现在抽屉再关闭时,如果碰到了比较大的物体,抽屉应该会停止运动。但是,如果不把抽屉放在一件家具内,你很难测试这个功能。这里我们可以根据需要参考demoBasicDesk.prefab预制体中的“BasicDeskLeftDrawer”子游戏物体。运行时,这个抽屉看起来会像这样:

    DrawerCloseOnSoup.gif

    这是一张动图,你可以点击这里查看


  14. 如果你需要一个“抓取器(Drawer Contents Grabber)”,请执行以下的步骤:

    • 在SlidingPart游戏物体中,创建一个空的子游戏物体,并将其命名为“DrawerContentsGrabber”

    • 在DrawerContentsGrabber游戏物体身上,添加FPEDrawerContentsGrabber组件

    • 调整Box Collider的大小(注意:不是缩放Transform!),请让粉红色的Gizmo在抽屉的边界内,而且不会太高。

    • 你的抽屉现在看起来应该是这样的:

    CustomDrawer5.jpg


  15. 如果你需要设置“安全区(Safe Zone)”,请执行以下的步骤:

    • 默认情况下,抽屉安全区与抽屉的距离大概是1.3个单位。根据你的抽屉尺寸和滑动打开时间,你可以将这个距离调整得更近。
    • 如果你要测试安全区,请在靠近它的同时打开抽屉。如果抽屉滑动的过程中,玩家没被抽屉撞到,或者抽屉没有卡主,如果我们能顺利的打开抽屉,那么这可能是一个很好的数值。
    • 你可以禁用安全区,只需要取消勾选“Auto Move Player To Safe Zone(自动将玩家移动到安全区)”选项。但是,我们不建议你这样做。
    • 有关这个的详细信息,请参阅下面的Drawer Collision and the Player)(抽屉与玩家之间的碰撞)章节。
  16. 如果要把抽屉锁住,请执行以下的步骤:

    • 要把抽屉锁住很简单,你只需要选中MyCustomDrawer游戏物体,在Inspector面板上找到FPEDrawer脚本,勾选“Start Internally Locked(开始时内部锁定)”选项,并设置“Required Key Type(充当钥匙的物品类型)”选项。这里我们把Required Key Type选项设置为SIMPLEKEY吧~

    • 将demoSimpleKey预制体添加到场景中(这个demoSimpleKey预制体是SIMPLEKEY类型的物体,它可以作为这个抽屉的钥匙)。

  17. 如果你希望你的抽屉能够发出声音,那么请将声音库(FPE Simple Sound Bank文件)分配到“Drawer Sounds”选项(这个选项位于MyCustomDrawer游戏物体身上的FPEDrawer脚本中)。本插件自带的声音库位于\Sounds\Soundbanks\DoorsAndDrawers\文件夹中。

  18. 如果上面的步骤你都完成了,那么这个抽屉也就完成啦! 你也可以继续设置MyCustomDrawer身上的FPEDrawer脚本中,“Drawer-Specific Behaviour”部分里的选项,然后将新做好的这个抽屉保存为预制体。

注意:
为了让保存和加载功能正常工作,你的抽屉必须在场景中具有唯一的名称。
如果你使用了预制体,那么如果你将预制体命名为“MyCustomDrawer”,将场景里的抽屉命名为“MyCustomDrawer(1)”,就完全没问题!:)
(总之只要保证每一个抽屉(包括预制体)的名字都是独一无二的,就可以啦!)


抽屉和玩家之间的碰撞 (Drawer Collision and the Player)

有时,我们很难衡量抽屉相对于玩家的大小。导致的结果就是,玩家很难与抽屉进行互动。为了获得最佳的效果,请确保你的家具的设计便于放置和使用抽屉。

默认情况下,使用“安全区域”将确保流畅的游戏体验。但是,你可以让抽屉推动玩家,虽然有时可能会有点奇怪。

你还可以做一些事情来防止抽屉完全撞击玩家。例如,将具有锁定旋转的运动刚体,添加到抽屉的SlidingPart \ Collider子对象上,这样做就可以允许玩家“靠近”抽屉。但对于真正的深(厚)抽屉,可能是一个问题,并且可能会具有其他的连锁效果,因此请谨慎使用。


请参阅以下有关各种方法的示例:

  • Default Behaviour(默认行为):抽屉轻轻顺畅地打开,并轻轻顺畅地将玩家推移开(这是最棒的效果)DrawerDefaultSafeZone.gif

    这是一张动图,你可以点击这里查看


  • 抽屉在撞击到玩家时停止(这种情况非常真实,但在游戏里可能有点不好)

    DrawerStopHitPlayer.gif

    这是一张动图,你可以点击这里查看


  • 抽屉使用物理碰撞将玩家推开(可能会很奇怪,也许屏幕会奇怪的抖动)

    DrawerPushPlayer.gif

    这是一张动图,你可以点击这里查看


抽屉和其他物体之间的碰撞 (Drawer Collision and Other Objects)

有时候,我们需要把高大的物体会放在抽屉里。在大多数的示例中,当玩家把高大的物体放进抽屉时,物体阻碍了抽屉关闭,我们都是让抽屉停止移动来解决这个问题。

但是,你可能希望更多地能够依靠物理引擎,来允许玩家在抽屉中塞入东西并尝试关闭它们。

为避免在你这样做时,出现“卡住的抽屉”感觉,你可以调整抽屉的“CloseHitHelper”游戏物体的厚度。

下图是一个效果,这个以物理引擎驱动的抽屉,更接近真实的操作(关闭抽屉时,如果物体被卡住,物体会微微倾斜)。

ThinnerCloseHitHelper.gif

这是一张动图,你可以点击这里查看


为了能够实现这种效果,我们需要把CloseHitHelper游戏物体变得更薄,如下所示:

CloseHitHelperComparison.jpg


你可以在自己的抽屉上做尝试,看看你自己的游戏物体,放进抽屉里将会得到什么样的结果。


工作流程建议 (Workflow Notes)

一般来说,“抽屉”是一个独立的预制体。

将抽屉放入家具或其他物品时,你可以选择将抽屉作为家具的子游戏物体。

为获得最佳效果,在对家具和抽屉进行建模的时候,请将抽屉的模型导出为单独的模型文件。类似地,你可以也把抽屉把手的模型导出为单独的模型文件。这样你就可以更灵活的定制和重用抽屉和抽屉把手啦。


外部的锁 (External Locks)

当你希望任何一个抽屉被外部的锁(例如:一个密码锁)锁住时,你必须勾选“Start Externally Locked”选项。

最重要的是,你还必须提供另外一个物体(例如,插件中的demoSecuritySystem预制体),并将这个物体指定为解锁抽屉所需要的物体。被外部的锁锁住的抽屉,只能从外部系统解锁。否则,它们将被永远的锁住!:)

results matching ""

    No results matching ""