创建一个门 (Creating a Door)

总览(Overview)

这个插件中,主要有3种类型的门。它们是:滑动的门、总是向外的摆动门、复杂的摆动门。你还可以通过扩展FPEDoor类,来创建自己想要的门。

目录

[TOC]


示例的门 (Included Example Doors)

门的中文翻译—————— 说明
Template Type (FPEDoor.cs) 模板类 这是所有的门的父类。所有的门的类,都是从这个类中派生出来的。这个脚本中,包含了一些常见的变量和功能。
Sliding Door (FPESlidingDoor.cs) 滑动门 这种门可以滑动。
这种类型的门有时真的非常方便,因为对玩家来说,这种门很难挡到玩家的路。这种门常用的有:普通的滑动门和自动双开门滑动门。请参阅demoManualSlidingDoor.preab和demoDoubleAutomaticSlidingDoor.preab以了解这个脚本的使用方法。
Always Swing Out Door (FPEAlwaysSwingOutDoor.cs) 总是向外的摆动门 这种门可以围绕一个轴进行摆动(进行开关),而且它总是向着玩家所在的位置的另一侧进行打开(也就是说,玩家在门里,开门的时候,门会向外打开。如果玩家在门外,开门的时候,门会向内打开)。
这是最好的门,因为它们易于配置,并且易于玩家使用。这种门在开关的时候,不太像是真正的门,但有时现实主义并不重要。有关这个门的示例,请参阅demoAlwaysSwingOutDoor.prefab。
Complex Swinging Door (FPESwingingDoor.cs) 复杂的摆动门 这种门可以围绕一个轴进行摆动(进行开关),但它是以现实的方式转动的。他们模拟“定向的内弧线运动(directional inswing)”。(也就是说,这个门只能往一个方向打开)
你可以为这类型的门设置一个特殊的“安全区”,当玩家想打开门,但是又会被打开的门“击中”的时候,系统会把玩家自动移动到安全区,以确保门不会“击中”玩家。
当门向着玩家打开的时候,会播放一个很小很小很小的“过场动画”,会将相机往门闩的位置移动。这种门适用于模拟真实情况的游戏。关于这种门的示例,请参见demoDoorLeftHandInSwing.prefab和demoDoorRightHandInSwing.prefab。


常用的门的部件 (Common Door Components)

所有的门都有一组相似的部件,这些部件的行为方式会略有不同。

组件名 组件名的中文翻译 说明
Door Mesh 门板的网格 这是一个可见的“门板”,我们用它来阻挡玩家穿过门。有些门板会摆动地打开或关闭,有些门板会被滑动地推开。
Door Handle Mesh(es) 门把手的网格 当玩家想要打开或者关闭门的时候,需要与门把手进行互动。
Swinging or Sliding Part 摆动或滑动的部件 在这个部件中,会包含所有的可以被移动的部分 (例如:门的网格、门把手和其他的对象)。
Door Handle Interaction(s) (uses FPEInteractableActivateScript component) 门把手的交互(使用FPEInteractableActivateScript组件) 这是一个允许玩家打开门和关闭门的可激活的对象。将这个部件与门把手的网格(Door Handle Mesh)对齐,是一个很好的主意。也许你可以让这个部件变得更大一点,这样玩家可以更容易的选中这个对象。
Hit Helpers (uses FPEDoorAndDrawerHitHelper component) 击中助手(使用FPEDoorAndDrawerHitHelper组件) 这是一个可选的部件,这个部件用于检测门应该何时停止。
(应该是当门撞击到玩家身上的时候,就让门停下来 (停止关门,或者停止开门))
Player Interaction Zones 玩家交互的区域 这是一个可选的部件,这个部件用于指定一个区域。这个区域主要用于检测玩家最靠近门的哪一侧。以及如果需要移动玩家的话,将玩家移动到何处?
注意:
大多数情况下,你可以把门把手的可交互对象(DoorHandle Activation)的碰撞体,设置为触发器(trigger)。
这样可以防止门把手与其他对象发生碰撞。


所有的门都有一组相同的变量,也有一些不同的变量。

变量名———————— 变量名的中文翻译———————— 说明
Start Internally Locked 开始时内部锁定 内部锁定就是:使用内部的锁,锁住这个门。
也就是说,我们是在门把手上,锁住这个门。
如果要开门抽屉,就需要拿钥匙,与门把手进行互动。
如果为true,则在游戏开始时,门会被锁住,并且需要特定的库存物品来解锁这个门。
Required Key Type 需要的钥匙类型 解锁内部锁定的门时,所需要的库存物品的类型。
Start Externally Locked 开始时外部锁定 外部锁定就是:使用外部的锁,锁住这个门。
如果为true,则在游戏开始时,门会被锁住。如果要解锁这个门,那么外部对象(如:安全系统)需要先被解锁,才能打开这扇门。
(也就是说,如果一个门是被外部锁定,就说明需要先解锁一个另外的对象,才能解锁这个门。比如:你需要拉动一个拉闸,才能够打开门。或者你需要在一个输入器上输入一组密码,才能够打开门。)
Start Opened 开始时打开 如果为true,则在游戏开始时,门是打开的状态。可能,你还需要在视觉上移动这个门的门板,来让玩家感觉门是开的。这种情况适用于:比如,当你需要打开一扇门来引导玩家时。
Stop If Door Hits Something 门碰到了障碍物就停止运动 如果为true,那么当门的“Hit Helper”部件,击中另一个物体(比如玩家)或有物理效果的对象(比如可拾取道具)时,这个门将使用它Hit Helpers部件,来让这个门停止运动。
Door Handle Interaction Text Overrides 覆盖门把手的交互文字 当玩家对门进行不同的操作时,这个选项中对应的文字,将覆盖掉门把手原本的交互文字(Interaction String选项)。
Play Sounds 播放声音 如果为true,当玩家对门进行不同的操作时,这个门将发出对应的声音。
Door Sounds 门的声音 在这里设置门的声音(指定“声音库”文件,这个“声音库”是FPE Simple Sound Bank类型的文件)。如果Play Sounds变量为true,那么这些声音就会被用来产生音效。


请参见下面的各种类型的门。


滑动门(Sliding Doors)

这个插件中,附带了一些用于示例的滑动门:demoManualSlidingDoor预制体、demoManualSlidingDoor_Locked预制体、demoDoubleAutomaticSlidingDoor预制体。

如果要使用这些预制体,你只需要将它们拖到场景中即可。如果使用名字中有“_Locked”的预制体,请确保玩家可以拿到开门所需的“钥匙”(默认为demoSimpleKey.prefab)。如果使用名字中有“_ExternallyLocked”的预制体,请确保场景中包含了一些对象 (比如demoSecuritySystem预制体),以便玩家可以从外部解锁门。

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


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

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

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

  3. 在MyCustomSlidingDoor游戏物体上,添加FPESlidingDoor组件。

    这样会在MyCustomSlidingDoor身上,自动添加2个子对象:
    SlidingPart
    SlidingPart\DoorHandle
    
  4. 在SlidingPart游戏物体中,创建一个空的子游戏物体,将这个子游戏物体命名为"DoorMesh",并把物体的位置(局部坐标)设置为(0,0,0)。

  5. 我们创建一个门板吧!向DoorMesh中添加子游戏物体,我们在里面添加一些模型吧,例如插件自带的Door_C.fbx。并且我们需要根据需要旋转这个模型,让它与Gizmo(下图中紫色的长方体)对齐。

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

  7. 你的门,现在应该如下图所示:

    CustomSlidingDoor1.jpg


  8. 向SlidingPart对象上添加“Box Collider”组件,并相应地调整碰撞体的大小。这个碰撞体应该比门板大一点。

  9. 选择DoorHandle对象,并将“Event Fire Type”选项设置为“EVERYTIME(每次)”。然后,将MyCustomSlidingDoor身上的FPESlidingDoor脚本中的activateDoor()函数,指定给这个门的激活事件(Activation Event)。

    CustomSlidingDoor2.jpg


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

  11. 将门把手移动到门的左侧,并根据需要让门把手变小一点。你还可以将门把手的“Box Collider”设置为触发器(Trigger)。

    CustomSlidingDoor3.jpg


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

    • 请在SlidingPart下面创建一个子对象,并将这个子对象命名为“HitHelper”。

    • 在HitHelper身上添加一个Box Collider组件,然后,再添加一个FPEDoorAndDrawerHitHelper组件。

    • 调整HitHelper的大小(Scale),使黄色的Gizmo轮廓与门板网格(door mesh)的大小大致相同,但建议稍微厚一些。还要让HitHelper从门的左边伸出来一点。

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

    • 再次运行场景,然后打开门。现在,让玩家(角色控制器)站在靠近门的左侧,并关上门。当门击中玩家的时候,门应该停止运动了。如果没有,那么请检查上面的步骤,并尝试使HitHelper(黄色的线框)向左伸出一点点。 你可以参考demoManualSlidingDoor.prefab。

  13. 如果要把门锁住,请执行以下的步骤:

    • 要把门锁住很简单,你只需要选中MyCustomSlidingDoor游戏物体,在Inspector面板上找到FPESlidingDoor脚本,勾选“Start Internally Locked(开始时内部锁定)”选项,并设置“Required Key Type(充当钥匙的物品类型)”选项。这里我们把Required Key Type选项设置为SIMPLEKEY吧~
    • 将demoSimpleKey预制体添加到场景中(这个demoSimpleKey预制体是SIMPLEKEY类型的物体,它可以作为这扇门的钥匙)。
    • 再次运行这个场景,并测试你的门。现在你的门是锁住的,你需要使用钥匙才能解锁它,然后才能打开这扇门。
  14. 如果你希望你的门能够发出声音,那么请将声音库(FPE Simple Sound Bank文件)分配到“Door Sounds”选项(这个选项位于MyCustomSlidingDoor游戏物体身上的FPESlidingDoor脚本中)。 本插件自带的声音库位于\Sounds\Soundbanks\DoorsAndDrawers\文件夹中。

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

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


总是向外的摆动门 (Always Swing Out Doors)

这个插件中附带了一些“总是向外的摆动门(Always Swing Out Door)”的示例:demoAlwaysSwingOutDoor预制体、demoAlwaysSwingOutDoor_ExternallyLocked预制体、demoAlwaysSwingOutDoor_Locked预制体。

要使用这些预制体,只需将它们拖到场景中即可。如果使用名字中有“_Locked”的预制体,请确保玩家可以拿到开门所需的“钥匙”(默认为demoSimpleKey.prefab)。如果使用名字中有“_ExternallyLocked”的预制体,请确保场景中包含了一些对象 (比如demoSecuritySystem预制体),以便玩家可以从外部解锁门。

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


如果你需要从头创建一个自定义的“总是向外的摆动门”,请执行以下的步骤:

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

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

  3. 在MyCustomAlwaysSwingOutDoor游戏物体上,添加FPEAlwaysSwingOutDoor组件。

    这样会在MyCustomAlwaysSwingOutDoor身上,自动添加几个子对象:
    SwingingPart
    SwingingPart\DoorHandle
    PlayerInteractionZones\LeftHandSide
    PlayerInteractionZones\RightHandSide
    
  4. 在SlidingPart游戏物体中,创建一个空的子游戏物体,将这个子游戏物体命名为"DoorMesh",并把物体的位置(局部坐标)设置为(0,0,0)。

  5. 我们创建一个门板吧!向DoorMesh中添加子游戏物体,我们在里面添加一些模型吧,例如插件自带的Door_C.fbx。并且我们需要根据需要旋转这个模型,让它与紫色Gizmo(就是2个紫色的半透明长方体。这2个紫色的Gizmo,就是门摆动时的位置)对齐。

  6. 调整门板(door mesh)的位置,使门板垂直居中于红色的Gizmo(就是下图中红色的圆形线框。这个红色的Gizmo,就是门摆动的中心轴)。并让门板离红色的Gizmo稍微远一点,如下图所示。

    由于"总是向外的摆动门"是在一个假想的铰链(合页)上摆动,因此,我们稍后需要做一些视觉上的装饰。
    

    CustomASODoor1.jpg

    (上图是一个俯视图)


  7. 我们创建一个门把手吧!

    • 向DoorHandle中添加子游戏物体,我们在里面添加一些模型吧,例如插件自带的DoorHandle_A.fbx。确保这个模型位于(0,0,0)的位置,并根据需要旋转它。
    • 然后,再把这个门把手复制一份,并将复制品旋转180度,这样一来在门的两侧都有门把手啦。
    • 移动整个DoorHandle游戏物体,使DoorHandle远离铰链(红色的Gizmo),放到门的末端。(就是把门把手,放到门把手应该在的位置,如下图所示)
  8. 你的门,现在应该如下图所示:

    CustomASODoor2.jpg


  9. 向SwingingPart对象上添加“Box Collider”组件,并相应地调整碰撞体的大小。这个碰撞体应该比门板大一点。

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

    CustomASODoor3.jpg


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

  12. 根据需要调整门把手的大小和位置。你还可以将门把手的“Box Collider”设置为触发器(Trigger)。

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

    • 要使门在遇到某些东西时停止,请创建另一个SwingingPart的两个子对象,并将它们命名为:“HitHelperLeft”和 “HitHelperRight”。
    • 在“HitHelperLeft”和 “HitHelperRight”身上,添加一个Box Collider组件和一个FPEDoorAndDrawerHitHelper组件。
    • 调整HitHelper的大小(Scale),使黄色的Gizmo轮廓与门板网格(door mesh)的大小大致相同,但建议稍微厚一些。还要让HitHelper从门的左边伸出来一点。
    • 将HitHelperLeft沿着Z轴移动一点(朝向PlayerInteractionZones\LeftHandSide对象的位置进行移动,只在Z轴上移动哦)。将HitHelperRight沿着Z轴移动一点(朝向PlayerInteractionZones\RightHandSide对象的位置进行移动,只在Z轴上移动哦)。
    • 选中MyCustomAlwaysSwingOutDoor游戏物体,在Inspector面板上找到FPEAlwaysSwingOutDoor组件,取消勾选“ Stop If Door Hits Something(门碰到了障碍物就停止运动)”选项。
    • 然后,调整PlayerInteractionZones\LeftHandSide游戏物体和PlayerInteractionZones\RightHandSide游戏物体的位置,使它们两个能够更靠近门门把手。
    • 你的门,现在应该看起来像这样:

    CustomASODoor4.jpg

    上图从左到右分别是:俯视图、左视图和主视图


    • 再次运行场景,然后打开门。现在,让玩家(角色控制器)站在门板的旁边,并关上门。当门击中玩家的时候,门应该停止运动了。如果没有,那么请检查上面的步骤,并尝试使HitHelper(黄色的线框)向左伸出一点点。 你可以参考demoAlwaysSwingOutDoor.prefab。


  14. 如果要把门锁住,请执行以下的步骤:

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

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

    • 再次运行这个场景,并测试你的门。现在你的门是锁住的,你需要使用钥匙才能解锁它,然后才能打开这扇门。
  15. 如果你希望你的门能够发出声音,那么请将声音库(FPE Simple Sound Bank文件)分配到“Door Sounds”选项(这个选项位于MyCustomAlwaysSwingOutDoor游戏物体身上的FPEAlwaysSwingOutDoor脚本中)。 本插件自带的声音库位于\Sounds\Soundbanks\DoorsAndDrawers\文件夹中。

  16. 如果要为门添加铰链(合页),请执行以下的步骤:

    • 如果现在,你把门靠在一堵墙上。你可能会发现,门在摆动的时候,门和墙壁(或者门框)之间,会有一个缝隙(如果没有这个缝隙,则在摆动的时候会穿模)。您可能需要用铰链在隐藏门与墙壁之间的缝隙。我们为你提供了一种“铰链”,但这种“铰链”可能会和真实的铰链有区别,请不要在意。

    • 在SwingingPart游戏物体中,添加一个将子3D对象“Quad”,并将这个“Quad”命名为“GapHider”。为GapHider分配一个材质球,例如本插件自带的DoorGapHider_A.mat。

      如果你想添加一个“Quad”游戏物体:
      你可以在Hierarchy面板中右键,然后选择“3D Object -> Quad”。
      
    • 移除GapHider身上的MeshCollider组件。然后根据需要调整GapHider的位置和大小,使GapHider能够覆盖门与墙之间的缝隙。(因为,GapHider游戏物体的其中一面是透明的,另外一面是不透明的。所以,你需要使用不透明的那一面,来覆盖掉门与墙之间的缝隙。)

    • 然后,复制GapHider,并将复制品围绕Y轴旋转180度。然后将复制品移动到门的另一侧,以覆盖掉另外一侧的缝隙。

    • 现在,运行场景。你可以看到当门打开时,门与墙壁之间的间隙将被掩盖,并且瑕疵不会太明显。 请参阅demoAlwaysSwingOutDoor.prefab以获取进一步的参考。

  17. 如果上面的步骤你都完成了,那么这扇门也就完成啦! 你也可以继续设置MyCustomAlwaysSwingOutDoor身上的FPEAlwaysSwingOutDoor脚本中,有关“Door-Specific Behaviour”部分里的选项。然后将新做好的这扇门保存为预制体。

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


复杂的摆动门 (Complex Swinging Doors)

这个插件中,附带了一些用于示例的滑动门:demoDoorLeftHandInSwing预制体、demoDoorRightHandInSwing预制体、demoDoorRightHandInSwing_Locked预制体。

如果要使用这些预制体,你只需要将它们拖到场景中即可。如果使用名字中有“_Locked”的预制体,请确保玩家可以拿到开门所需的“钥匙”(默认为demoSimpleKey.prefab)。

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


如果你需要从头创建一个自定义的"复杂的摆动门 "(在这个示例中,我们要创建的是右侧內摆门),请执行以下的步骤:

注意:设置这种门可能会非常的繁琐。建议你仅在两种情况下使用这种门:
你非常熟悉Unity、
或者你做的是模拟真实的游戏
  • 创建一个新的场景,并在(0,0,0)的位置,添加一个Plane和一个FPECore预制体。

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

  • 在MyCustomRightHandInswingDoor游戏物体上,添加FPESwingingDoor组件。

    这样会在MyCustomRightHandInswingDoor身上,自动添加几个子对象:
    SwingingPart
    SwingingPart\DoorHandle
    PlayerInteractionZones\SwingInSide
    PlayerInteractionZones\SwingOutSide
    PlayerInteractionZones\SafeZoneSwingIn: 向内摆动的安全区域(关门时的安全区域)。这是在门关上时,玩家会被移动到的地方。
    PlayerInteractionZones\SafeZoneSwingOut: 向外摆动的安全区域(开门时的安全区域)。这是在门打开时,玩家会被移动到的地方。
    PlayerInteractionZones\DoorActionLookTarget: 当门打开和关闭时,这个游戏物体将作为相机移动的目标(相机(玩家)会移动到这里)。
    
  • 在SlidingPart游戏物体中,创建一个空的子游戏物体,将这个子游戏物体命名为"DoorMesh",并把物体的位置(局部坐标)设置为(0,0,0)。

  • 我们创建一个门板吧!向DoorMesh中添加子游戏物体,我们在里面添加一些模型吧,例如插件自带的Door_C.fbx。并且我们可以根据需要旋转或者移动这个模型。

  • 调整门板(door mesh)的位置,使门板垂直居中于红色的Gizmo(就是下图中红色的圆形线框。这个红色的Gizmo,就是门摆动的中心轴)。并让门板离红色的Gizmo稍微远一点,如下图所示。将门围绕红色铰链枢轴位置围绕蓝色框摆动。

CustomSwingingDoor1.jpg

上图是一张俯视图


  • 我们创建一个门把手吧!
    • 向DoorHandle中添加子游戏物体,我们在里面添加一些模型吧,例如插件自带的DoorHandle_A.fbx。确保这个模型位于(0,0,0)的位置,并根据需要旋转它。
    • 然后,再把这个门把手复制一份,并将复制品旋转180度,这样一来在门的两侧都有门把手啦。
    • 移动整个DoorHandle游戏物体,使DoorHandle远离铰链(红色的Gizmo),放到门的末端。(就是把门把手,放到门把手应该在的位置,如下图所示)
    • 把2个门把手的碰撞体(Collider),都设置为触发器(Trigger)。
  • 你的门,现在应该看起来像这样:

CustomSwingingDoor2.jpg

上图是一张俯视图


  • 向SwingingPart对象上添加“Box Collider”组件,并相应地调整碰撞体的大小。这个碰撞体应该比门板大一点。

  • 选择DoorHandle对象,并将“Event Fire Type”选项设置为“EVERYTIME(每次)”。然后,将MyCustomRightHandInswingDoor身上的FPESwingingDoor脚本中的activateDoor()函数,指定给这个门的激活事件(Activation Event)。

    CustomSwingingDoor3.jpg

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

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

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

    • 在“HitHelperOpen”和 “HitHelperClose”身上,各添加一个Box Collider组件和一个FPEDoorAndDrawerHitHelper 组件。

    • 调整HitHelper的大小(Scale),使黄色的Gizmo轮廓与门板模型(door mesh)的大小大致相同,但建议稍微厚一些。还要让HitHelper从门的左边伸出来一点。

    • 将HitHelperOpen 沿着Z轴移动一点(朝向PlayerInteractionZones\SwingOutSide 对象的位置进行移动,只在Z轴上移动哦)。将HitHelperClose沿着Z轴移动一点(朝向PlayerInteractionZones\SwingInSide 对象的位置进行移动,只在Z轴上移动哦)。

    • 选中MyCustomRightHandInswingDoor游戏物体,在Inspector面板上找到FPESwingingDoor组件,取消勾选“ Stop If Door Hits Something(门碰到了障碍物就停止运动)”选项。

    • 再次运行场景并打开门,你的门应该会在碰到障碍物(比如玩家)时,就停止运动了。 如果门撞到了玩家(可能是“撞击玩家,让玩家移动了”的意思),请尝试让Hit Helper对象的宽度,比门的宽度稍微小一点

  • 你的门,现在应该看起来像这样:

    CustomSwingingDoor4.jpg

    上图从左到右分别是:俯视图、左视图和主视图


  • 你可能想稍微调试一下这个门,以确保它能运行的更好:

    • 选中“SafeZoneSwingIn”游戏物体和“SafeZoneSwingOut”游戏物体,如果你勾选了它们身上的“Auto Move Player To Safe Zones”选项,玩家会自动移动到“安全区”的位置。如果这些“安全区”在一个不太理想的位置,那么玩家可能在开关门的时候,会以一种看起来非常奇怪的方式被撞到。你可以重新设置“安全区”的位置,并尝试再次打开门,看下效果,直到您满意为止。 您还可以参考demoDoorRightHandInSwing.prefab,你可以参考这个预制体里“安全区”的位置,以及“注视目标(DoorActionLookTarget游戏物体)”的位置。
  • 如果要把门锁住,请执行以下的步骤:

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

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

    • 再次运行这个场景,并测试你的门。现在你的门是锁住的,你需要使用钥匙才能解锁它,然后才能打开这扇门。

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

  • 如果上面的步骤你都完成了,那么这扇门也就完成啦! 你也可以继续设置MyCustomRightHandInswingDoor身上的FPESwingingDoor脚本中,有关“Door-Specific Behaviour”部分里的选项。然后将新做好的这扇门保存为预制体。

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


门框 (Door Jambs)

你可能希望你的门,是有门框的。

如果你要添加门框,请执行以下的步骤:

  • 你可以在你的门里,创建一个子对象,并将这个子对象命名为“Jamb”。
  • 然后往Jamb中,添加一个模型或者游戏物体(比如,插件自带的Doorjamb_A.fbx或DoorJamb_Pocket.fbx)。
  • 调整这个模型的位置、旋转和缩放。
  • 有关门框的更多详细信息,请参阅插件中所有的“门的预制体”。


外部的锁 (External Locks)

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

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


门的角度和位置 (Door Angles and Positions)

你需要确定“总是向外的摆动门”和“复杂的摆动门”应该向外摆动多远。蓝色Gizmo(下图中紫色半透明的部分)将非常直观的显示门打开时的位置。下图中,显示了门“以95度打开(默认)”,和“以135度打开”之间的区别。

注意:
"滑动门"具有“关闭时的位置(Closed Position)”。
因此,SlidingPart游戏物体的x轴(局部坐标)的位置(Position)应该为零。
同样,两种类型的"摆动门"都具有“关闭时的旋转(Closed Rotation)”,因此SwingingPart游戏物体的Y轴(局部坐标)的旋转(Rotation)应该为零。
这些位置(门打开和关闭的位置)是在运行时自动创建的,所以你需要遵守这条注意事项。

swingAngle1.jpg


创建“复杂的摆动门”时,摇摆的角度必须与门的方向对齐。“左侧的内摆(你可以理解为:门把手在右边的时候)”必须有负的摆动角度,而“右侧的内摆(你可以理解为:门把手在左边的时候)”必须有正的摆动角度。

“Directional Inswing(定向内摆)”是指:这种类型的门不能旋转超过零度(也就是说旋转必须是负数)。这就是为什么既有“右侧的内摆”也有“右侧的内摆”的原因!:)

没看懂上面这句话,但其实也不需要在意:)

results matching ""

    No results matching ""