查看: 330|回复: 8

[编程指南] 【5. 建立第二菜单 | Unreal Engine】

[复制链接]

1

主题

338

帖子

7万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
74666
发表于 2016-6-27 01:03:06 | 显示全部楼层 |阅读模式



上一步
下一步



   
使用UMG的用户接口


在 Content Browser(内容浏览器) 中,搜寻并打开我们之前创建的NewGameMenu资源。 这个菜单包含了一个资源文件名称条目 Text Box(文本框) ,只有在输入资源文件名称后才能通过按下 Button(按钮) 来游玩游戏,还有一个可供点击以返回主菜单的Button(按钮)。

如需创建资源文件名称条目框,我们可以拖曳Text Box(文本框)(而不是 Text Block(文本块) )到布局中。

【虚幻4翻译文档-5. 建立第二菜单 | Unreal Engine】[虚幻4中文文档]




Text Box(文本框)应使用以下值进行配置:

将名字改成NameTextEntry

位置是(325, 200)。 这样可以留出空间以把 Text Block(文本块) 放置于Text Box(文本框)的左侧。

资源文件大小是250x40。

字体资源文件大小(位于“风格”标题栏下)是20。

【虚幻4翻译文档-5. 建立第二菜单 | Unreal Engine】[虚幻4中文文档]




我们可以创建具有Text Block(文本块)标记的Play Game Button(玩游戏按钮),按照我们在上一菜单中创建Button(按钮)的相同方式进行标记。

对按钮来说:将资源文件名称变更为PlayGameButton, 位置 变更为200, 300,  资源文件大小 变更为200, 100

对于文本块来说: 变更资源文件名称为PlayGameText,设置 可见度 为Hit Test Visible,然后将其拖曳到PlayGameButton的顶部位置

Play Game(玩游戏)的Button(按钮)有一个特殊功能 - 它只有在输入Text Box(文本框)的资源文件名称为非空时,才会被启用。 我们可以使用 Unreal Motion Graphics'(虚幻运动图形) (UMG)的bind(绑定)功能来为"Is Enabled"域创建新函数(在 操作 部分下方)。

【虚幻4翻译文档-5. 建立第二菜单 | Unreal Engine】[虚幻4中文文档]





如果用于确定组成游戏中有效玩家资源文件名称的规则很复杂,或者,如果我们需要保存资源文件名称到C++变量中,我们可以在 Game Mode(游戏模式) 中显示 UFUNCTION ,或者在我们的项目中的某个位置将其作为静态函数来处理。 但是,因为我们只关心资源文件名称字符串是否为非空,我们可以直接在 Widget(控件) 中对其进行脚本处理。


为确保仅在Text Box(文本框)非空的情况下启用Button(按钮),我们可以转换来自于Text Box(文本框)的文本到字符串中,然后检查其长度是否大于0。 以下是整个逻辑:

【虚幻4翻译文档-5. 建立第二菜单 | Unreal Engine】[虚幻4中文文档]




让我们再添加一个Button(按钮),这样我们可以返回并从此处转到主菜单。 它就和主菜单的玩游戏的Button(按钮)一样,但它被放置于靠近右下角而不是左上角的位置。 为完成这个目标,对于Button(按钮),您可以点击 Details Panel(详细信息面板) 的 Anchors(菜单锚点) 下拉框,然后在弹出菜单中找到合适的图表内容。

将名字改成MainMenuButton

设置 位置 为 -400, -200。

设置 资源文件大小 为200x100。

【虚幻4翻译文档-5. 建立第二菜单 | Unreal Engine】[虚幻4中文文档]





把菜单锚点放置在右下角不会变更资源文件大小和位置值,因此我们需要让位置值为负值,从而使之出现在屏幕上。 资源文件大小值保持为正值。


现在我们会通过再次添加 OnClicked 事件来添加脚本到新建Buttons(按钮)中。 主菜单的Buttons(按钮)会直接载入主菜单的Widget(控件),而玩游戏的Buttons(按钮)会因为没有在对 ChangeMenuWidget 函数的调用中提供新的Widget(控件)而完全取消激活菜单。 这是通过显示的 Select Class"(选择类) 来展示出来的,而不是通过实际类或资源的资源文件名称来展示的。

【虚幻4翻译文档-5. 建立第二菜单 | Unreal Engine】[虚幻4中文文档]





在使用玩游戏Buttons(按钮)来取消激活菜单后,我们将无法继续在游戏中执行任何操作。 这个时候我们一般就载入第一个关卡,播放一下介绍性的过场动画、或者生成并放置 Pawn 。




Finished Code


HowTo_UMG.Build.cs

// Copyright 1998-2016 Epic Games, Inc. All Rights Reserved.using UnrealBuildTool;public class HowTo_UMG : ModuleRules{    public HowTo_UMG(TargetInfo Target)    {
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "UMG" });
//PrivateDependencyModuleNames.AddRange(new string[] {  });
// 如果您正在使用Slate UI则取消注释
PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore" });
// 如果您正在使用在线功能则取消注释
// PrivateDependencyModuleNames.Add("OnlineSubsystem");
// if ((Target.Platform == UnrealTargetPlatform.Win32) || (Target.Platform == UnrealTargetPlatform.Win64))
// {
//      if (UEBuildConfiguration.bCompileSteamOSS == true)
//      {
//
   DynamicallyLoadedModuleNames.Add("OnlineSubsystemSteam");
//      }
// }    }}
HowTo_UMGGameMode.h

// Copyright 1998-2016 Epic Games, Inc. All Rights Reserved.#pragma once#include "Blueprint/UserWidget.h"#include "GameFramework/GameMode.h"#include "HowTo_UMGGameMode.generated.h"/** *  */UCLASS()class HOWTO_UMG_API AHowTo_UMGGameMode : public AGameMode{    GENERATED_BODY()public:    /** 在游戏开始时调用。 */    virtual void BeginPlay() override;    /** 移除当前菜单控件并且如果可能,从指定类中创建新控件。 */    UFUNCTION(BlueprintCallable, Category = "UMG Game")    void ChangeMenuWidget(TSubclassOfUUserWidget NewWidgetClass);protected:    /** 在游戏开始时我们将作为菜单使用的控件类。 */    UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UMG Game")    TSubclassOfUUserWidget StartingWidgetClass;    /** 用作为菜单的控件实例。 */    UPROPERTY()    UUserWidget* CurrentWidget;};
HowTo_UMGGameMode.cpp

// Copyright 1998-2016 Epic Games, Inc. All Rights Reserved.#include "HowTo_UMG.h"#include "HowTo_UMGGameMode.h"void AHowTo_UMGGameMode::BeginPlay(){    Super::BeginPlay();    ChangeMenuWidget(StartingWidgetClass);}void AHowTo_UMGGameMode::ChangeMenuWidget(TSubclassOfUUserWidget NewWidgetClass){    if (CurrentWidget != nullptr)    {
CurrentWidget-RemoveFromViewport();
CurrentWidget = nullptr;    }    if (NewWidgetClass != nullptr)    {
CurrentWidget = CreateWidgetUUserWidget(GetWorld(), NewWidgetClass);
if (CurrentWidget != nullptr)
{
     CurrentWidget-AddToViewport();
}    }}


   
上一步
下一步



   
使用UMG的用户接口
回复

使用道具 举报

0

主题

913

帖子

3036

积分

vip会员

Rank: 1

积分
3036
发表于 2016-7-2 18:19:41 来自手机 | 显示全部楼层
这个必须顶,,,,
回复 支持 反对

使用道具 举报

0

主题

841

帖子

2788

积分

vip会员

Rank: 1

积分
2788
发表于 2016-7-3 18:27:51 来自手机 | 显示全部楼层
嗯,这个资源特别的好啊,赶紧下来收藏起来。
回复 支持 反对

使用道具 举报

0

主题

870

帖子

2868

积分

vip会员

Rank: 1

积分
2868
发表于 2016-7-4 10:18:41 | 显示全部楼层
等会儿下载看看
回复 支持 反对

使用道具 举报

0

主题

826

帖子

2721

积分

vip会员

Rank: 1

积分
2721
发表于 2016-7-6 10:43:25 | 显示全部楼层
恩,好资源~ 哈哈~
回复 支持 反对

使用道具 举报

0

主题

883

帖子

2889

积分

vip会员

Rank: 1

积分
2889
发表于 2016-7-7 17:21:47 | 显示全部楼层
看看效果,谢谢分享
回复 支持 反对

使用道具 举报

0

主题

823

帖子

2733

积分

vip会员

Rank: 1

积分
2733
发表于 2016-7-8 08:19:49 来自手机 | 显示全部楼层
最喜欢全套的了
回复 支持 反对

使用道具 举报

0

主题

846

帖子

2790

积分

vip会员

Rank: 1

积分
2790
发表于 2016-7-18 16:56:29 | 显示全部楼层
一下这么多新发的好东东,谢谢分享
回复 支持 反对

使用道具 举报

0

主题

874

帖子

2890

积分

vip会员

Rank: 1

积分
2890
发表于 2016-7-19 22:25:31 来自手机 | 显示全部楼层
一定要看看。。。。。。
回复 支持 反对

使用道具 举报

*滑块验证:
您需要登录后才可以回帖 登录 | enginedx注册

本版积分规则

 
 



邮件留言:


 
返回顶部