Справочник

5 статей на этой странице

UPROPERTY

UPROPERTY · 15.06.2026 · 1 мин

BlueprintReadOnly — спецификатор UPROPERTY, который открывает свойство только для чтения в Blueprints. Значение можно получить через Get-ноду, но нельзя изменить через Set.

Этот спецификатор используется, когда значение должно быть видно в Blueprint, но изменять его должен только C++ код.

  • значение должно быть видно в Blueprint, но изменять его должен только C++ код
  • состояние объекта, которое можно читать, но нельзя перезаписывать из Blueprint
  • внутренние расчётные данные, которые нужно показывать для отладки
UCLASS()
class MYGAME_API AMyActor : public AActor
{
    GENERATED_BODY()

public:

    UPROPERTY(BlueprintReadOnly)
    float CurrentSpeed = 0.0f;

    UPROPERTY(BlueprintReadOnly)
    bool bIsAlive = true;

    virtual void Tick(float DeltaTime) override;
};
СпецификаторGet (чтение)Set (запись)Когда использовать
BlueprintReadWriteДаДаКогда нужен полный доступ из Blueprint
BlueprintReadOnlyДаНетКогда менять значение должен только C++

Официальный список спецификаторов UPROPERTY, включая BlueprintReadOnly, можно посмотреть в документации Epic Games.

Открыть как отдельную страницу →
UPROPERTY · 15.06.2026 · 1 мин

BlueprintReadWrite — спецификатор UPROPERTY, который открывает свойство для чтения и записи в Blueprints (Event Graph, Construction Script, Function Calls).

Без этого спецификатора свойство недоступно из Blueprint-нод вообще.

С BlueprintReadWrite ты можешь:

  • читать значение переменной из любой Blueprint-ноды (Get)
  • записывать новое значение (Set)
  • использовать свойство в Break / Make нодах для структур
  • свойство должно быть доступно в Blueprint как для чтения, так и для изменения
  • ты хочешь дать разработчику возможность настраивать логику в Event Graph
  • параметр или конфигурация, которую нужно менять во время игры из Blueprint
UCLASS()
class MYGAME_API AMyActor : public AActor
{
    GENERATED_BODY()

public:

    UPROPERTY(BlueprintReadWrite)
    float Health = 100.0f;

    UPROPERTY(BlueprintReadWrite)
    FString CharacterName = TEXT("Hero");
};

В Blueprint Editor для BlueprintReadWrite автоматически создаются ноды Get и Set:

Get — читает текущее значение. Set — записывает новое значение. Работает с любым типом переменной.

СпецификаторGet (чтение)Set (запись)Сценарий
BlueprintReadWriteДаДаСвойство доступно для чтения и изменения
BlueprintReadOnlyДаНетТолько чтение — значение нельзя изменить

Официальный список спецификаторов UPROPERTY, включая BlueprintReadWrite, можно посмотреть в документации Epic Games.

Открыть как отдельную страницу →
UPROPERTY · 22.03.2026 · 1 мин

Что такое EditAnywhere

EditAnywhere - самый универсальный спецификатор UPROPERTY.
Он позволяет редактировать переменную везде, где появляется панель Details:

  • в Class Defaults (настройки класса по умолчанию)
  • в каждом отдельном экземпляре актора на уровне
  • в компонентах, структурах, вложенных объектах

Это означает, что одно и то же свойство можно настраивать как глобально (для всех объектов), так и индивидуально (для каждого объекта в сцене)..

Когда использовать EditAnywhere

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

Пример кода

UCLASS()
class MYGAME_API AMyClass : public AActor
{
    GENERATED_BODY()

public:

    UPROPERTY(EditAnywhere)
    FString Property = "";

    UPROPERTY(EditDefaultsOnly)
    FString DefaultOnlyProperty = "";

};
Обложка статьи про спецификатор EditAnywhere в Unreal Engine

Как это выглядит в редакторе

В Class Defaults меняешь → влияет на все новые экземпляры.
В размещённом акторе меняешь → переопределяется только этот экземпляр.

Панель Details в редакторе Unreal Engine со свойством EditAnywhere

Сравнение с EditDefaultsOnly и EditInstanceOnly

СпецификаторClass DefaultsЭкземпляр на уровнесценарий
EditAnywhereДаДаУниверсальный
(самый популярный)
EditDefaultsOnlyДаНетГлобальные настройки класса
EditInstanceOnlyНетДаТолько индивидуальные корректировки
Открыть как отдельную страницу →
UPROPERTY · 22.03.2026 · 1 мин

EditAnywhere - самый универсальный спецификатор UPROPERTY.
Он позволяет редактировать переменную везде, где появляется панель Details:

  • в Class Defaults (настройки класса по умолчанию)
  • в каждом отдельном экземпляре актора на уровне
  • в компонентах, структурах, вложенных объектах

Это означает, что одно и то же свойство можно настраивать как глобально (для всех объектов), так и индивидуально (для каждого объекта в сцене)..

  • когда хочешь настраивать значения для каждого объекта на сцене
  • нужна гибкость и на уровне класса, и на уровне экземпляра
UCLASS()
class MYGAME_API AMyClass : public AActor
{
    GENERATED_BODY()

public:

    UPROPERTY(EditAnywhere)
    FString Property = "";

    UPROPERTY(EditDefaultsOnly)
    FString DefaultOnlyProperty = "";

};

В Class Defaults меняешь → влияет на все новые экземпляры.
В размещённом акторе меняешь → переопределяется только этот экземпляр.

СпецификаторClass DefaultsЭкземпляр на уровнесценарий
EditAnywhereДаДаУниверсальный
(самый популярный)
EditDefaultsOnlyДаНетГлобальные настройки класса
EditInstanceOnlyНетДаТолько индивидуальные корректировки

Официальный список спецификаторов UPROPERTY, включая EditDefaultsOnly, можно посмотреть в документации Epic Games.

Открыть как отдельную страницу →

Типы и шаблоны

Типы и шаблоны · 19.03.2026 · 1 мин

Что такое TOptional<T>

TOptional<T> — это шаблонный тип, обертка в которую мы оборачиваем нужный нам тип данных, которое может быть установлено или отсутствовать.

Зачем нужен TOptional<T>

Если нам нужно проверить были записаны какие либо данные в переменную или нет.
В обычной ситуации мы создадим новую переменную записываем в нее значения а после сравниваем с «Магическим значением» что обязывает нас помнить и учитывать такие проверки а если их будет несколько риск ошибки на ровном месте возрастает в разы

Пример кода с проверкой на «Магическое значение»

UPROPERTY(EditDefaultsOnly)
TArray<UObject*> ItemSlots;
	
int32 FindFirstEmptySlot()
{
	for (int32 i = 0; i < ItemSlots.Num(); i++)
	{
		if (IsValid(ItemSlots[i]))
		{
			return  i;
		}
	}
	return -1;
}

void AddItemSlot(UObject* NewItem)
{
	int32 EmptySlot = FindFirstEmptySlot();
	if (EmptySlot != -1)
	{
			
	}
}
UPROPERTY(EditDefaultsOnly)
TArray<UObject*> ItemSlots;
	
int32 FindFirstEmptySlot()
{
	for (int32 i = 0; i < ItemSlots.Num(); i++)
	{
		if (IsValid(ItemSlots[i]))
		{
			return  i;
		}
	}
	return -1;
}

void AddItemSlot(UObject* NewItem)
{
	int32 EmptySlot = FindFirstEmptySlot();
	if (EmptySlot != -1)
	{
			
	}
}

В этом коде после поиска слота мы должны проверить найден ли он, а для этого нам необходимо сравнить его с каким-то «магическое значение»

  • нужно помнить, что -1 означает «не найдено»
  • для разных типов придётся использовать разные значения
  • легко допустить ошибку при сравнении

TOptional<T> решает эту проблему теперь нам не нужно будет придумывать какие-то значения если мы ничего не нашли теперь у нас есть единообразная проверка для всех подобных случаев и при замене типа нам не нужно будет менять условия во всех местах где использовался этот тип данных

TOptional<int32> FindFirstEmptySlot()
{
	for (int32 i = 0; i < ItemSlots.Num(); i++)
	{
		if (IsValid(ItemSlots[i]))
		{
				return  i;
		}
	}
	return TOptional<int32>();
}

void AddItemSlot(UObject* NewItem)
{
	TOptional<int32> EmptySlot = FindFirstEmptySlot();
	if (EmptySlot.IsSet())
	{
		int32 Value = EmptySlot.GetValue();	
	}
}
TOptional<int32> FindFirstEmptySlot()
{
	for (int32 i = 0; i < ItemSlots.Num(); i++)
	{
		if (IsValid(ItemSlots[i]))
		{
				return  i;
		}
	}
	return TOptional<int32>();
}

void AddItemSlot(UObject* NewItem)
{
	TOptional<int32> EmptySlot = FindFirstEmptySlot();
	if (EmptySlot.IsSet())
	{
		int32 Value = EmptySlot.GetValue();	
	}
}

Что изменилось

  • код становится чище и безопаснее
  • мы не используем «магические значения»
  • одинаковая проверка для любых типов

Когда использовать TOptional<T>

  • Вместо «магических значений»
  • нужно явно показать, что результат может быть пустым
  • Когда значение может отсутствовать, но не является ошибкой

Когда не нужно использовать

  • yже используется указатель
  • когда нет нужды проверять значение есть или нет

⚠️ важно помнить если вы вызовете GetValue() метод для неинициализированного значения то вы получите краш игры или редактора

if (EmptySlot.IsSet())
{
    int32 Value = EmptySlot.GetValue();
}
if (EmptySlot.IsSet())
{
    int32 Value = EmptySlot.GetValue();
}
Открыть как отдельную страницу →