日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

UE4笔记-UMG和Slate记录

發(fā)布時(shí)間:2023/12/29 综合教程 28 生活家
生活随笔 收集整理的這篇文章主要介紹了 UE4笔记-UMG和Slate记录 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

個(gè)人開發(fā)記錄筆記,隨緣更新

UMG和Slate都屬于UE4的UI系統(tǒng)的一部分:

整套布局系統(tǒng)是很標(biāo)準(zhǔn)的C/S方式(Qt/WinForm)

UMG是基于原先的Slate封裝開發(fā)的GUI.UE4提供了可視化編輯器用于用戶編輯自己GUI系統(tǒng)同時(shí)UMG組件還添加了很多事件和方法并支持BP

Slate則是完全C++代碼化的,所有的布局和組件創(chuàng)建只能用C++實(shí)現(xiàn)(Slate有一些更底層的組件,如SSplitter等,更便于開發(fā)復(fù)雜UI).

這篇隨筆用于記錄一些文檔以外一些UMG和Slate的一些問題和混用例子(UPanelWidget和UContentWidget)

Umg文檔:http://api.unrealengine.com/INT/Engine/UMG/index.html

Slate文檔:http://api.unrealengine.com/INT/Programming/Slate/index.html

其他一些文章Mark:

[UE4]Slate and Native UMG(C++) Notes:https://dawnarc.com/2018/12/ue4slate-and-native-umgc-notes/

Q.生命周期:

  UMG是居于UOBJECT的而Slate卻是居于TSharedFromThis,所以UMG可以暴露于BP,而Slate只能應(yīng)用于C++,而且聲明周期也不盡相同:

    wait

  Umg:

  Slate:

    (懶癌附體,康心情補(bǔ)充)

Q.創(chuàng)建細(xì)節(jié):

Umg:

 關(guān)于創(chuàng)建對象:

  因?yàn)閁MG大多數(shù)都是BP類,所以當(dāng)需要在C++創(chuàng)建時(shí),需要通過TSubclassOf將BP類傳回C++或使用LoadClass引用BP類:

  note:

    1.通常創(chuàng)建使用CreateWidget 函數(shù),但是,如果想創(chuàng)建非UserWidget的類,如,UButton 等UContentWidget或UPanelWidget,可以用Construct Object from class函數(shù)來創(chuàng)建.免去無意義UUserWidget 封裝

  C++創(chuàng)建BP類Widget的栗子:

UUserWidget* AMyProject2Character::CreateBPUserWidget(TSubclassOf<UUserWidget> SpecificBPClass)
{

    UUserWidget *newUserWidget = nullptr;
    UClass *SpecificBPClassFromCPlusPlus = LoadClass<UUserWidget>(NULL, TEXT("/Game/Blueprints/BPBaseWgt.BPBaseWgt_C"));
    if (SpecificBPClassFromCPlusPlus)
    {
      newUserWidget = CreateWidget<UUserWidget>(UGameplayStatics::GetPlayerController(GetWorld(), 0), SpecificBPClassFromCPlusPlus);
      check(newUserWidget)
    }

    return newUserWidget;

}

  

關(guān)于UMG的C++與BP的混合使用:

  通常都會(huì)定義一個(gè)C++的UUserWidget類來作為BP UMG的基類,以暴露一些BP變量到C++中,

  一般不熟悉的情況下,會(huì)在BP中的PreConstruct 或Construct 事件下手動(dòng)賦值到C++定義的變量上。

  事實(shí)上,可以選擇使用UPROPERTY的Meta宏進(jìn)行自動(dòng)綁定

  如:綁定Editor編輯器定義的UMG的控件控件和動(dòng)畫類到C++基類的變量上

    UPROPERTY(BlueprintReadOnly, Category = "MainWidget", Meta = (BindWidget))
        UHorizontalBox *Container = nullptr;

    UPROPERTY(BlueprintReadOnly, Category = "MainWidget", Meta = (BindWidgetAnim))
        class UWidgetAnimation* Anim_Container = nullptr;

  當(dāng)UMG繼承了該基類,UE4會(huì)自動(dòng)跟BP中名為Container 的容器和Anim_Container的動(dòng)畫 綁定

Slate的創(chuàng)建:

Slate在C++中則是使用類似如下的方式創(chuàng)建:

TSharedPtr<SMySlateWidget> slateWidget = SNew(SMySlateWidget);

TSharedPtr<SMySlateWidget> MySlateWidget;
TSharedRef<SSplitter> MyWgtRef = SAssignNew( MySlateWidget, SMySlateWidget);

貼出SMySlateWidget實(shí)現(xiàn):

.h

#pragma once
#include "CoreMinimal.h"
#include "SUserWidget.h"
class MYPROJECT2_API SMySlateWidget : public SUserWidget
{

public:
    SLATE_USER_ARGS(SMySlateWidget)
    {}
    SLATE_END_ARGS()

public:
    virtual void Construct(const FArguments& InArgs);
protected:
    FSlateBrush brush;
};

.cpp

#include "SMySlateWidget.h"
#include "Slate.h"
#include "SConstraintCanvas.h"

void SMySlateWidget::Construct(const FArguments& InArgs)
{
    TSharedRef<SBorder> border = SNew(SBorder);
    border->SetBorderBackgroundColor(FLinearColor::Red);
    border->SetForegroundColor(FLinearColor(0, 255, 0, 0.5));
    border->SetBorderImage(&brush);
    border->SetColorAndOpacity(FLinearColor::Green);

    SConstraintCanvas::FSlot &temp_slot = SConstraintCanvas::Slot();
    temp_slot.Anchors(FAnchors(0.0f, 0.0f, 1.0f, 1.0f))
        .Offset(FMargin(100.0f, 100.0f, 100.0f, 100.0f))
        .ZOrder(1)
        .AttachWidget(border);
    SUserWidget::Construct(
                            SUserWidget::FArguments()
                            [
                                SNew(SConstraintCanvas) + temp_slot
                            ] 
                          );
}

TSharedRef<SMySlateWidget> SMySlateWidget::New()
{
    return MakeShareable(new SMySlateWidget());
}

Q.在Slate中使用UMG組件:

  方法一:

    使用TakeWidget();函數(shù)轉(zhuǎn)換成Slate即可

//temporary_wgt 是你的UUserWIdget類實(shí)例
    TSharedRef<SWidget> border = temporary_wgt->TakeWidget();

例如在RebuildWidget中:

TSharedRef<SWidget> UCppWgt_BaseSplitter::RebuildWidget()
{

  //temporary_wgt 是你的UUserWIdget類實(shí)例,自行Create Widget
  TSharedRef<SWidget> border = temporary_wgt->TakeWidget();

  SConstraintCanvas::FSlot &temp_slot = SConstraintCanvas::Slot();
    temp_slot.Anchors(FAnchors(0.0f, 0.0f, 1.0f, 1.0f))
        .Offset(FMargin(100.0f, 100.0f, 100.0f, 100.0f))
        .ZOrder(1)
        .AttachWidget(container);

    auto ret_wgt = SNew(SConstraintCanvas) + temp_slot;
    return  ret_wgt;
}

Q.混合使用:

方法一(覆蓋形式):

如果想在UMG添加一個(gè)Slate的組件,那么你可以用UWidget子類簡單封裝一下,重載RebuildWidget,使用Slate的Widget來完全覆蓋代替

這里就用上面創(chuàng)建的Slate:SMySlateWidget

例子:

.h

UCLASS()
class 項(xiàng)目_API UContenSlateWidget : public UUserWidget { GENERATED_BODY() public :
virtual const FText GetPaletteCategory() override; protected: virtual TSharedRef<SWidget> RebuildWidget() override; };

.cpp

const FText UContenSlateWidget::GetPaletteCategory()
{
    return NSLOCTEXT("UContenSlatetWidget","MyCustomSlate", "CustomSlate");
}

TSharedRef<SWidget> UContenSlateWidget::RebuildWidget() 
{
    TSharedRef<SMySlateWidget> mySlateCom = SNew(SMySlateWidget);
    
    return mySlateCom;
}

方法二:

重寫RebuildWidget是混用最簡單的方式,但是卻無法在UMG編輯器里二次編輯擴(kuò)展UMG類.
那么如果有相關(guān)需求,這個(gè)時(shí)候可以考慮TakeDerivedWidget函數(shù)來代替
重寫RebuildWidget的方式

栗子:
待添加

Q.UPanelWidget和UContentWidget分析和栗子:

UPanelWidget和UContentWidget都是Slate對UMG暴露的封裝基礎(chǔ)實(shí)現(xiàn)類.

如UE4自帶的UI組件:Border,Canvas,VerticalBox,SButton等都是基于以上兩個(gè)類繼承實(shí)現(xiàn)的

當(dāng)你需要封裝一些自定義組件的時(shí)候,可以繼承它們或它們的子類

note:UContentWidget是UPanelWidget的子類,基于UPanelWidget重新封裝實(shí)現(xiàn)的.

區(qū)別是:

  UPanelWidget是多個(gè)Slot的組件:例如VerticalBox

  UContentWidget是單個(gè)Slot的組件:例如Border,Button

源碼分析:

  UPanelWidget:

    wait(懶癌附體,康心情補(bǔ)充)

  UContentWidget:

    wait(懶癌附體,康心情補(bǔ)充)

例子:

  基于UPanelWidget 自定義一個(gè)UMG 的Splitter的布局組件(CppWgt_SpliterComponent):

  需要擴(kuò)展兩個(gè)分別繼承于UPanelSlot,UPanelWidget的類

    USplitterComponentSlot 和

    CppWgt_SpliterComponent

  Note:(這里只是對Spliter簡單的UMG封裝,需要自己根據(jù)情況擴(kuò)展)

USplitterComponentSlot .h

// Copyright 1998-2019 Epic Games, Inc. All Rights Reserved.

#pragma once

#include "CoreMinimal.h"
#include "UObject/ObjectMacros.h"
#include "UObject/ScriptMacros.h"
#include "Components/PanelSlot.h"
#include "Components/SlateWrapperTypes.h"

#include "Runtime/Slate/Public/Widgets/Layout/SSplitter.h"

#include "SplitterComponentSlot.generated.h"

UCLASS()
class 項(xiàng)目_API USplitterComponentSlot : public UPanelSlot
{
    GENERATED_UCLASS_BODY()
public :
    UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Layout|SSpliter Slot")
        float SizeValue = 1.0f;
public:

    void BuildSlot(TSharedRef<SSplitter> SplitterCom);

    // UPanelSlot interface
    virtual void SynchronizeProperties() override;
    // End of UPanelSlot interface

    virtual void ReleaseSlateResources(bool bReleaseChildren) override;

private:
    SSplitter::FSlot* Slot;
};

USplitterComponentSlot .cpp

  

// Copyright 1998-2019 Epic Games, Inc. All Rights Reserved.

#include "SplitterComponentSlot.h"

#include "Components/Widget.h"

/////////////////////////////////////////////////////
// UHorizontalBoxSlot

USplitterComponentSlot::USplitterComponentSlot(const FObjectInitializer& ObjectInitializer)
    : Super(ObjectInitializer)
{
    Slot = NULL;
}

void USplitterComponentSlot::ReleaseSlateResources(bool bReleaseChildren)
{
    Super::ReleaseSlateResources(bReleaseChildren);
    Slot = NULL;
}

void USplitterComponentSlot::BuildSlot(TSharedRef<SSplitter> SplitterCom)
{
    Slot = &SplitterCom->AddSlot()
    [
        Content == NULL ? SNullWidget::NullWidget : Content->TakeWidget()
    ].Value(SizeValue);
}

void USplitterComponentSlot::SynchronizeProperties()
{
}

CppWgt_SpliterComponent.h

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"

#include "Runtime/UMG/Public/Components/PanelWidget.h"
#include "CppWgt_SpliterComponent.generated.h"

/**
 * 
 */
UCLASS()
class 項(xiàng)目_API UCppWgt_SpliterComponent : public UPanelWidget
{
    GENERATED_BODY()
public:

#if WITH_EDITOR
    // UWidget interface
    virtual const FText GetPaletteCategory() override;
    // End UWidget interface
#endif

    virtual void ReleaseSlateResources(bool bReleaseChildren) override;

protected:

    // UPanelWidget
    virtual UClass* GetSlotClass() const override;
    virtual void OnSlotAdded( UPanelSlot* Slot) override;
    virtual void OnSlotRemoved(UPanelSlot* Slot) override;
    // End UPanelWidget

protected:
    TSharedPtr<class SSplitter> MySplitter;

protected:
    // UWidget interface
    virtual TSharedRef<SWidget> RebuildWidget() override;
    // End of UWidget interface
};

CppWgt_SpliterComponent.cpp

// Fill out your copyright notice in the Description page of Project Settings.


#include "CppWgt_SpliterComponent.h"

#include "Components/Border.h"
#include "Runtime/Slate/Public/Widgets/Layout/SBorder.h"

#include "Runtime/UMG/Public/Components/PanelSlot.h"
#include "SplitterComponentSlot.h"

#define LOCTEXT_NAMESPACE "UMG"

const FText UCppWgt_SpliterComponent::GetPaletteCategory()
{
    //UE_LOG(LogTemp, Log, TEXT(" GetPaletteCategory "));
    return LOCTEXT("", "QingUI");
}

void UCppWgt_SpliterComponent::ReleaseSlateResources(bool bReleaseChildren)
{
    Super::ReleaseSlateResources(bReleaseChildren);
    MySplitter.Reset();
}

UClass * UCppWgt_SpliterComponent::GetSlotClass() const
{
    UE_LOG(LogTemp, Log, TEXT(" GetSlotClass "));
    return USplitterComponentSlot::StaticClass();
}

void UCppWgt_SpliterComponent::OnSlotAdded(UPanelSlot * Slot)
{
    if (!MySplitter.IsValid())
    {
        return;
    }

    UE_LOG(LogTemp, Log, TEXT(" OnSlotAdded "));


    CastChecked< USplitterComponentSlot>(Slot)->BuildSlot(MySplitter.ToSharedRef());
}

void UCppWgt_SpliterComponent::OnSlotRemoved(UPanelSlot * Slot)
{
    //這里

  TSharedPtr<SWidget> Widget = Slot->Content->GetCachedWidget();
  if ( !MySplitter.IsValid() ||
    !Widget.IsValid() )
  {
    return;
  }

  FChildren* Children = MySplitter->GetChildren();


  for (int i = 0; i < Children->Num(); i++ )
  {
    TSharedRef<SWidget> tempWgt = Children->GetChildAt(i);


    if (Widget == tempWgt)
    {
      //Widget->SetVisibility(EVisibility::Hidden);
      MySplitter->RemoveAt(i);
      break;
    }
  }

 }


TSharedRef<SWidget> UCppWgt_SpliterComponent::RebuildWidget()
{
    MySplitter = SNew(SSplitter);

    
    for (UPanelSlot* PanelSlot : Slots) 
    {
        if (USplitterComponentSlot* TypedSlot = Cast<USplitterComponentSlot>(PanelSlot))
        {
            TypedSlot->Parent = this;
            TypedSlot->BuildSlot(MySplitter.ToSharedRef());

        }
    }
    
    return MySplitter.ToSharedRef();
}

#undef LOCTEXT_NAMESPACE

總結(jié)

以上是生活随笔為你收集整理的UE4笔记-UMG和Slate记录的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲综合一 | 欧美亚洲综合网 | 超碰最新上传 | 色婷婷国产精品综合在线观看 | 特级毛片网站 | 波多野结衣一区二区 | www夜插内射视频网站 | 天堂亚洲 | 91网页在线观看 | 一区二区三区爱爱 | 91在线在线 | 国产精品丝袜视频 | 四虎成人网| 日本大尺度做爰呻吟舌吻 | 欧美与黑人午夜性猛交久久久 | 91精品成人 | 夜色导航| 插插宗合网 | 美女高潮黄又色高清视频免费 | 午夜av一区 | 久久精品一区二区国产 | 亚洲精品乱码久久久久久蜜桃不卡 | 国产99久| 九色丨蝌蚪丨成人 | 精品国产传媒 | 五月婷婷免费视频 | 好吊视频一二三区 | 亚洲丝袜色图 | 黄色av网站免费 | 人人草在线观看 | 西方av在线| 欧美一级在线看 | 嫩草一区| 国产精品久久久久99 | 天天艹| 黑人一级| 久草手机在线观看 | 欧美日韩一本 | 久久久久久黄色片 | 清纯粉嫩极品夜夜嗨av | 香蕉在线观看视频 | 久久精品这里 | 午夜精品影院 | 熟女毛毛多熟妇人妻aⅴ在线毛片 | 性欧美18一19性猛交 | 超碰在线国产 | 色婷婷激情av | 美女被艹视频网站 | 高潮一区| 国产黄在线观看 | 国产一级片精品 | 久久超碰av | 人人模人人干 | 亚洲激情视频网站 | www.97av| 国产欧美综合一区二区三区 | 天堂在线一区 | 在线观看aa | 久久成人精品一区二区 | 噼里啪啦动漫高清在线观看 | 理论片一区 | 久久视频在线播放 | 少妇性bbb搡bbb爽爽爽欧美 | 国产精品第9页 | 国产精品欧美一区二区 | 国产精品一二区在线观看 | brazzers精品成人一区 | 私人毛片| 黄色国产在线播放 | 制服诱惑一区二区 | 国产精品6666 | 深夜福利视频在线 | 三级全黄的视频 | 99免费在线视频 | 六月丁香激情综合 | 国产亚洲女人久久久久毛片 | 久久人人澡 | 成人福利视频导航 | 人妻天天爽夜夜爽一区二区三区 | 亚洲中文字幕97久久精品少妇 | 日韩中文在线字幕 | 亚洲乱色| 国产内射老熟女aaaa∵ | 大陆一级黄色片 | 日韩一卡二卡在线 | 中国吞精videos露脸 | 日本午夜激情视频 | 国产性猛交╳xxx乱大交 | 久久久久免费视频 | 97人人模人人爽人人少妇 | 91大神网址| 黄色h视频 | 筱田优全部av免费观看 | 国产美女无遮挡免费视频 | 日本三级免费看 | 91中文字幕网| 日韩成人精品一区二区三区 | 日日天天干 | 久在操 |