【UE5】C++ 关于CreateWidget函数的使用注意事项

在这里插入图片描述
在这里插入图片描述
这是UserWidget.h里关于CreateWidget函数的介绍

WidgetT* CreateWidget(OwnerType OwningObject, TSubclassOf<UUserWidget> UserWidgetClass = WidgetT::StaticClass(), FName WidgetName = NAME_None)
{
	static_assert(TIsDerivedFrom<WidgetT, UUserWidget>::IsDerived, "CreateWidget can only be used to create UserWidget instances. If creating a UWidget, use WidgetTree::ConstructWidget.");
	
	static_assert(TIsDerivedFrom<TPointedToType<OwnerType>, UWidget>::IsDerived
		|| TIsDerivedFrom<TPointedToType<OwnerType>, UWidgetTree>::IsDerived
		|| TIsDerivedFrom<TPointedToType<OwnerType>, APlayerController>::IsDerived
		|| TIsDerivedFrom<TPointedToType<OwnerType>, UGameInstance>::IsDerived
		|| TIsDerivedFrom<TPointedToType<OwnerType>, UObject>::IsDerived//自己加的
		|| TIsDerivedFrom<TPointedToType<OwnerType>, UClass>::IsDerived//自己加的,改了没用,不编译,必须用编码版UE。需要200G磁盘
		|| TIsDerivedFrom<TPointedToType<OwnerType>, UWorld>::IsDerived, "The given OwningObject is not of a supported type for use with CreateWidget.");
	
	
	SCOPE_CYCLE_COUNTER(STAT_CreateWidget);
	FScopeCycleCounterUObject WidgetObjectCycleCounter(UserWidgetClass, GET_STATID(STAT_CreateWidget));

	if (OwningObject)
	{
		return Cast<WidgetT>(UUserWidget::CreateWidgetInstance(*OwningObject, UserWidgetClass, WidgetName));
	}
	return nullptr;
}
	

自己加了两句,必须源码版才能编译,安装版的UE是不能在普通Actor、Charactor等类里使用这个函数的,只能在UWidget、UWidgetTree、APlayerController、UGameInstance、UWorld类里使用。所以如果想通过一个人物打开一个商店UserWidget,最好额外写一个PlayerController类,才能使用这个函数。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Unreal Engine 5 中,要通过像素流实现角色对话,需要使用 Widget 组件。具体步骤如下: 1. 创建一个 Widget 组件,用来显示对话框和角色的头像等信息。 2. 在该 Widget 组件中,添加一个 Text 组件,用来显示对话文本。 3. 在角色中,添加一个触发器(Trigger),当玩家接近该触发器时,触发对话事件。 4. 在对话事件中,创建一个 Widget 实例,并在其中设置对话文本和角色头像等信息。 5. 将 Widget 实例添加到视口中,让玩家可以看到对话框。 6. 当玩家完成对话后,移除该 Widget 实例。 以下是一个示例代码: ```cpp // 在角色头文件中定义触发器 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Trigger") class UBoxComponent* Trigger; // 在角色实现文件中添加触发器绑定和对话事件 AYourCharacter::AYourCharacter() { Trigger = CreateDefaultSubobject<UBoxComponent>(TEXT("Trigger")); Trigger->SetupAttachment(RootComponent); Trigger->OnComponentBeginOverlap.AddDynamic(this, &AYourCharacter::OnTriggerEnter); } void AYourCharacter::OnTriggerEnter(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult) { // 玩家接近触发器,显示对话框 ShowDialog(); } void AYourCharacter::ShowDialog() { // 创建对话框 Widget 实例 UYourDialogWidget* DialogWidget = CreateWidget<UYourDialogWidget>(GetWorld(), YourDialogWidgetClass); // 设置对话框信息 DialogWidget->SetDialogText(FText::FromString("Hello!")); // 将 Widget 添加到视口中 DialogWidget->AddToViewport(); // 禁用玩家移动 APlayerController* PlayerController = GetWorld()->GetFirstPlayerController(); if (PlayerController) { PlayerController->SetInputMode(FInputModeUIOnly()); PlayerController->bShowMouseCursor = true; } } // 在 Widget 中实现 SetDialogText 函数,用于设置对话文本 void UYourDialogWidget::SetDialogText(const FText& Text) { DialogText->SetText(Text); } ``` 注意,以上代码仅供参考,具体实现方式可能因项目不同而异。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值