ue4-HUD绘制UI(C++)
HUD绘制UI,其他绘制相关的接口看源码就可以使用了
创建继承自AHUD的c++类-AMyHUD,构造函数中加载一些资源
MyHUD.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28UCLASS()
class MYQWE_API AMyHUD : public AHUD
{
GENERATED_UCLASS_BODY()
public:
virtual void DrawHUD() override; //重写父类的绘制函数
void DrawMyIcons(); //绘制图片
void DrawMyItems(); //绘制文字
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "MyHUD")
UTexture2D* mTexture2d;
float mScaleFactor;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "MyHUD")
FCanvasIcon mIcons1;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "MyHUD")
FCanvasIcon mIcons2;
UTexture2D* mTextureArrowDown;
UTexture2D* mTextureArrowLeft;
FCanvasIcon mAllIcons[2];
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "MyHUD")
UFont* mFont;
};MyHUD.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
AMyHUD::AMyHUD(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer)
{
//加载资源方式1
FStreamableManager* stream = new FStreamableManager();
FStringAssetReference ref(TEXT("/Game/UI/bb"));
mTexture2d = Cast<UTexture2D>(stream->SynchronousLoad(ref));
//加载资源方式2
static ConstructorHelpers::FObjectFinder<UTexture2D> TextureArrowDownOb(TEXT("/Game/UI/Arrow_Down_1"));
static ConstructorHelpers::FObjectFinder<UTexture2D> TextureArrowLeftOb(TEXT("/Game/UI/Arrow_Left_2"));
mTextureArrowDown = TextureArrowDownOb.Object;
mTextureArrowLeft = TextureArrowLeftOb.Object;
//四个float理解为Rect即可,只不过表示的是贴图中的uv坐标,而不是坐标系中xy坐标
//以像素为单位,而不是uv中的范围0-1
mAllIcons[0] = UCanvas::MakeIcon(mTextureArrowDown, 0, 0, 60, 60);
mAllIcons[1] = UCanvas::MakeIcon(mTextureArrowLeft, 0, 0, 60, 60);
mIcons1 = mAllIcons[0];
mIcons2 = mAllIcons[1];
//加载字体
static ConstructorHelpers::FObjectFinder<UFont> FontOb(TEXT("/Game/UI/Roboto51"));
mFont = FontOb.Object;
}
void AMyHUD::DrawHUD()
{
Super::DrawHUD();
if (!Canvas)
return;
mScaleFactor = Canvas->ClipY / 1080.0f;
DrawMyIcons();
DrawMyItems();
Canvas->DrawText(mFont, FString(TEXT("--- DrawText")), 150.f, 150.f);
}
void AMyHUD::DrawMyIcons()
{
const float StartX = Canvas->ClipX / 2.0f;
const float StartY = Canvas->ClipY / 2.0f;
for (size_t i = 0; i < 2; i++)
{
//使用Canvas绘制icon
Canvas->DrawIcon(mAllIcons[i], StartX + 100 * i, StartY + 100 * i, mScaleFactor);
}
}
void AMyHUD::DrawMyItems()
{
FCanvasTextItem textItem = FCanvasTextItem(FVector2D::ZeroVector, FText::GetEmpty(), mFont, FLinearColor::Red);
textItem.Text = FText::FromString(TEXT("--- TextItem String!"));
Canvas->DrawItem(textItem, 300.f, 300.f);
}
资源路径
构造中加载直接就可以在编辑器中看到