先在这里放一个链接防止第一次看的朋友们不知道我在讲什么:https://www.bilibili.com/video/BV1nU4y1X7iQ/

这一段的教程不难,唯一新建的C++类是UMG的一个类。这个类用来写绑定在ai身上的血条。

总结一下一共做了什么事情:

  1. 给ai写了一个血条ui
  2. 重新整理了我们之前写的所有ui,放到了一个umg里头
  3. 初识了控制台以及三个控制台命令(其中两个自己写的,一个系统自带我们在上面改的)

首先是我们的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文件里面实现函数,最后在编辑器里面就可以调用我们所写的函数方法了。

更多推荐