[UE C++] Загрузка ресурсов (1) Загрузка жестких и программных эталонных ресурсов

[UE C++] Загрузка ресурсов (1) Загрузка жестких и программных эталонных ресурсов

Как получить имя пути

  • Для ресурсов объекта щелкните правой кнопкой мыши Копировать ссылку.
  • Для ресурсов класса щелкните правой кнопкой мыши «Копировать ссылку» и добавьте _C .

Изображение из разработки, основанной на данных
Вставьте сюда описание изображения

1. Загрузка жесткой ссылки

Концепция: при использовании метода загрузки жестких ссылок, когда объект A ссылается на объект B, объект B загружается непосредственно в память. Если объект B также жестко ссылается на объект C, в память также будет загружен объект C. Этот процесс является рекурсивным, что может привести к быстрому уменьшению доступной емкости памяти за короткий период времени, что приведет к зависанию процесса. Узел схемы элементов Cast to XXXXприводит к жесткой ссылке на приведённый объект, даже если узел существует, но не используется. Поэтому вам следует избегать широкого использования этого узла в чертежах.

UPROPERTY(EditDefaultsOnly)
UTexture2D* TextureRef;

UPROPERTY(EditDefaultsOnly)
TSubclassOf<AActor> ActorClassRef;

1.1 Рекомендации во время строительства

По ConstructorHelpers::FXxxxFinderреализации его можно использовать только в конструкторе , обратите внимание на добавление статики

//加载对象
static ConstructorHelpers::FObjectFinder<UStaticMeshComponent> DoorMesh(TEXT("StaticMesh'/Game/StarterContent/Props/SM_Door.SM_Door'"));
if (DoorMesh.Succeeded())
{
    DoorMeshHardRef = DoorMesh.Object;
}

//加载类
static ConstructorHelpers::FClassFinder<AActor> ClassFind(TEXT("Blueprint'/Game/Blueprint/BP_Test.BP_Test'"));
if (ClassFind.Succeeded())
{
    ActorClassRef = ClassFind.Class;
}

В приведенном выше конструкторе ConstructorHelpersкласс попытается найти ресурс в памяти и, если не найден, загрузит его.

1.2 Прямая ссылка на атрибуты

Это наиболее распространенная ситуация со ссылкой на ресурс, и ресурс предоставляется UPROPERTYчерез макросы. Позволяет дизайнерам назначать определенный ресурс прототипу через наследование Blueprint или через экземпляр, помещенный в среду.

Может использоваться вместе со ссылками времени создания . Указанные ресурсы перезапишут ресурсы, указанные конструктором.
Вставьте сюда описание изображения

2. Мягкая загрузка эталона

концепция:

  • Объект A ссылается на объект B через косвенный механизм (например, путь к объекту в виде строки). Объект мягкой ссылки не загружает активно ссылочный объект в память. Он требует ручной синхронной/асинхронной загрузки, т. е. мягкая ссылка сама по себе не хранит ресурсы.
  • Мягкие ссылки — это косвенные ссылки на свойства. Косвенные ссылки на свойства работают так же, как прямые ссылки на свойства в дизайнере (раскрывающееся меню в Blueprint для выбора ресурсов), однако свойства сохраняются в виде строк с кодом шаблона для безопасной проверки ресурсов. вместо прямой ссылки на указатель

2.1 ФСофтОбжектПат

Путь к программному объекту. Для сохранения пути к ссылочному объекту используется внутренняя строка.

UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
FSoftObjectPath ObjectSoftRef;

UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, meta = (AllowedClasses = "SkeletalMesh,StaticMesh"))
FSoftObjectPath MeshSoftRef;

Меры предосторожности:

  • Фильтрация доступна для AllowedClassesссылочных типов объектов, но фильтрация пользовательских типов может вызвать проблемы.
  • AllowedClassesФильтрация в основном используется для фильтрации указанных ресурсов при выборе «Объект» в раскрывающемся меню Редактора и не влияет на использование в C++. Другими словами AllowedClasses = "SkeletalMesh,StaticMesh", если MeshSoftRef указывает ресурс UTexture2D, его все равно можно загрузить и использовать в обычном режиме.

2.1.1 Укажите путь к эталонному объекту

//通过 = ,对象可是FString,FName,FSoftObjectPath对象等
MeshSoftRef = "SkeletalMesh'/Game/Mannequin/Character/Mesh/SK_Mannequin.SK_Mannequin'";

//通过SetPath
MeshSoftRef.SetPath("SkeletalMesh'/Game/Mannequin/Character/Mesh/SK_Mannequin.SK_Mannequin'");

//通过构造函数
FSoftObjectPath MeshSoftRef{ FString("SkeletalMesh'/Game/Mannequin/Character/Mesh/SK_Mannequin.SK_Mannequin'") };

2.1.2 РазрешитьОбъект

Функция: Определить, загружен ли ресурс, на который он ссылается, в память. Если загружен, вернуть указатель объекта ресурса, в противном случае вернуть пустой.

//可能为空
TextureRef = Cast<UTexture2D>(ObjectSoftRef.ResolveObject());

2.1.3 Пробная загрузка

Функция: Внутренний вызов LoadObject, попытка найти ресурсы в памяти, если ресурсы не загружены, они будут загружены синхронно.

//路径未错,会返回UObject指针指向资源
TextureRef = Cast<UTexture2D>(ObjectSoftRef.TryLoad());

2.2 Фсофткласспуть

Путь к мягкому классу, унаследованный от FSoftObjectPath, специально используемый для мягких ссылок на UClass*.

UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
FSoftClassPath ClassSoftRef;

UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, meta = (MetaClass = "Actor"))
FSoftClassPath ActorClassSoftRef;

Меры предосторожности:

  • Диапазон доступных MetaClassклассов фильтрации, хорошая поддержка пользовательских типов.
  • MetaClassТакже работает только в редакторе

2.2.1 Укажите путь к эталонному объекту

Поскольку конструкторы и операторы присваивания не наследуются, здесь есть небольшая разница.

//通过构造函数,参数可是UClass,FString,FSoftClassPath
FSoftClassPath ClassSoftRef{"Blueprint'/Game/Blueprint/BP_Test.BP_Test_C'" };

//通过SetPath
ClassSoftRef.SetPath("Blueprint'/Game/Blueprint/BP_Test.BP_Test_C'");

2.2.2 ResolveObject -> ResolveClass

2.2.3 TryLoad -> TryLoadClass

2.3 ФСофтОбжектПтр

Указатель мягкого объекта, слабый указатель, указывающий на UObject, не может использоваться в чертежах . Он используется во время асинхронной загрузки ресурсов для получения указателя объекта, соответствующего ресурсу, при срабатывании функции обратного вызова после завершения загрузки ресурса.

FSoftObjectPtr MeshSoftPtr;
struct FSoftObjectPtr : public TPersistentObjectPtr<FSoftObjectPath>
{
    ······
}

FSoftObjectPtrЭто умный указатель, унаследованный от TPersistentObjectPtr. Логика загрузки внутренних ресурсов основана на FSoftObjectPathвторичной инкапсуляции, которую можно использовать для ToSoftObjectPath()возврата FSoftObjectPathобъекта.

FORCEINLINE const FSoftObjectPath& ToSoftObjectPath() const
{
    return GetUniqueID();
}

Однако, поскольку возвращается то, что const FSoftObjectPath&путь к ресурсу, на который он ссылается, не может быть изменен, вы можете инициализировать его только через конструктор, чтобы указать путь к ссылочному ресурсу, или указать конкретный объект UObject (объект CDO).

//初始化参数可是UObject,FSoftObjectPath,FSoftObjectPtr
FSoftObjectPtr MeshSoftPtr{ FSoftClassPath {"Blueprint'/Game/Blueprint/BP_Test.BP_Test_C'"}};

Меры предосторожности:

  • FSoftObjectPtrНельзя подвергать воздействию чертежей
  • FSoftObjectPtrОн может указывать на UClass, который на самом деле является подклассом UObject.
  • На самом деле внутри объекта ресурса имеется слабый указатель.

2.3.1 Получить()

Функция: Получить указатель UObject, указывающий на ресурс. Если он пуст, загрузка не произойдет.

TextureRef = Cast<UTexture2D>(MeshSoftPtr.Get());

2.3.2 Ожидание

Пример: Проверьте, не указывает ли это на действующий UObject, но может ли это указывать в будущем.

if(!MeshSoftPtr.IsPending())
{
    MeshSoftPtr.Get();
}

2.3.3 Действителен

Пример: Проверьте, указывает ли это на живой UObject.

if(MeshSoftPtr.IsValid())
{
    MeshSoftPtr.Get();
}

2.3.4 Синхронная загрузка

Функция: Возвращает указатель на ресурс. Если ресурс не существует в памяти, загрузить его синхронно (pass FSoftObjectPath::TryLoad) .

TextureRef = Cast<UTexture2D>(MeshSoftPtr.LoadSynchronous());

2.3.5 Сброс

Пример: Сброс программного указателя обратно в нулевое состояние.

MeshSoftPtr.Reset();

2.4 TSoftObjectPtr<>

Правильный FSoftObjectPtrшаблон: внутренняя логика основана на FSoftObjectPtrвторичной инкапсуляции, которая может быть UPropertiesпредставлена ​​в проекте.

UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
TSoftObjectPtr<UTexture2D> TextureSoftPtr;

По сути, операция FSoftObjectPtrта же самая: возвращается указатель на класс шаблона, что сокращает необходимость выполнения ручного этапа приведения.

2.5 TSoftClassPtr<>

Создайте шаблон справа FSoftObjectPtr, преобразуйте его в UClass* и UPropertiesпредоставьте его проекту. Эту форму также можно использовать TSoftObjectPtr<UClass>вместо

UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
TSoftClassPtr<AActor> ClassSoftPtr;

По сути, операция FSoftObjectPtrта же самая: возвращается указатель на класс шаблона, что сокращает необходимость выполнения ручного этапа приведения.

Мягкая справочная диаграмма

Картинка взята из ссылки ресурсов в UE4. Если она создана не мной, любые нарушения будут удалены.
Вставьте сюда описание изображения

наконец

В этой статье в основном представлены жесткие и мягкие ссылки, а также метод синхронной загрузки мягких ссылок. Что касается асинхронной загрузки ресурсов и более синхронных методов загрузки, я расскажу об этом в следующей статье.

Справочная ссылка

Guess you like

Origin blog.csdn.net/qq_52179126/article/details/130061974