Unreal Engine 4 C++ Component介绍——WidgetComponent

Unreal Engine 4 C++ Component介绍——WidgetComponent

好记性不如烂笔头啊,还是记录一下!


WidgetComponent简介

WidgetComponent是用来渲染UI的一种组件,可以被添加到ActorPawnCharacter上。在游戏中可以用来显示角色的头顶信息以及游戏场景中的公告板。

WidgetComponent可以渲染下列类型:

  • UMG的控件蓝图
  • 继承UUserWidget的控件
  • 继承SWidget的Slate控件

添加UMG依赖

首先,在你的工程中找到工程文件,找到以下行并添加UMG:

  • .Build.cs
PublicDependencyModuleNames.AddRange(
    new string[] {
        "Core",
        "CoreUObject",
        "Engine",
        "InputCore",
        "UMG"
    }
);

并取消以下行的注释:

// Uncomment if you are using Slate UI
PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore" });

修改后的完整文件如下:

// Fill out your copyright notice in the Description page of Project Settings.

using UnrealBuildTool;

public class YourProject : ModuleRules
{
    public YourProject(TargetInfo Target)
    {
        PublicDependencyModuleNames.AddRange(new string[] { 
            "Core", 
            "CoreUObject", 
            "Engine", 
            "InputCore", 
            "UMG"
            }
        );

        PrivateDependencyModuleNames.AddRange(new string[] {  });

        // Uncomment if you are using Slate UI
        PrivateDependencyModuleNames.AddRange(new string[] { 
            "Slate", 
            "SlateCore" 
            }
        );

        // Uncomment if you are using online features
        // PrivateDependencyModuleNames.Add("OnlineSubsystem");

        // To include OnlineSubsystemSteam, add it to the plugins section in your uproject file with the Enabled attribute set to true
    }
}

UMG控件蓝图

1 创建控件蓝图

在工程中任意创建一个控件蓝图:

界面控件

接着在控件中的CanvasPanel中创建一个ProgressBar

ProgressBar

任意调整下细节设置,我的细节设置如下:

细节设置

一个蓝图控件就创建完成了,我们将控件命名为HpBar

2 添加到WidgetComponent

往任意Actor上添加一个新的WidgetComponent:

添加WidgetComponent

设置WidgetComponent如下图所示:

设置WidgetComponent

这里也有几个参数要讲一下:

  • Space 有两种方式WorldScreen

    World方式是绘制在场景中,会被物体遮挡,相当于一个场景的公告板。
    Screen方式是绘制在屏幕上,不会被物体遮挡,并且一直面向摄像机。

  • Widget Class 就是选择你要渲染的控件,选择刚才你创建的空间蓝图。

  • Draw Size 就是你要绘制的尺寸,根据你的需要调整。

调整完后我们来测试一下,就会发现控件已经正常显示了:

示例图片


UUserWidget的UMG控件

此方式需要使用C++

在你的Actor类中添加该属性

  • YourActor.h
// WidgetComponent
UPROPERTY(EditAnywhere, Category = WidgetComponent)
class UWidgetComponent* WidgetComponent;
  • YourActor.cpp
YourActor::YourActor(const FObjectInitializer& ObjectInitializer)
    : Super(ObjectInitializer)
{

    // ....你的代码

    // 初始化WidgetComponent
    WidgetComponent = CreateDefaultSubobject<UWidgetComponent>(TEXT("WidgetComponent"));
    WidgetComponent->AttachToComponent(RootComponent, FAttachmentTransformRules::KeepRelativeTransform);

    // 设置控件蓝图
    UClass* Widget = LoadClass<UUserWidget>(NULL, TEXT("WidgetBlueprint'/Game/UI/widget/HpBar.HpBar_C'"));
    WidgetComponent->SetWidgetClass(Widget);

    // 设置User Widget
    WidgetComponent->SetWidgetClass(MyUserWidget::StaticClass());
}

这里值得注意的是SetWidgetClass这个方法。

  • 如果你需要加载的是控件蓝图

    就要像实例中使用LoadClass模板函数,加载Class后进行设置。

// 设置控件蓝图
UClass* Widget = LoadClass<UUserWidget>(NULL, TEXT("WidgetBlueprint'/Game/UI/widget/HpBar.HpBar_C'"));
WidgetComponent->SetWidgetClass(Widget);
  • 如果你需要加载的是一个继承自UUserWidget的C++类

    你可以像下面这样直接设置:

// 设置User Widget
WidgetComponent->SetWidgetClass(MyUserWidget::StaticClass());

SWidget的Slate控件

此方式需要使用C++

在你的Actor类中添加该属性,这里我用SProgressBar举例,原理相同,换成你想要的继承自SWidgetSlate控件就可以了,重写Slate

  • YourActor.h
// 在初始化完组件之后调用
virtual void PostInitializeComponents() override;

// Slate Widget
TSharedPtr<class SProgressBar> CurrentSlateWidget;
  • YourActor.cpp
void AMyCharacter::PostInitializeComponents()
{
    CurrentSlateWidget = SNew(SProgressBar);

    if ( CurrentSlateWidget.IsValid() )
    {
        WidgetComponent->SetSlateWidget(CurrentSlateWidget);
        // WidgetComponent->SetWidgetSpace(EWidgetSpace::Screen);
    }
}

这里有个大坑,可能是WidgetComponent设计漏洞,只要用Slate Widget,就不能使用屏幕绘制模式(EWidgetSpace::Screen),使用就会崩溃。

如果用Slate制作的血条不能朝向摄像机,那真是太蛋疼了。
最后,我选择了旋转WidgetComponent的方式来解决这个问题。


扩展WidgetComponent

创建一个新类继承自WidgetComponent的新组建,取名为MyWidgetComponent

  • MyWidgetComponent.h
// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "Components/WidgetComponent.h"
#include "MyWidgetComponent.generated.h"

/**
 * 
 */
UCLASS(Blueprintable, ClassGroup="UserInterface", hidecategories=(Object,Activation,"Components|Activation",Sockets,Base,Lighting,LOD,Mesh), editinlinenew, meta=(BlueprintSpawnableComponent) )
class TESTMOBILE_API UMyWidgetComponent : public UWidgetComponent
{
    GENERATED_BODY()

public:
    // 设置该角色属性的默认值
    UMyWidgetComponent(const FObjectInitializer& ObjectInitializer = FObjectInitializer::Get());

    virtual void TickComponent(float DeltaTime, enum ELevelTick TickType, FActorComponentTickFunction *ThisTickFunction) override;

protected:

    /** Should we Toward Camera */
    UPROPERTY(EditAnywhere, Category=UserInterface)
    bool bTowardCamera;
};

在类体重增加了一个是否朝向摄像机的属性,然后重写父类的TickComponent方法,实现如下:

  • MyWidgetComponent.h
// Fill out your copyright notice in the Description page of Project Settings.

#include "Kismet/GameplayStatics.h"
#include "MyWidgetComponent.h"


// 设置默认属性
UMyWidgetComponent::UMyWidgetComponent(const FObjectInitializer& ObjectInitializer /*= FObjectInitializer::Get()*/)
    : Super(ObjectInitializer)
    , bTowardCamera(true)
{
}


// Tick函数
void UMyWidgetComponent::TickComponent(float DeltaTime, enum ELevelTick TickType, FActorComponentTickFunction *ThisTickFunction)
{
    Super::TickComponent(DeltaTime, TickType, ThisTickFunction);

    if (Space != EWidgetSpace::Screen  && bTowardCamera)
    {

        FRotator WidgetComponentRotator = GetComponentRotation();
        FRotator CameraRotator = UGameplayStatics::GetPlayerCameraManager(this, 0)->GetCameraRotation();

        this->SetWorldRotation(FRotator(-CameraRotator.Pitch, CameraRotator.Yaw+180, WidgetComponentRotator.Roll));

    }
}

TickComponent方法中,获取了当前摄像机的旋转信息,并根据旋转信息,并给MyWidgetComponent了一个朝向摄像机的旋转。

示例图片

现在,你的Slate控件可以朝向摄像机了。

关于方法传入的Pitch-Yaw—Roll可以参考Unreal Engine 4 C++ Camera Pitch Yaw Roll 直观理解
关于头顶血条的详细方法可以参考Unreal Engine 4 C++ UMG血条及头顶信息

搞定,这样就可以让Slate控件朝向摄像机。

  • 13
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 学习使用虚幻引擎4构建游戏的方式是通过实践编写游戏来学习C语言。虚幻引擎4是一种强大的游戏开发工具,提供了丰富的功能和工具,方便开发者进行游戏开发。 通过使用虚幻引擎4作为学习工具,学生可以将编写代码与实际游戏开发结合起来,加深对C语言的理解。从创建游戏场景、添加角色和物体、设计游戏逻辑等方面进行实际编码,可以使学生更好地理解编程概念和语法。 使用虚幻引擎4进行游戏开发还可以激发学生的创造力和想象力。学生可以利用引擎中丰富的资源库,包括各种角色、场景和音效,来创建自己的游戏世界。他们可以设计自己的游戏规则和关卡,实现自己的游戏想法。 此外,通过构建游戏,学生还可以学习到游戏开发的整个流程,包括项目管理、协作和测试等方面。他们将面临各种开发挑战,并学会解决问题和调试代码。 总之,通过使用虚幻引擎4构建游戏来学习C语言,学生不仅能够掌握编程技巧,还能在创意和设计方面得到锻炼。这种学习方式不仅能够提高学生的编程能力,还能激发他们对游戏开发的兴趣,并为未来进一步深入学习游戏开发打下坚实的基础。 ### 回答2: 《通过使用虚幻引擎4构建游戏学习C语言》是一本教你如何通过使用虚幻引擎4来构建游戏并学习C语言的书籍。这个教程从基础知识开始,向读者介绍C语言的基本概念、语法和编程原则。通过学习这本书,读者可以了解如何使用C语言来开发虚幻引擎4中的游戏。 这本书以构建游戏作为学习C语言的主题是非常巧妙的。通过实际动手的方式,读者可以将理论知识应用到实践中,加深对C语言的理解和掌握。而虚幻引擎4作为一款流行的游戏开发引擎,具有强大的功能和广泛的应用,将帮助读者更好地理解C语言在游戏开发中的应用。 本书的内容涵盖了虚幻引擎4的基本概念和工具,包括游戏世界的创建、角色控制、动画效果、碰撞检测等。读者将学习如何使用C语言编写代码来实现这些功能,并通过实际示例进行实践。通过阅读和完成书中的练习,读者将逐步提高他们的编程技能,并对游戏开发有更深入的了解。 这本书还适合那些有一定编程基础但想扩展他们的技能并进一步了解游戏开发的读者。通过结合C语言和虚幻引擎4,读者将能够学习到如何开发高质量和功能强大的游戏。同时,本书也提供了许多实用的技巧和建议,帮助读者解决在游戏开发过程中可能遇到的问题。 总之,通过使用虚幻引擎4构建游戏来学习C语言是一种创新和有趣的方式。这本书不仅能够帮助读者系统地学习C语言的知识,还能让他们在实践中提高自己的编程技能。无论是对于初学者还是有经验的开发者来说,这本书都是一个值得推荐的资源。 ### 回答3: 通过使用虚幻引擎4构建游戏学习C语言 《通过使用虚幻引擎4构建游戏学习C语言》是一本教程式书籍,旨在帮助读者通过动手实践游戏开发来学习C语言。本书借助强大的虚幻引擎4提供的开发环境,让读者能够充分了解和掌握C语言的相关知识。 通过构建游戏来学习C语言具有多重优势。首先,游戏开发是一个非常具有趣味性的项目。与枯燥的理论学习相比,通过动手实践游戏开发,读者可以更好地专注于学习过程,更易于融会贯通。其次,虚幻引擎4是一款广泛应用于游戏开发的强大软件,它提供了丰富的功能和工具,帮助读者更好地理解和应用C语言。 在这本书中,读者将逐步了解C语言的基础知识,并学习如何在虚幻引擎4中应用这些知识来构建游戏。书中通过一系列的实例和案例,引导读者学习如何使用C语言编写游戏逻辑和脚本,如何创建人物角色、场景和动画等。读者将掌握如何使用虚幻引擎4的资源管理系统、物理引擎和图形渲染技术等关键功能,以及如何在游戏中实现交互、音效和视觉效果。 通过学习C语言,读者将能够理解计算机编程的基本原理和概念,并掌握一种常用的编程语言。而通过结合虚幻引擎4的游戏开发,读者将更深入地了解游戏设计和开发的流程,同时也可以提升自己在游戏开发领域的技能和竞争力。 总而言之,《通过使用虚幻引擎4构建游戏学习C语言》是一本既有趣又实用的教材,它为想要学习C语言并对游戏开发感兴趣的读者提供了一个很好的机会和平台。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值