UE4重定向機制十分強大,可在不同范圍對類型和資源路徑進行重定向。
在4.24.3版本中,有兩套實現方案:ActiveXXXRedirects和XXXRedirects
ActiveXXXRedirects是老的實現方案,功能較弱,未來會被淘汰
XXXRedirects又叫CoreRedirects,是新一代的重定向方案,功能更強大,可滿足各種情況下的類型及資源路徑的重定向
ActiveXXXRedirects老方案
具體包括4種類型:ActiveGameNameRedirects、ActiveClassRedirects、ActivePluginRedirects、ActiveStructRedirects
定義在: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種類型:ClassRedirects、StructRedirects、EnumRedirects、FunctionRedirects、PropertyRedirects、PackageRedirects
定義在: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
擴展閱讀