UMG로 나와있는 Textblock 기능이 한정되어 있어서 Slate의 STextblock 기능을 쓰고 싶을 때, 기타 등등..


새 C++ 클래스 추가 후


모든 클래스 표시 체크



Textblock을 고치고 싶어서 Textblock을 부모로 선택



MyuserWidget.h


#pragma once
#include "Runtime/UMG/Public/UMG.h"

#include "Blueprint/UserWidget.h"
#include "MyUserWidget.generated.h"

/**
 * 
 */
UCLASS(meta=(DisplayName="Text Custom"))
class DELEGATETEST_API UMyUserWidget : public UTextBlock
{
	GENERATED_BODY()
#if WITH_EDITOR
    virtual const FText GetPaletteCategory() override;
#endif
    
public:

protected:
    //~ Begin UWidget Interface
    virtual TSharedRef RebuildWidget() override;


};


MyUserWidget.cpp

#include "MyUserWidget.h"
#include "BreakIterator.h"

#include "SInvalidationPanel.h"

#define LOCTEXT_NAMESPACE "UMG"

/////////////////////////////////////////////////////
// UMyUserWidget

#if WITH_EDITOR
const FText UMyUserWidget::GetPaletteCategory()
{
    return LOCTEXT("", "My user widget stuff");
}
#endif

TSharedRef UMyUserWidget::RebuildWidget()
{
    UE_LOG(LogTemp, Warning, TEXT( " UTextBlock::RebuildWidget() Called!!!!!!!!!!!!!!!!!!!!!!!!!!#####################"));
    if (bWrapWithInvalidationPanel && !IsDesignTime())
    {
        TSharedPtr RetWidget = SNew(SInvalidationPanel)
        [
         SAssignNew(MyTextBlock, STextBlock)
         ];
        return RetWidget.ToSharedRef();
    }
    else
    {
        MyTextBlock = SNew(STextBlock).LineBreakPolicy(FBreakIterator::CreateCharacterBoundaryIterator());
        return MyTextBlock.ToSharedRef();
    }
}


#undef LOCTEXT_NAMESPACE



언리얼 엔진소스 TSharedRef<SWidget> UTextBlock::RebuildWidget() 에는

		MyTextBlock = SNew(STextBlock);

만 되어 있었기 때문에


LineBreakPolicy 가 기본 값인 WordBreakIterator 였다. UTextblock 클래스에는 변수로 나와있지 않기 때문에 수정이 불가능 했던 것.


에디터에 추가해서 Auto Wrap 옵션을 주고 확인해보았다 .

위쪽이 원래의 UMG Textblock

아래쪽이 새로추가한 UMG Textblock Custom


같은 문자열을 입력했는데 위는 wordbreak 가 아래에는 characterbreak 가 적용 된 모습.


알아내느라 대략 24시간 정도 쓴 것 같다....



핵심은

언리얼 엔진소스의 UMG 위젯 중 하나를 상속받아서

필요한 부분만 override


여기서는 RebuildWidget() 수정.