创建一个门 (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预制体),以便玩家可以从外部解锁门。
完成啦,现在就可以运行场景并使用门啦!
如果你需要从头创建一个自定义的滑动门,请执行以下的步骤:
创建一个新的场景,并在(0,0,0)的位置,添加一个Plane和一个FPECore预制体。
絮酱备注: 当游戏运行时,FPECore游戏物体将会自动实例化一个叫做FPEPlayerController的游戏物体, 这个FPEPlayerController里会自带一个相机。 因此,为了保证不发生冲突,在游戏运行之前,最好删除(或者禁用)场景中的其他相机。
创建一个空的游戏物体,将它命名为“MyCustomSlidingDoor”
在MyCustomSlidingDoor游戏物体上,添加FPESlidingDoor组件。
这样会在MyCustomSlidingDoor身上,自动添加2个子对象: SlidingPart SlidingPart\DoorHandle
在SlidingPart游戏物体中,创建一个空的子游戏物体,将这个子游戏物体命名为"DoorMesh",并把物体的位置(局部坐标)设置为(0,0,0)。
我们创建一个门板吧!向DoorMesh中添加子游戏物体,我们在里面添加一些模型吧,例如插件自带的Door_C.fbx。并且我们需要根据需要旋转这个模型,让它与Gizmo(下图中紫色的长方体)对齐。
我们创建一个门把手吧!向DoorHandle中添加子游戏物体,我们在里面添加一些模型吧,例如插件自带的DoorHandle_Pocket.fbx。确保这个模型位于(0,0,0)的位置,并根据需要旋转它。
你的门,现在应该如下图所示:
向SlidingPart对象上添加“Box Collider”组件,并相应地调整碰撞体的大小。这个碰撞体应该比门板大一点。
选择DoorHandle对象,并将“Event Fire Type”选项设置为“EVERYTIME(每次)”。然后,将MyCustomSlidingDoor身上的FPESlidingDoor脚本中的activateDoor()函数,指定给这个门的激活事件(Activation Event)。
运行场景,然后通过与门把手进行交互,来打开门。现在这个门应该可以在激活时,慢慢地滑动打开和关闭啦。
将门把手移动到门的左侧,并根据需要让门把手变小一点。你还可以将门把手的“Box Collider”设置为触发器(Trigger)。
如果你需要让门在碰到某物时停止运动,请执行以下的步骤:
请在SlidingPart下面创建一个子对象,并将这个子对象命名为“HitHelper”。
在HitHelper身上添加一个Box Collider组件,然后,再添加一个FPEDoorAndDrawerHitHelper组件。
调整HitHelper的大小(Scale),使黄色的Gizmo轮廓与门板网格(door mesh)的大小大致相同,但建议稍微厚一些。还要让HitHelper从门的左边伸出来一点。
选中MyCustomSlidingDoor游戏物体,在Inspector面板上找到FPESlidingDoor脚本,取消勾选“ Stop If Door Hits Something(门碰到了障碍物就停止运动)”选项。
再次运行场景,然后打开门。现在,让玩家(角色控制器)站在靠近门的左侧,并关上门。当门击中玩家的时候,门应该停止运动了。如果没有,那么请检查上面的步骤,并尝试使HitHelper(黄色的线框)向左伸出一点点。 你可以参考demoManualSlidingDoor.prefab。
如果要把门锁住,请执行以下的步骤:
- 要把门锁住很简单,你只需要选中MyCustomSlidingDoor游戏物体,在Inspector面板上找到FPESlidingDoor脚本,勾选“Start Internally Locked(开始时内部锁定)”选项,并设置“Required Key Type(充当钥匙的物品类型)”选项。这里我们把Required Key Type选项设置为SIMPLEKEY吧~
- 将demoSimpleKey预制体添加到场景中(这个demoSimpleKey预制体是SIMPLEKEY类型的物体,它可以作为这扇门的钥匙)。
- 再次运行这个场景,并测试你的门。现在你的门是锁住的,你需要使用钥匙才能解锁它,然后才能打开这扇门。
如果你希望你的门能够发出声音,那么请将声音库(FPE Simple Sound Bank文件)分配到“Door Sounds”选项(这个选项位于MyCustomSlidingDoor游戏物体身上的FPESlidingDoor脚本中)。 本插件自带的声音库位于\Sounds\Soundbanks\DoorsAndDrawers\文件夹中。
如果上面的步骤你都完成了,那么这扇门也就完成啦! 你也可以继续设置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预制体),以便玩家可以从外部解锁门。
完成啦,现在就可以运行场景并使用门啦!
如果你需要从头创建一个自定义的“总是向外的摆动门”,请执行以下的步骤:
创建一个新的场景,并在(0,0,0)的位置,添加一个Plane和一个FPECore预制体。
絮酱备注: 当游戏运行时,FPECore游戏物体将会自动实例化一个叫做FPEPlayerController的游戏物体, 这个FPEPlayerController里会自带一个相机。 因此,为了保证不发生冲突,在游戏运行之前,最好删除(或者禁用)场景中的其他相机。
创建一个空的游戏物体,将它命名为“MyCustomAlwaysSwingOutDoor”。
在MyCustomAlwaysSwingOutDoor游戏物体上,添加FPEAlwaysSwingOutDoor组件。
这样会在MyCustomAlwaysSwingOutDoor身上,自动添加几个子对象: SwingingPart SwingingPart\DoorHandle PlayerInteractionZones\LeftHandSide PlayerInteractionZones\RightHandSide
在SlidingPart游戏物体中,创建一个空的子游戏物体,将这个子游戏物体命名为"DoorMesh",并把物体的位置(局部坐标)设置为(0,0,0)。
我们创建一个门板吧!向DoorMesh中添加子游戏物体,我们在里面添加一些模型吧,例如插件自带的Door_C.fbx。并且我们需要根据需要旋转这个模型,让它与紫色Gizmo(就是2个紫色的半透明长方体。这2个紫色的Gizmo,就是门摆动时的位置)对齐。
调整门板(door mesh)的位置,使门板垂直居中于红色的Gizmo(就是下图中红色的圆形线框。这个红色的Gizmo,就是门摆动的中心轴)。并让门板离红色的Gizmo稍微远一点,如下图所示。
由于"总是向外的摆动门"是在一个假想的铰链(合页)上摆动,因此,我们稍后需要做一些视觉上的装饰。
(上图是一个俯视图)
我们创建一个门把手吧!
- 向DoorHandle中添加子游戏物体,我们在里面添加一些模型吧,例如插件自带的DoorHandle_A.fbx。确保这个模型位于(0,0,0)的位置,并根据需要旋转它。
- 然后,再把这个门把手复制一份,并将复制品旋转180度,这样一来在门的两侧都有门把手啦。
- 移动整个DoorHandle游戏物体,使DoorHandle远离铰链(红色的Gizmo),放到门的末端。(就是把门把手,放到门把手应该在的位置,如下图所示)
你的门,现在应该如下图所示:
向SwingingPart对象上添加“Box Collider”组件,并相应地调整碰撞体的大小。这个碰撞体应该比门板大一点。
选择DoorHandle对象,并将“Event Fire Type”选项设置为“EVERYTIME(每次)”。然后,将MyCustomAlwaysSwingOutDoor身上的FPEAlwaysSwingOutDoor脚本中的activateDoor()函数,指定给这个门的激活事件(Activation Event)。
运行场景,然后通过与门把手进行交互,来打开门。现在这个门应该可以在激活时,慢慢地滑动打开和关闭啦。
根据需要调整门把手的大小和位置。你还可以将门把手的“Box Collider”设置为触发器(Trigger)。
如果你需要让门在碰到某物时停止运动,请执行以下的步骤:
- 要使门在遇到某些东西时停止,请创建另一个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游戏物体的位置,使它们两个能够更靠近门门把手。
- 你的门,现在应该看起来像这样:
上图从左到右分别是:俯视图、左视图和主视图
- 再次运行场景,然后打开门。现在,让玩家(角色控制器)站在门板的旁边,并关上门。当门击中玩家的时候,门应该停止运动了。如果没有,那么请检查上面的步骤,并尝试使HitHelper(黄色的线框)向左伸出一点点。 你可以参考demoAlwaysSwingOutDoor.prefab。
如果要把门锁住,请执行以下的步骤:
要把门锁住很简单,你只需要选中MyCustomAlwaysSwingOutDoor游戏物体,在Inspector面板上找到FPEAlwaysSwingOutDoor组件,勾选“Start Internally Locked(开始时内部锁定)”选项。并设置“Required Key Type(充当钥匙的物品类型)”选项。这里我们把Required Key Type选项设置为SIMPLEKEY吧~
将demoSimpleKey预制体添加到场景中(这个demoSimpleKey预制体是SIMPLEKEY类型的物体,它可以作为这扇门的钥匙)。
- 再次运行这个场景,并测试你的门。现在你的门是锁住的,你需要使用钥匙才能解锁它,然后才能打开这扇门。
如果你希望你的门能够发出声音,那么请将声音库(FPE Simple Sound Bank文件)分配到“Door Sounds”选项(这个选项位于MyCustomAlwaysSwingOutDoor游戏物体身上的FPEAlwaysSwingOutDoor脚本中)。 本插件自带的声音库位于\Sounds\Soundbanks\DoorsAndDrawers\文件夹中。
如果要为门添加铰链(合页),请执行以下的步骤:
如果现在,你把门靠在一堵墙上。你可能会发现,门在摆动的时候,门和墙壁(或者门框)之间,会有一个缝隙(如果没有这个缝隙,则在摆动的时候会穿模)。您可能需要用铰链在隐藏门与墙壁之间的缝隙。我们为你提供了一种“铰链”,但这种“铰链”可能会和真实的铰链有区别,请不要在意。
在SwingingPart游戏物体中,添加一个将子3D对象“Quad”,并将这个“Quad”命名为“GapHider”。为GapHider分配一个材质球,例如本插件自带的DoorGapHider_A.mat。
如果你想添加一个“Quad”游戏物体: 你可以在Hierarchy面板中右键,然后选择“3D Object -> Quad”。
移除GapHider身上的MeshCollider组件。然后根据需要调整GapHider的位置和大小,使GapHider能够覆盖门与墙之间的缝隙。(因为,GapHider游戏物体的其中一面是透明的,另外一面是不透明的。所以,你需要使用不透明的那一面,来覆盖掉门与墙之间的缝隙。)
然后,复制GapHider,并将复制品围绕Y轴旋转180度。然后将复制品移动到门的另一侧,以覆盖掉另外一侧的缝隙。
现在,运行场景。你可以看到当门打开时,门与墙壁之间的间隙将被掩盖,并且瑕疵不会太明显。 请参阅demoAlwaysSwingOutDoor.prefab以获取进一步的参考。
如果上面的步骤你都完成了,那么这扇门也就完成啦! 你也可以继续设置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稍微远一点,如下图所示。将门围绕红色铰链枢轴位置围绕蓝色框摆动。
上图是一张俯视图
- 我们创建一个门把手吧!
- 向DoorHandle中添加子游戏物体,我们在里面添加一些模型吧,例如插件自带的DoorHandle_A.fbx。确保这个模型位于(0,0,0)的位置,并根据需要旋转它。
- 然后,再把这个门把手复制一份,并将复制品旋转180度,这样一来在门的两侧都有门把手啦。
- 移动整个DoorHandle游戏物体,使DoorHandle远离铰链(红色的Gizmo),放到门的末端。(就是把门把手,放到门把手应该在的位置,如下图所示)
- 把2个门把手的碰撞体(Collider),都设置为触发器(Trigger)。
- 你的门,现在应该看起来像这样:
上图是一张俯视图
向SwingingPart对象上添加“Box Collider”组件,并相应地调整碰撞体的大小。这个碰撞体应该比门板大一点。
选择DoorHandle对象,并将“Event Fire Type”选项设置为“EVERYTIME(每次)”。然后,将MyCustomRightHandInswingDoor身上的FPESwingingDoor脚本中的activateDoor()函数,指定给这个门的激活事件(Activation Event)。
运行场景,然后通过与门把手进行交互,来打开门。现在这个门应该可以在激活时,慢慢地滑动打开和关闭啦。
如果你需要让门在碰到某物时停止运动,请执行以下的步骤:
请在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对象的宽度,比门的宽度稍微小一点
你的门,现在应该看起来像这样:
上图从左到右分别是:俯视图、左视图和主视图
你可能想稍微调试一下这个门,以确保它能运行的更好:
- 选中“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)应该为零。
这些位置(门打开和关闭的位置)是在运行时自动创建的,所以你需要遵守这条注意事项。
创建“复杂的摆动门”时,摇摆的角度必须与门的方向对齐。“左侧的内摆(你可以理解为:门把手在右边的时候)”必须有负的摆动角度,而“右侧的内摆(你可以理解为:门把手在左边的时候)”必须有正的摆动角度。
“Directional Inswing(定向内摆)”是指:这种类型的门不能旋转超过零度(也就是说旋转必须是负数)。这就是为什么既有“右侧的内摆”也有“右侧的内摆”的原因!:)
没看懂上面这句话,但其实也不需要在意:)