Войти
Unreal EngineФорумОбщее

Как в UE получить компонент изображения из блупринта?

#0
(Правка: 10:43) 10:42, 25 апр. 2020

У меня есть диалоговое окно с иконкой персонажа и я хочу иметь возможность задавать в коде изображение для него. Как это можно сделать? Непонятно, как обратиться к компоненту Image.

.h

UPROPERTY(EditAnywhere) TSubclassOf<UUserWidget> widgetDialogBottom;
UUserWidget* widgetDialogBottomInstance;

.cpp

widgetDialogBottomInstance = CreateWidget<UUserWidget>(GetWorld(), widgetDialogBottom);
widgetDialogBottomInstance->Image("mi_dialog_2"); // Нужно что-то вроде такого
widgetDialogBottomInstance->AddToViewport();
Изображение
Изображение

Мне здесь и на других форумах посоветовали создать класс DialogBottomWidget

.h

UCLASS()
class HOME_API UDialogBottomWidget : public UUserWidget
{
  GENERATED_BODY()
public:
  void SetImage(UTexture2D* InTexture);

private:
  UPROPERTY(meta = (BindWidget)) UImage* CharacterPreview;
};

.cpp
#include "DialogBottomWidget.h"

void UDialogBottomWidget::SetImage(UTexture2D* InTexture)
{
  CharacterPreview->SetBrushFromTexture(InTexture);
}
А затем на основе этого класса сделать блупринт. А что дальше делать?
Как в коде задать нужное изображение для иконки персонажа? Кстати, это не текстура, а material instance.
Изображение

#1
10:49, 25 апр. 2020

Через референс. На текстуре или любом другом нужном ассете кликаешь правой кнопкой и Copy Reference.
Получаешь референс на ассет в буфере обмена, с ним можно работать из С++ кода.
Подробнее я расказывать не буду, потому что в туториалах это есть - повторяться смысла нет, гуглится оно на раз.

#2
11:03, 25 апр. 2020

@!!ex
Не хочу спорить, но оно не гуглится на раз. Я уже неделю пытаюсь понять, как это сделать.
Референс я могу получить, но не пойму, как обратиться к компоненту Image блупринта

MaterialInstanceConstant'/Game/Materials/Faces/mi_dialog_2.mi_dialog_2'
#3
13:45, 25 апр. 2020

чтобы изменить изображение в виджете, нужно не по харду его менять
а вызвать метод виджета, который сменит изображение

#4
14:16, 25 апр. 2020

mitroxa
Какой метод? Как его вызывать?

#5
(Правка: 14:46) 14:38, 25 апр. 2020

сделать в базовом виджете виртуальный метод который меняет изображение
а реализация метода в твоем виджете блюпринте

вообще зачем так делать, тут два правильных варианта поидее:
1. сделать разметку в c++ и не делать дочернего
2. сделать геймплейный интерфейс в с++ и реализовать его в блюпринте виджета
там будут методы вроде SetCharIcon и т.п.

#6
14:42, 25 апр. 2020

Без кода не очень понятно, но все-равно спасибо, буду разбираться

#7
(Правка: 14:50) 14:49, 25 апр. 2020

вот код который создает редактор когда добавляешь интерфейс, тут методы определяешь, сам посмотри как это делается в сорцах где-нибудь

// This class does not need to be modified.
UINTERFACE(MinimalAPI)
class UMyInterface : public UInterface
{
  GENERATED_BODY()
};

/**
 * 
 */
class TEST_API IMyInterface
{
  GENERATED_BODY()

  // Add interface functions to this class. This is the class that will be 
  //inherited to implement this interface.
public:
  
};
вот тут добавляешь своему виджету интерфейс и жмешь +override
widget | Как в UE получить компонент изображения из блупринта?

#8
(Правка: 14:54) 14:52, 25 апр. 2020

у тебя должен быть какой-то логический интерфейс к диалогу
там методы которые меняют иконку, добавляют реплику и т.п.

дальше, когда будешь добавлять виджет на экран, нужно будет скастить его к интерфейсу и сохранить полученный указатель, через него будешь работать с диалогом

скастить нужно как-то по особому вроде бы, типа UObject->GetInterfaces, не помню точно, почитай

вообще если ты планируешь постоянно обращаться к своему гуи из крестов
то лучше все обернуть в интерфейсы и в крестах напрямую работать только с ними

#9
15:21, 25 апр. 2020

Спасибо, сейчас буду пробовать

Unreal EngineФорумОбщее