[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. Если она создана не мной, любые нарушения будут удалены.
наконец
В этой статье в основном представлены жесткие и мягкие ссылки, а также метод синхронной загрузки мягких ссылок. Что касается асинхронной загрузки ресурсов и более синхронных методов загрузки, я расскажу об этом в следующей статье.