UE4類型與資源路徑重定向


UE4重定向機制十分強大,可在不同范圍對類型和資源路徑進行重定向。

在4.24.3版本中,有兩套實現方案:ActiveXXXRedirectsXXXRedirects

ActiveXXXRedirects是老的實現方案,功能較弱,未來會被淘汰

XXXRedirects又叫CoreRedirects,是新一代的重定向方案,功能更強大,可滿足各種情況下的類型及資源路徑的重定向

 

ActiveXXXRedirects老方案

具體包括4種類型:ActiveGameNameRedirectsActiveClassRedirectsActivePluginRedirectsActiveStructRedirects

定義在:UnrealEngine\Engine\Source\Runtime\Engine\Classes\Engine\Engine.h

USTRUCT()
struct FGameNameRedirect
{
    GENERATED_USTRUCT_BODY()

    UPROPERTY()
    FName OldGameName;

    UPROPERTY()
    FName NewGameName;
};


USTRUCT()
struct FClassRedirect
{
    GENERATED_USTRUCT_BODY()

    UPROPERTY()
    FName ObjectName;

    UPROPERTY()
    FName OldClassName;

    UPROPERTY()
    FName NewClassName;

    UPROPERTY()
    FName OldSubobjName;

    UPROPERTY()
    FName NewSubobjName;

    UPROPERTY()
    FName NewClassClass; 

    UPROPERTY()
    FName NewClassPackage; 

    UPROPERTY()
    bool InstanceOnly;
};


USTRUCT()
struct FStructRedirect
{
    GENERATED_USTRUCT_BODY()

    UPROPERTY()
    FName OldStructName;

    UPROPERTY()
    FName NewStructName;
};


USTRUCT()
struct FPluginRedirect
{
    GENERATED_USTRUCT_BODY()

    UPROPERTY()
    FString OldPluginName;

    UPROPERTY()
    FString NewPluginName;
};


UCLASS(abstract, config=Engine, defaultconfig, transient)
class ENGINE_API UEngine
    : public UObject
    , public FExec
{

    // ... ...
public:
    UPROPERTY(config)
    TArray<FGameNameRedirect> ActiveGameNameRedirects;

    UPROPERTY(config)
    TArray<FClassRedirect> ActiveClassRedirects;

    UPROPERTY(config)
    TArray<FPluginRedirect> ActivePluginRedirects;

    UPROPERTY(config)
    TArray<FStructRedirect> ActiveStructRedirects;
    // ... ...
};

 

 

XXXRedirects新方案

具體包括6種類型:ClassRedirectsStructRedirectsEnumRedirectsFunctionRedirectsPropertyRedirectsPackageRedirects

定義在:CoreRedirects.h和CoreRedirects.cpp

enum ECoreRedirectFlags
{
    None                     = 0,
    Type_Object              = 0x00000001,
    Type_Class               = 0x00000002,  // ClassRedirects
    Type_Struct              = 0x00000004,  // StructRedirects
    Type_Enum                = 0x00000008,  // EnumRedirects
    Type_Function            = 0x00000010,  // FunctionRedirects
    Type_Property            = 0x00000020,  // PropertyRedirects
    Type_Package             = 0x00000040,  // PackageRedirects
    Type_AllMask             = 0x0000FFFF,
    Option_InstanceOnly      = 0x00010000,  // 屬性bInstanceOnly=True  只命中CDO創建出來的實例對象,CDO不受影響
    Option_Removed           = 0x00020000,  // 屬性Removed=True
    Option_MatchSubstring    = 0x00040000,  // 屬性MatchSubstring=true  OldName為當前對象的子串,即命中
    Option_AllMask           = 0xFFFF0000,
    Option_ExactMatchMask    = Option_InstanceOnly | Option_Removed,
};
    
struct COREUOBJECT_API FCoreRedirect
{
    /** Flags of this redirect */
    ECoreRedirectFlags RedirectFlags;

    /** Name of object to look for */
    FCoreRedirectObjectName OldName;

    /** Name to replace with */
    FCoreRedirectObjectName NewName;

    /** Change the class of this object when doing a redirect */
    FCoreRedirectObjectName OverrideClassName;

    /** Map of value changes, from old value to new value */
    TMap<FString, FString> ValueChanges;
};

 

首先,要注意的是,重定向配置中填寫的所有的類型要去掉前綴U、A、F、E

重定向又分為兩大類:類型重定向資源路徑重定向

 

類型重定向

重定向整個模塊范圍的類型

[CoreRedirects]  ;BaseOpenCVLensCalibration.ini
;將名為MixedRealityCaptureCalibration的Module重定向到名為OpenCVLensCalibration上  
+PackageRedirects=(OldName="/Script/MixedRealityCaptureCalibration", NewName="/Script/OpenCVLensCalibration")

;與上面做法等價
[/Script/Engine.Engine]
+ActiveGameNameRedirects=(OldGameName="/Script/MixedRealityCaptureCalibration",NewGameName="/Script/OpenCVLensCalibration") 

 

重定向指定Class類型

[CoreRedirects]  ;BaseOpenCVLensCalibration.ini
;將MixedRealityCaptureCalibration模塊中的MyTestObject類型重定向到OpenCVLensCalibration模塊中的MyTestObject類型 
+ClassRedirects=(OldName="/Script/MixedRealityCaptureCalibration.MyTestObject",NewName="/Script/OpenCVLensCalibration.MyTestObject")

;與上面做法等價
[/Script/Engine.Engine]
+ActiveClassRedirects=(OldClassName="/Script/MixedRealityCaptureCalibration.MyTestObject", NewClassName="/Script/OpenCVLensCalibration.MyTestObject")

;----------------------------------------------------------------------------------------------------------------

[CoreRedirects]
;將對所有資源中的藍圖類型AnimNotify_PlaySound_C重定向到Engine模塊中C++類型AnimNotify_PlaySound  注:這種情況下,UCLASS的底層類進行的更改,將OverrideClassName設置為/Script/CoreUObject.Class
+ClassRedirects=(OldName="AnimNotify_PlaySound_C",NewName="/Script/Engine.AnimNotify_PlaySound",OverrideClassName="/Script/CoreUObject.Class")

[/Script/Engine.Engine]
;將當前項目主模塊中的AMyComponent類型重定向到TestModule模塊中的ABaseComponent類型
+ActiveClassRedirects=(OldClassName="MyComponent",NewClassName="/Script/TestModule.BaseComponent") 
;將TGame模塊中的TMyCharacter類型重定向到NGame模塊中的NMyCharacter類型
+ActiveClassRedirects=(OldClassName="/Script/TGame.TMyCharacter",NewClassName="/Script/NGame.NMyCharacter") 

 

重定向指定Class類型的指定對象

[CoreRedirects]
;將Name為Wall9的StaticMeshActor對象的Name修改為Go
+ClassRedirects=(OldName="/Script/Engine.StaticMeshActor",NewName="/Script/Engine.StaticMeshActor",ValueChanges=(("Wall9","Go")))

 

重定向指定Struct類型

[CoreRedirects] ;BaseMagicLeapScreens.ini
;將MagicLeapScreens模塊中的FScreensWatchHistoryEntry結構體重定向到MagicLeapScreens模塊中的MagicLeapScreensWatchHistoryEntry結構體
+StructRedirects=(OldName="/Script/MagicLeapScreens.ScreensWatchHistoryEntry", NewName="/Script/MagicLeapScreens.MagicLeapScreensWatchHistoryEntry")

;與上面做法等價
[/Script/Engine.Engine]
+ActiveStructRedirects=(OldStructName="/Script/MagicLeapScreens.ScreensWatchHistoryEntry",NewStructName="/Script/MagicLeapScreens.MagicLeapScreensWatchHistoryEntry")

 

重定向指定Enum類型及指定Enum值

[CoreRedirects] ;BaseMagicLeapHandTracking.ini
;將MagicLeapGestures模塊中的EStaticGestures枚舉重定向到MagicLeapHandTracking模塊中的EHandTrackingGesture枚舉
+EnumRedirects=(OldName="/Script/MagicLeapGestures.EStaticGestures",NewName="/Script/MagicLeapHandTracking.EHandTrackingGesture")

;將EStereoLayerType枚舉中的EStereoLayerType::SLT_TorsoLocked修改為EStereoLayerType::SLT_TrackerLocked
+EnumRedirects=(OldName="EStereoLayerType",ValueChanges=(("EStereoLayerType::SLT_TorsoLocked","EStereoLayerType::SLT_TrackerLocked")) )

;將所有模塊中的ESoundDistanceModel枚舉重定向到Engine模塊中的EAttenuationDistanceModel枚舉
;並將ATTENUATION_Custom修改為EAttenuationDistanceModel::Custom,將ATTENUATION_Inverse修改為EAttenuationDistanceModel::Inverse
+EnumRedirects=(OldName="ESoundDistanceModel",NewName="/Script/Engine.EAttenuationDistanceModel",ValueChanges=(("ATTENUATION_Custom","EAttenuationDistanceModel::Custom"),("ATTENUATION_Inverse","EAttenuationDistanceModel::Inverse")) )

 

重定向指定Function

[CoreRedirects]
;將ConvertTransformToRelative函數重定向到Engine模塊KismetMathLibrary類中MakeRelativeTransform函數
+FunctionRedirects=(OldName="ConvertTransformToRelative",NewName="/Script/Engine.KismetMathLibrary.MakeRelativeTransform")
;將Actor類中SetActorRotation函數重定向到Actor類中K2_SetActorRotation函數
+FunctionRedirects=(OldName="Actor.SetActorRotation",NewName="Actor.K2_SetActorRotation")

 

重定向指定Property

[CoreRedirects]
;將GameplayEffect類中InheritableClearTagsContainer屬性重定向到GameplayEffect類中RemoveGameplayEffectsWithTags屬性
+PropertyRedirects=(OldName="GameplayEffect.InheritableClearTagsContainer",NewName="GameplayEffect.RemoveGameplayEffectsWithTags")

 

** 類型重定向示例 **

 

老方案:在DefaultEngine中的/Script/Engine.Engine標簽中,將MyBPObject類型重定向到MyBPCObject上

[/Script/Engine.Engine]
+ActiveClassRedirects=(OldClassName="MyBPObject",NewClassName="MyBPCObject")

新方案:在DefaultEngine中的CoreRedirects標簽中,將MyBPObject類型重定向到MyBPCObject上

[CoreRedirects]
+ClassRedirects=(OldName="MyBPObject",NewName="MyBPCObject")

 

 

資源路徑重定向

在項目的DefaultEngine.ini中配置

[CoreRedirects]
;將藍圖類型/Game/Blueprints/Struct_AIVoiceTableRelated重定向到/Game/InBattle/Blueprints/Struct_AIVoiceTableRelated
+PackageRedirects=(OldName="/Game/Blueprints/Struct_AIVoiceTableRelated", NewName="/Game/InBattle/Blueprints/Struct_AIVoiceTableRelated")
;將材質/Game/Game/Materials/M_MRCamSrcProcessing重定向到/Game/InBattle/Materials/M_MrcVideoProcessing
+PackageRedirects=(OldName="/Game/Materials/M_MRCamSrcProcessing", NewName="/Game/InBattle/Materials/M_MrcVideoProcessing")

 

在引擎的BaseEngine.ini中配置

[CoreRedirects]
;將對資源/Engine/EngineAnimNotifies/AnimNotify_PlaySound的引用清空
+PackageRedirects=(OldName="/Engine/EngineAnimNotifies/AnimNotify_PlaySound",Removed=True)

具體步驟:

1. 刪除/Engine/EngineAnimNotifies/AnimNotify_PlaySound文件

2. 在CoreRedirects標簽中配置該文件要被刪除   注:如果不配置的話,會在Message Log窗口的Load Errors分類中提示 Failed to load /Engine/EngineAnimNotifies/AnimNotify_PlaySound Referenced by XXX

 

在Base[Plugin名].ini中配置資源重定向

[CoreRedirects]  ;BaseMDLImporter.ini
;將/DatasmithContent/Materials/MDL/目錄中的所有資源重定向到/MDLImporter/Materials/MDL/目錄中
+PackageRedirects=(OldName="/DatasmithContent/Materials/MDL/", NewName="/MDLImporter/Materials/MDL/", MatchSubstring=true)

;--------------------------------------------------------------------------------------------------------

[CoreRedirects]  ;BaseMixedRealityCaptureFramework.ini
;將名為MixedRealityFramework的Plugin重定向到名為MixedRealityCaptureFramework上
+PackageRedirects=(OldName="/MixedRealityFramework/", NewName="/MixedRealityCaptureFramework/", MatchSubstring=true)

;與上面做法等價
[/Script/Engine.Engine]
+ActivePluginRedirects=(OldPluginName="MixedRealityFramework",NewPluginName="MixedRealityCaptureFramework")  

 

** 資源路徑重定向示例 **

在windows資源管理器中強制把Meshes文件夾改名為Meshes2

場景中Bump_StaticMesh、LeftArm_StaticMesh、Linear_Stair_StaticMesh、Ramp_StaticMesh和RightArm_StaticMesh模型丟失

靜態模型Bump_StaticMesh、LeftArm_StaticMesh、Linear_Stair_StaticMesh、Ramp_StaticMesh和RightArm_StaticMesh關聯的RampMaterial材質丟失

 

在DefaultEngine中的CoreRedirects標簽中,將資源路徑/Game/ThirdPerson/Meshes/重定向到/Game/ThirdPerson/Meshes2/上

[CoreRedirects]
+PackageRedirects=(OldName="/Game/ThirdPerson/Meshes/", NewName="/Game/ThirdPerson/Meshes2/", MatchSubstring=true)

 

配置后,啟動一切都正常

 

去除依賴

配置了重定向后,可通過以下2種方法來去除對重定向的依賴

方法①:在編輯器中,對這些藍圖或其他美術資源文件進行重新保存

方法②:使用commandlet為ResavePackages的命令來保存對應的文件

UE4Editor.exe "%GameDir%\MyGame.uproject" -run=ResavePackages -projectonly // 重新保存項目中的所有文件

UE4Editor.exe "%GameDir%\MyGame.uproject" -run=ResavePackages -packagefolder="G:/svn/MyTest1/Content/ThirdPersonCPP/Meshes" // 重新保存項目G:/svn/MyTest1/Content/ThirdPersonCPP/Meshes目錄中的所有文件

UE4Editor.exe "%GameDir%\MyGame.uproject" -run=ResavePackages -package=/Game/ThirdPersonCPP/Meshes/Linear_Stair_StaticMesh // 重新保存項目中的/Game/ThirdPersonCPP/Meshes/Linear_Stair_StaticMesh文件

UE4Editor.exe "%GameDir%\MyGame.uproject" -run=ResavePackages -file="G:/svn/MyTest1/fixfilelist.txt" // 重新保存項目中G:/svn/MyTest1/fixfilelist.txt列表中包含的所有文件

fixfilelist.txt中內容如下:

G:/svn/MyTest1/Content/ThirdPersonCPP/Meshes/Bump_StaticMesh.uasset
G:/svn/MyTest1/Content/ThirdPersonCPP/Meshes/LeftArm_StaticMesh.uasset

 

擴展閱讀

觀察UE4重定向器(Redirector)的創建邏輯

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM