先在这里放一个链接防止第一次看的朋友们不知道我在讲什么: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文件里面实现函数,最后在编辑器里面就可以调用我们所写的函数方法了。