查看: 440|回复: 11

[编程指南] 【3. 创建菜单控件蓝图 | Unreal Engine】

[复制链接]

1

主题

273

帖子

7万

积分

管理员

Rank: 9Rank: 9Rank: 9

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



上一步
下一步



   
编程指南主页


在 Unreal Editor(虚幻编辑器) 中,我们可以按下 Compile(编译) 按钮来编译新代码。 这样我们就可以把 User Widgets(用户控件) 来作为菜单使用。

CompileFromEditor.jpg




现在我们创建了 User Widgets(用户控件) 以供 Game Mode(游戏模式) 作为菜单使用。 这是使用 Content Browser(内容浏览器) 中的"Add New"(添加新控件)按钮来完成的。  您可以在 User Interface(用户接口) 分类下找到 Widget Blueprint(控件蓝图) 类。 我们需要创建两个这样的类,一个资源文件名称为"MainMenu",一个资源文件名称为"NewGameMenu"。 我们的游戏开始于主菜单,而且可以通过一个选项进入New Game Menu(新游戏菜单)。

CreateWidgetBP.jpg




双击我们刚创建的"MainMenu" Widget(控件) ,进入 Blueprint Designer ,我们可以在其中创建菜单布局。

让我们从 Palette Panel(Palette面板) 的"Common"(通用)部分拖曳 Button(按钮) 到 Graph(图表) 中。 这个 Button(按钮) 最终会被用于打开New Game Menu(新游戏菜单)。

AddButtonAndTextBlock.jpg




为了让布局看起来正常,第一步是调整 Button(按钮) 的位置和资源文件大小。 我们应进行如下变更:

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

设置位置为(200, 100)。

将其重命名为"NewGameButton",从而让我们在稍后绑定功能到其上时能更为方便。

ButtonDetails.jpg




由于我们没有对 Button(按钮) 描画自定义图像,我们可以通过拖曳 Text Block(文本块) 到其上来进行标记,并进行如下变更:

设置文本为"New Game(新建游戏)"。

变更可见度为Hit Test Invisible。 这样设置可以防止 Text Block(文本块) 中断用于下方的 Button(按钮) 的鼠标点击。

将资源文件名称设置为"NewGameText"。 这不是必需的操作,但这是一个命名的好习惯。

TextBlockDetails.jpg




接下来,我们要使用第二个 Button(按钮) 和 Text Block(文本块) 来制作"Quit"(退出)的功能。 我们按照设置 "New Game" Button(按钮) 和 Text Block(文本块) 的相同方法来进行同样的设置。

在此之后,我们可以添加 Events(事件) 到 Buttons(按钮) 中,这样在我们按下 Buttons(按钮) 时,我们可以运行代码。 我们可以通过找到并按下 Details Panel(详细信息面板) 中的恰当的 Event(事件) 资源文件名称旁的"+"来完成。 本例中,"OnClicked"是唯一可用的 Event(事件) 。 对NewGameButton和QuitButton Widgets(控件) 均创建此事件。

CreateOnClickedEvent.jpg





设计师可以使用此处的 Blueprint(蓝图) 脚本来编译功能,C++程序员也可以连接调用了显示函数的节点。


对资源文件名称为"OnClicked(NewGameButton)"的 Event(事件) ,我们想要进行如下操作:

连接 ChangeMenuWidget 节点以使用我们之前添加到 Game Mode(游戏模式) 的函数。

设置 ChangeMenuWidget  节点的New Widget Class(新控件类)域到"NewGameMenu"资源。

OnClicked_NewGame.jpg




对资源文件名称为"OnClicked(QuitButton)"的 Event(事件) ,我们想要进行如下操作:

连接"Quit Game"(退出游戏)节点。

OnClicked_Quit.jpg





在编译了主菜单后,我们可以设置 Game Mode(游戏模式) 资源,它会在关卡开始时进行载入。


完成的代码


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();
}    }}


   
上一步
下一步



   
编程指南主页
回复

使用道具 举报

0

主题

802

帖子

2609

积分

vip会员

Rank: 1

积分
2609
发表于 2016-7-2 18:19:41 来自手机 | 显示全部楼层
一下这么多新发的好东东,谢谢分享
回复 支持 反对

使用道具 举报

0

主题

847

帖子

2852

积分

vip会员

Rank: 1

积分
2852
发表于 2016-7-3 18:27:42 | 显示全部楼层
恩,好资源~ 哈哈~
回复 支持 反对

使用道具 举报

0

主题

813

帖子

2681

积分

vip会员

Rank: 1

积分
2681
发表于 2016-7-4 10:16:55 | 显示全部楼层
看看!便宜就好了
回复 支持 反对

使用道具 举报

0

主题

861

帖子

2903

积分

vip会员

Rank: 1

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

使用道具 举报

0

主题

888

帖子

2927

积分

vip会员

Rank: 1

积分
2927
发表于 2016-7-7 23:14:27 来自手机 | 显示全部楼层
合集看着不错。
回复 支持 反对

使用道具 举报

0

主题

848

帖子

2818

积分

vip会员

Rank: 1

积分
2818
发表于 2016-7-8 08:19:49 来自手机 | 显示全部楼层
这个屌,看看要多少金
回复 支持 反对

使用道具 举报

0

主题

834

帖子

2702

积分

vip会员

Rank: 1

积分
2702
发表于 2016-7-15 01:36:47 来自手机 | 显示全部楼层
看一下你发的到底是什么鬼!
回复 支持 反对

使用道具 举报

0

主题

848

帖子

2760

积分

vip会员

Rank: 1

积分
2760
发表于 2016-7-15 02:48:28 | 显示全部楼层
这个样子会打消我们的积极性的
回复 支持 反对

使用道具 举报

0

主题

820

帖子

2660

积分

vip会员

Rank: 1

积分
2660
发表于 2016-7-15 09:17:13 | 显示全部楼层
不错哦  下载看一下啊
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | enginedx注册

本版积分规则

 
 



邮件留言:


 
返回顶部