[UE4][C++]在User Widget上绘制-----方法二

这种方法是直接使用C++调整贴图

1.新建C++类,继承UserWidget

下图是新建好的,取名CanvasUserWidget

2.修改CanvasUserWidget类

 CanvasUserWidget.h

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

#pragma once

#include "CoreMinimal.h"
#include "Blueprint/UserWidget.h"
#include "Components/Image.h"
#include "CanvasUserWidget.generated.h"

/**
 * 
 */
UCLASS()
class WATERWALL426_API UCanvasUserWidget : public UUserWidget
{
	GENERATED_BODY()
public:
	UCanvasUserWidget(const FObjectInitializer& ObjectInitializer);

	virtual void NativeConstruct()override;

	UFUNCTION(BlueprintCallable)
		void CreateTexture();
	UFUNCTION(BlueprintCallable)
		void Draw(FVector2D Pos);
private:
	//Iamge控件
	UImage* pImage;

	UPROPERTY(EditAnywhere)
	    UTexture2D* pTexture;
};

CanvasUserWidget.cpp

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


#include "CanvasUserWidget.h"



UCanvasUserWidget::UCanvasUserWidget(const FObjectInitializer& ObjectInitializer) :Super(ObjectInitializer)
{
	

}

void UCanvasUserWidget::NativeConstruct()
{
	Super::NativeConstruct();
}

void UCanvasUserWidget::CreateTexture()
{
	if (pTexture)return;
	//create 
	pTexture = UTexture2D::CreateTransient(1920, 1080);
	pTexture->UpdateResource();
	//set brush
	pImage = Cast<UImage>(GetWidgetFromName(FName(TEXT("Image_Canvas"))));
	pImage->SetBrushFromTexture(pTexture);
}

void UCanvasUserWidget::Draw(FVector2D Pos)
{
	if (!pTexture)return;

	FTexture2DMipMap& mipmap = pTexture->PlatformData->Mips[0];
	unsigned char* Data = (unsigned char*)mipmap.BulkData.Lock(LOCK_READ_WRITE);

	int texturex = pTexture->PlatformData->SizeX;
	int texturey = pTexture->PlatformData->SizeY;

	float bPerUV_v = 1.0 / texturey;
	for (int32 y = 0; y < texturey; y++)
	{
		for (int32 x = 0; x < texturex; x++)
		{
			if (x<= Pos.X + 4&&x>= Pos.X - 4&&y<= Pos.Y+4&& y >= Pos.Y - 4)
			{
				Data[(y * texturex + x) * 4 + 0] = 0;//B
				Data[(y * texturex + x) * 4 + 1] = 0;//G
				Data[(y * texturex + x) * 4 + 2] = 255;//R
				Data[(y * texturex + x) * 4 + 3] = 255;//A 0:全透明;255:全不透明
			}
		}
	}
	mipmap.BulkData.Unlock();
	pTexture->UpdateResource();
	//update
	pImage->SetBrushFromTexture(pTexture);
}

3.新建蓝图,选择CanvasUserWidget

 添加“画布画板”和“图像”控件,将图像命名为Image_Canvas

 添加函数

4.新建Pawn和GameMode 

     略(懒.....麻烦看前一篇) 

5.Pawn里添加函数

6.效果

猜你喜欢

转载自blog.csdn.net/qq_36251561/article/details/124006313