找回密码
 立即注册
查看: 344|回复: 0

[Unreal]Unreal UMG(C++)笔记

[复制链接]
发表于 2021-12-3 13:40 | 显示全部楼层 |阅读模式
断断续续学习Unreal很久了,但工作用的是Unity,Unreal很多API都记不住,就分类记录下。
    C++获取UMG组件有2种方式,目前知道的,一个是通过属性宏(BindWidget),另一个则类似Unity的Transform.Find(string name),Unreal用的是UWidget* GetWidgetFromName(const FName& Name) const
    .h:
  1. #include "CoreMinimal.h"
  2. #include "Blueprint/UserWidget.h"
  3. #include "Components/Button.h"
  4. #include "StartUserWidget.generated.h"
  5. /**
  6. *
  7. */
  8. UCLASS()
  9. class RPGPROJECT_API UStartUserWidget : public UUserWidget
  10. {
  11.         GENERATED_BODY()
  12.        
  13. public:
  14.         virtual bool Initialize() override;
  15.        
  16.         UFUNCTION()
  17.                 void OnStartBtnClick();
  18.         UFUNCTION()
  19.                 void OnQuitBtnClick();
  20. public:
  21.         UPROPERTY()
  22.                 UButton* StartBtn;
  23.         UPROPERTY(Meta = (BindWidget))
  24.                 UButton* QuitBtn;
  25. };
复制代码
   .cpp:
  1. #include "UI/StartUserWidget.h"
  2. #include "Runtime/Engine/Classes/Kismet/KismetSystemLibrary.h"
  3. bool UStartUserWidget::Initialize()
  4. {
  5.         if (!Super::Initialize())
  6.                 return false;
  7.         StartBtn = Cast<UButton>(GetWidgetFromName(TEXT("StartBtn")));
  8.         if (StartBtn != nullptr)
  9.                 StartBtn->OnClicked.AddDynamic(this, &UStartUserWidget::OnStartBtnClick);
  10.         if (QuitBtn != nullptr)
  11.                 QuitBtn->OnClicked.AddDynamic(this, &UStartUserWidget::OnQuitBtnClick);
  12.         return true;
  13. }
  14. void UStartUserWidget::OnStartBtnClick()
  15. {
  16.         UE_LOG(LogTemp, Error, TEXT("OnStartBtnClick"));
  17. }
  18. void UStartUserWidget::OnQuitBtnClick()
  19. {
  20.         UE_LOG(LogTemp, Error, TEXT("OnQuitBtnClick"));
  21.         // Quit game
  22.         UKismetSystemLibrary::QuitGame(GetWorld(), nullptr, EQuitPreference::Quit);
  23. }
复制代码
   自己也写了个UI管理的,本来想写个单例来着,不知道Unreal怎么写,就放在GameInstance中来管理,估计随着学习还会改:
  1. #include "GameInstance/MainGameInstance.h"
  2. #include "Runtime/Engine/Classes/Kismet/GameplayStatics.h"
  3. #include "UI/MessageUserWidget.h"
  4. void UMainGameInstance::Init()
  5. {
  6.         UGameInstance::Init();
  7.         FCoreUObjectDelegates::PreLoadMap.AddUObject(this, &UMainGameInstance::BeginLoadingScene);
  8.         FCoreUObjectDelegates::PostLoadMapWithWorld.AddUObject(this, &UMainGameInstance::EndLoadingScene);
  9.         InitializeUserWidgetMap();
  10.         InitializeSceneMap();
  11.         UserWidgetList.Reset();
  12. }
  13. void UMainGameInstance::BeginLoadingScene(const FString& Map)
  14. {
  15.         Release();
  16. }
  17. void UMainGameInstance::EndLoadingScene(UWorld* World)
  18. {
  19. }
  20. UUserWidget* UMainGameInstance::ShowWidget(int UserWidgetId, bool bIsAddToViewport)
  21. {
  22.         if (!UserWidgetMap.Contains(UserWidgetId))
  23.                 return nullptr;
  24.         UUserWidget* CurrentWidget = nullptr;
  25.         if(UserWidgetList.Contains(UserWidgetId))
  26.                 CurrentWidget = UserWidgetList[UserWidgetId];
  27.         else
  28.         {
  29.                 const TCHAR* UserWidgetClassName = UserWidgetMap[UserWidgetId];
  30.                 CurrentWidget = CreateWidget<UUserWidget>(this, LoadClass<UUserWidget>(this, UserWidgetClassName));
  31.         }
  32.         if (CurrentWidget != nullptr && bIsAddToViewport && !CurrentWidget->IsInViewport())
  33.                 CurrentWidget->AddToViewport();
  34.         if (CurrentWidget != nullptr && !UserWidgetList.Contains(UserWidgetId))
  35.                 UserWidgetList.Add(UserWidgetId, CurrentWidget);
  36.         return CurrentWidget;
  37. }
  38. void UMainGameInstance::RemoveWidget(int UserWidgetId)
  39. {
  40.         if (!UserWidgetList.Contains(UserWidgetId))
  41.                 return;
  42.         UUserWidget* TempUserWidget = UserWidgetList[UserWidgetId];
  43.         if(TempUserWidget != nullptr && TempUserWidget->IsInViewport())
  44.                 TempUserWidget->RemoveFromViewport();
  45. }
  46. void UMainGameInstance::ShowMessageView(FString Msg)
  47. {
  48.         UMessageUserWidget* MessageUserWidget = Cast<UMessageUserWidget>(ShowWidget((int)EUserWidget::MessageView));
  49.         if (MessageUserWidget != nullptr)
  50.                 MessageUserWidget->ShowMessage(Msg);
  51. }
  52. void UMainGameInstance::LoadScene(int SceneId)
  53. {
  54.         if (!SceneMap.Contains(SceneId))
  55.                 return;
  56.         UWorld* World = GetWorld();
  57.         if (World != nullptr)
  58.                 UGameplayStatics::OpenLevel(World, SceneMap[SceneId]);
  59.         else
  60.                 UE_LOG(LogTemp, Error, TEXT("World == nullptr"));
  61. }
  62. void UMainGameInstance::Release()
  63. {
  64.         if (UserWidgetList.Num() > 0)
  65.         {
  66.                 for (TMap<int, UUserWidget*>::TIterator it = UserWidgetList.CreateIterator(); it; ++it)
  67.                 {
  68.                         if (it->Value->IsInViewport())
  69.                                 it->Value->RemoveFromViewport();
  70.                 }
  71.         }
  72.         UserWidgetList.Reset();
  73. }
  74. void UMainGameInstance::InitializeUserWidgetMap()
  75. {
  76.         UserWidgetMap.Reset();
  77.         UserWidgetMap.Add((int)EUserWidget::StartView, TEXT("WidgetBlueprint'/Game/UI/StartView.StartView_C'"));//需要加上_C
  78.         UserWidgetMap.Add((int)EUserWidget::MainView, TEXT("WidgetBlueprint'/Game/UI/MainView.MainView_C'"));
  79.         UserWidgetMap.Add((int)EUserWidget::MessageView, TEXT("WidgetBlueprint'/Game/UI/MessageView.MessageView_C'"));
  80. }
  81. void UMainGameInstance::InitializeSceneMap()
  82. {
  83.         SceneMap.Reset();
  84.         SceneMap.Add((int)EScene::StartScene, TEXT("/Game/Scene/Start"));
  85.         SceneMap.Add((int)EScene::MainScene, TEXT("/Game/Scene/Main"));
  86. }
复制代码
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2025-5-15 04:55 , Processed in 0.131949 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表