先在这里放一个链接防止第一次看的朋友们不知道我在讲什么:https://www.bilibili.com/video/BV1nU4y1X7iQ/
这一段的教程不难,唯一新建的C++类是UMG的一个类。这个类用来写绑定在ai身上的血条。
总结一下一共做了什么事情:
- 给ai写了一个血条ui
 - 重新整理了我们之前写的所有ui,放到了一个umg里头
 - 初识了控制台以及三个控制台命令(其中两个自己写的,一个系统自带我们在上面改的)
 
首先是我们的C++写的UMG
SWorldUserWidget.h
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "Blueprint/UserWidget.h"
#include "SWorldUserWidget.generated.h"
/**
 * 
 */
UCLASS()
class ACTIONROGUELIKE_API USWorldUserWidget : public UUserWidget
{
	GENERATED_BODY()
        //meta=(BindWidget)是一个C++绑定UMG的方法,输入了这个参数之后,我们声明的这个指针的名字ParentSizeBox要和编辑器内的SizeBox同名,不然会报错
protected:
	UPROPERTY(meta=(BindWidget))
	class USizeBox* ParentSizeBox;
		
    //这个函数是我们每tick都要调用的函数,也是我们重写的函数
	virtual void NativeTick(const FGeometry& MyGeometry, float InDeltaTime) override;
    //AttachedActor指的是我们的这个血条的主人是谁,吸附在谁身上
public:
	UPROPERTY(BlueprintReadOnly,Category="UI")
	AActor* AttachedActor;
};
 
SWorldUserWidget.cpp
// Fill out your copyright notice in the Description page of Project Settings.
#include "SWorldUserWidget.h"
#include "Kismet/GameplayStatics.h"
#include "Blueprint/WidgetLayoutLibrary.h"
#include "Components/SizeBox.h"
void USWorldUserWidget::NativeTick(const FGeometry& MyGeometry, float InDeltaTime)
{
	Super::NativeTick(MyGeometry,InDeltaTime);
    //如果血条已经存在,那么就直接返回
	if (!IsValid(AttachedActor))
	{
		RemoveFromParent();
		return;
	}
    //将世界内的3D坐标变成我们屏幕上的2D坐标进行显示
	FVector2D ScreenPosition;
	if (UGameplayStatics::ProjectWorldToScreen(GetOwningPlayer(), AttachedActor->GetActorLocation(), ScreenPosition))
	{
		float Scale = UWidgetLayoutLibrary::GetViewportScale(this);
		
        //匹配不同大小的屏幕
		ScreenPosition /= Scale;
		if (ParentSizeBox)
		{
            //设置sizebox的变换
			ParentSizeBox->SetRenderTranslation(ScreenPosition);
		}
	}
}
 
在SAICharacter类里面需要注意,我们会调用CreateWidget<>()函数来创建ui,但是记得在创建ui之后要调用AddToViewPort()来添加到我们的视口内。还有一点是,我们需要把所有关于UI的设置都放到AddToViewPort()函数调用之前,否则会出现蓝图的报错说相关参数为空的情况。
蓝图长这样

接着是ui整理的工作,我这里就不细讲了,教程教的很清楚,而且版本之间并没有什么不同的地方
最后是我们接触的控制台,也不是什么太大的问题,只不过是宏内的参数变化了而已,以前我们在UFUNCTION()的括号内填的都是蓝图可调用,默认读写啥的,如果需要把这个函数放在控制台内让我们调用,只需要在在括号内写Exec就行了,然后在相应的.cpp文件里面实现函数,最后在编辑器里面就可以调用我们所写的函数方法了。








![[计算机入门]了解键盘](https://img-blog.csdnimg.cn/e5decd004efc46b498f0bc4d9fbae40c.png)










