跳到正文

游戏 HUD 设置

和 Game Instance 一样,先确认你的项目是否已经使用了自定义 Game HUD 类。
可以在 Project Settings > Map and Modes 里查看,也可以打开你自己创建的游戏模式查看 HUD Class 设置。

然后根据你看到的情况,判断下面三种情形中哪一种适用于你的项目:

情形 A:使用引擎默认的 Game HUD

你看到的:HUD Class 下拉框里显示的是默认的 HUD 类

这说明你还没有自定义 Game HUD,请直接按下面的情形 A 步骤操作。

情形 A 步骤

情形 A
你还没有自定义 Game HUD 类

要使用资源包提供的 HUD Class,只需把 BP_EasyMainGameHUD 类加到你的游戏模式里。

  1. 如果你已经有游戏模式,打开它;或者进入 Projects Settings > Map and Modes,在 Selected GameMode 下找到 HUD Class,把值改成 BP_EasyMainGameHUD

  2. 如果还没有游戏模式,建议先看 虚幻引擎官方文档,了解并创建自己的 GameMode 类,然后再回到第 1 步。

    也可以直接使用自带的演示游戏模式(GM_EGUI_DemoGameMode):在项目设置或 GameMode 下拉框里选中它,就会同时使用演示用的玩家控制器、角色与正确的 HUD Class。

    自带的游戏模式、玩家控制器与角色都可以在 EasyGameUI/DemoContent/ 下找到

注意

如果你有多个游戏模式或关卡覆盖了默认 GameMode 类,记得在这些覆盖里也设置 HUD Class!


情形 B:已有自定义蓝图 Game HUD

你看到的:HUD Class 显示的是自定义名称(例如 BP_MyGameHUD)

这说明你已经有自定义 Game HUD。打开它,看右上角的 Parent Class(父类)。

如果父类是引擎通用的 HUD,请按下面的情形 B 步骤操作。

情形 B 步骤

情形 B
你有自定义的纯蓝图 Game HUD 类

  1. 在你自己的 Game HUD 里点击 Class Settings,打开细节面板

  2. 在 Class Options 分类下找到 Parent Class “HUD” 设置

  3. 点开下拉框,搜索 BP_EasyMainGameHUD 并选中

  4. 虚幻可能会弹出警告窗口,点击 Reparent 忽略即可

  5. 接着,如果你的 HUD 里有 Event Begin Play,先找到它(在蓝图中按 Ctrl + F 搜索)

  6. 右键它,选择 Add Call to Parent Function

  7. 把新生成的节点接在你的逻辑之前,如下图

  8. 同样,如果你的 HUD 里用到了 Any Key 节点,先找到它

  9. 然后把下面这段代码复制到 Any Key 节点旁边

    Begin Object Class=/Script/BlueprintGraph.K2Node_CallFunction Name="K2Node_CallFunction_0" ExportPath="/Script/BlueprintGraph.K2Node_CallFunction'/Game/EasyGameUI/Core/BP_EasyMainGameHUD.BP_EasyMainGameHUD:EventGraph.K2Node_CallFunction_0'"
        FunctionReference=(MemberName="HandleLocalAnyKeyInput",MemberGuid=3E0E222B41D4937801B1E9BC2FCEC8C1,bSelfContext=True)
        NodePosX=368
        NodePosY=1680
        NodeGuid=A25D01F8446F406EBDB35EA539707C8B
        CustomProperties Pin (PinId=B82933D146459F174FE78DB19CB833EB,PinName="execute",PinToolTip="\nExec",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_Knot_5 3685F68847F3971B34227DA830F9809E,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
        CustomProperties Pin (PinId=ADEB07594E33134A18CEC6A64EE293B4,PinName="then",PinToolTip="\nExec",Direction="EGPD_Output",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
        CustomProperties Pin (PinId=7D54E6084F761B4FABDCEE8ADF994FAD,PinName="self",PinFriendlyName=NSLOCTEXT("K2Node", "Target", "Target"),PinToolTip="Target\nSelf Object Reference",PinType.PinCategory="object",PinType.PinSubCategory="self",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
        CustomProperties Pin (PinId=F2A1FA804343391597BF83BF536948CB,PinName="Pressed?",PinToolTip="Pressed?\nBoolean",PinType.PinCategory="bool",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,DefaultValue="true",AutogeneratedDefaultValue="true",PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
        CustomProperties Pin (PinId=DADD34DA4825B2A00826658C86E2F2C5,PinName="Key",PinToolTip="Key\nKey Structure",PinType.PinCategory="struct",PinType.PinSubCategory="",PinType.PinSubCategoryObject="/Script/CoreUObject.ScriptStruct'/Script/InputCore.Key'",PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,DefaultValue="None",AutogeneratedDefaultValue="None",LinkedTo=(K2Node_Knot_3 A0CCC01B42EF0D3A4870BE9F3FEBB7BB,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
    End Object
    Begin Object Class=/Script/BlueprintGraph.K2Node_CallFunction Name="K2Node_CallFunction_1" ExportPath="/Script/BlueprintGraph.K2Node_CallFunction'/Game/EasyGameUI/Core/BP_EasyMainGameHUD.BP_EasyMainGameHUD:EventGraph.K2Node_CallFunction_1'"
        FunctionReference=(MemberName="HandleLocalAnyKeyInput",MemberGuid=3E0E222B41D4937801B1E9BC2FCEC8C1,bSelfContext=True)
        NodePosX=368
        NodePosY=1872
        NodeGuid=F1896428452AECE1008F81968BD0F02D
        CustomProperties Pin (PinId=B82933D146459F174FE78DB19CB833EB,PinName="execute",PinToolTip="\nExec",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_Knot_4 02B20EEF4E7E7FADF776879A3913112E,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
        CustomProperties Pin (PinId=ADEB07594E33134A18CEC6A64EE293B4,PinName="then",PinToolTip="\nExec",Direction="EGPD_Output",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
        CustomProperties Pin (PinId=7D54E6084F761B4FABDCEE8ADF994FAD,PinName="self",PinFriendlyName=NSLOCTEXT("K2Node", "Target", "Target"),PinToolTip="Target\nSelf Object Reference",PinType.PinCategory="object",PinType.PinSubCategory="self",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
        CustomProperties Pin (PinId=F2A1FA804343391597BF83BF536948CB,PinName="Pressed?",PinToolTip="Pressed?\nBoolean",PinType.PinCategory="bool",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,DefaultValue="false",AutogeneratedDefaultValue="true",PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
        CustomProperties Pin (PinId=DADD34DA4825B2A00826658C86E2F2C5,PinName="Key",PinToolTip="Key\nKey Structure",PinType.PinCategory="struct",PinType.PinSubCategory="",PinType.PinSubCategoryObject="/Script/CoreUObject.ScriptStruct'/Script/InputCore.Key'",PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,DefaultValue="None",AutogeneratedDefaultValue="None",LinkedTo=(K2Node_Knot_3 A0CCC01B42EF0D3A4870BE9F3FEBB7BB,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
    End Object
    Begin Object Class=/Script/BlueprintGraph.K2Node_Knot Name="K2Node_Knot_3" ExportPath="/Script/BlueprintGraph.K2Node_Knot'/Game/EasyGameUI/Core/BP_EasyMainGameHUD.BP_EasyMainGameHUD:EventGraph.K2Node_Knot_3'"
        NodePosX=224
        NodePosY=1831
        bCommentBubbleVisible=True
        NodeComment="Key"
        NodeGuid=13E56FF24BE2D2C2A07A1283FB9C41D0
        CustomProperties Pin (PinId=3EEE5A6E4AAC8D13626143A173D201BF,PinName="InputPin",PinType.PinCategory="struct",PinType.PinSubCategory="",PinType.PinSubCategoryObject="/Script/CoreUObject.ScriptStruct'/Script/InputCore.Key'",PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_InputKey_1 88F84FFC47FAA1E1D7BA6980F2FC1A21,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=True,bAdvancedView=False,bOrphanedPin=False,)
        CustomProperties Pin (PinId=A0CCC01B42EF0D3A4870BE9F3FEBB7BB,PinName="OutputPin",Direction="EGPD_Output",PinType.PinCategory="struct",PinType.PinSubCategory="",PinType.PinSubCategoryObject="/Script/CoreUObject.ScriptStruct'/Script/InputCore.Key'",PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_CallFunction_1 DADD34DA4825B2A00826658C86E2F2C5,K2Node_CallFunction_0 DADD34DA4825B2A00826658C86E2F2C5,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
        End Object
        Begin Object Class=/Script/BlueprintGraph.K2Node_Knot Name="K2Node_Knot_4" ExportPath="/Script/BlueprintGraph.K2Node_Knot'/Game/EasyGameUI/Core/BP_EasyMainGameHUD.BP_EasyMainGameHUD:EventGraph.K2Node_Knot_4'"
        NodePosX=224
        NodePosY=1922
        bCommentBubbleVisible=True
        NodeComment="Released"
        NodeGuid=9AA6F4E046972800B2B7BE8947C96265
        CustomProperties Pin (PinId=34BF1EDC4EE4A19B167B03AF8D1B2C40,PinName="InputPin",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_InputKey_1 4A8A2829490E6BFAA9E45AA2CE9FF32D,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=True,bAdvancedView=False,bOrphanedPin=False,)
        CustomProperties Pin (PinId=02B20EEF4E7E7FADF776879A3913112E,PinName="OutputPin",Direction="EGPD_Output",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_CallFunction_1 B82933D146459F174FE78DB19CB833EB,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
    End Object
    Begin Object Class=/Script/BlueprintGraph.K2Node_Knot Name="K2Node_Knot_5" ExportPath="/Script/BlueprintGraph.K2Node_Knot'/Game/EasyGameUI/Core/BP_EasyMainGameHUD.BP_EasyMainGameHUD:EventGraph.K2Node_Knot_5'"
        NodePosX=224
        NodePosY=1730
        bCommentBubbleVisible=True
        NodeComment="Pressed"
        NodeGuid=539C3F9C44196374045E9BA9DA8644CD
        CustomProperties Pin (PinId=CA9043DD416F00A21787A1A206CF21CE,PinName="InputPin",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_InputKey_1 9EC3E0534ACF4B0AFE5618809352ECA4,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=True,bAdvancedView=False,bOrphanedPin=False,)
        CustomProperties Pin (PinId=3685F68847F3971B34227DA830F9809E,PinName="OutputPin",Direction="EGPD_Output",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_CallFunction_0 B82933D146459F174FE78DB19CB833EB,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
    End Object  
    
  10. 接着把每个引脚对应连到 Any Key 节点上。最终应该像这样:


    请确认粘贴的节点与图中一致:应该有两个 Handle Local Any Key Input 函数,且第一个的 Pressed? 勾选为 True,第二个为 False

  11. 最后,选中 Any Key 节点,确认 Execute when Paused 勾选为 True。

采用这种重设父类的方式后,你仍然可以在自己的 HUD 类里继续写游戏逻辑,不需要转移或修改资源包 HUD 类里的任何内容。


情形 C:继承自自定义类或 C++ 的 Game HUD

你看到的:有自定义 Game HUD,但右上角的 Parent Class 不是默认的 HUD(例如派生自插件、C++ 类,或本身就是 C++ 类)

这说明你的 Game HUD 派生自其它类或本身是 C++ 类,请按下面的情形 C 步骤操作。

情形 C 步骤

情形 C
你有自定义的 C++ Game HUD 类(或派生自自定义 C++ 的蓝图)

  1. 进入 EasyGameUI/Core 文件夹,打开 BP_EasyMainGameHUD 类
  2. 在这个 HUD 类里点击 Class Settings,打开细节面板

  3. 在 Class Options 分类下找到 Parent Class “HUD” 设置

  4. 点开下拉框,搜索你自己的 HUD 类名并选中

  5. 虚幻可能会弹出警告窗口,点击 Reparent 即可

  6. 然后,如果你自己的 HUD 类(不是 Easy Main Game HUD 类)里有 Any Key 节点,找到它,并复制它后面接的逻辑

  7. 回到 Easy Main Game HUD 类,找到 Any Key 节点,按你的需要把你复制的逻辑接在它后面


    如果复制的逻辑里包含宏节点,它们不会被正确复制,需要在 Easy Main Game HUD 类里重新实现

  8. 最后,记得在你的游戏模式里选中 BP_EasyMainGameHUD:可以在 Project Settings > Map & Modes 里改,也可以直接在 GameMode 类里改

注意

如果你有多个游戏模式或关卡覆盖了默认 GameMode 类,记得在这些覆盖里也设置 HUD Class!

采用这种重设父类的方式后,你仍然可以在自己的 HUD 类里继续写游戏逻辑,不需要转移或修改资源包 HUD 类里的任何内容。