示例#1
0
 public void InitMode(AssetLoadMode mode, float duration = 120f, float cacheStayTime = 100f)
 {
     Debug.LogFormat("[AssetManager]初始化 当前加载模式:{0} 定时清理缓冲间隔:{1}s 缓存驻留时间:{2}s", mode, duration, cacheStayTime);
     LoadMode           = mode;
     ClearCacheDuration = duration;
     CacheDataStayTime  = cacheStayTime;
     editorLoader       = new EditorAssetLoader();
     abLoader           = new AssetBundleLoader(GameConfigs.LocalABRootPath, GameConfigs.LocalManifestPath);
 }
示例#2
0
        public void Reset()
        {
            id     = 0;
            status = 0;
            result = null;
            loader = null;
            path   = null;
            mode   = AssetLoadMode.Async;

            onCallback = null;

            m_parents?.Clear();
            m_children?.Clear();
            m_callbackCount = 0;
            m_callbackCall  = null;
        }
示例#3
0
        public void GenerateCodeForBlueprints(AssetLoadMode loadMode, bool clearAssetCache, bool skipLevels)
        {
            BeginGenerateModules();

            string           projectPath = FPaths.ProjectFilePath;
            string           projectName = FPaths.GetBaseFilename(projectPath);
            UnrealModuleInfo module      = new UnrealModuleInfo(null, projectName, projectPath);

            BeginGenerateModule(module);

            UClass worldClass = GCHelper.Find <UClass>(Classes.UWorld);

            AssetCache assetCache = new AssetCache(this);

            if (!clearAssetCache)
            {
                assetCache.Load();
            }

            List <string> assetBlacklist = LoadAssetBlacklist();

            AssetLogClear();
            AssetLogLine("Load assets {0}", DateTime.Now);

            bool registeredCrashHandler = false;

            if (Settings.CatchCrashOnAssetLoading)
            {
                FCoreDelegates.OnHandleSystemError.Bind(OnAssetLoadingCrash);
                registeredCrashHandler = true;
            }

            using (FARFilter filter = new FARFilter())
            {
                filter.RecursiveClasses = true;
                filter.ClassNames.Add(UClass.GetClass <UBlueprint>().GetFName());
                filter.ClassNames.Add(UClass.GetClass <UBlueprintGeneratedClass>().GetFName());
                filter.ClassNames.Add(UClass.GetClass <UUserDefinedStruct>().GetFName());
                filter.ClassNames.Add(UClass.GetClass <UUserDefinedEnum>().GetFName());
                if (!skipLevels && worldClass != null)
                {
                    filter.ClassNames.Add(worldClass.GetFName());
                }

                List <FAssetData> assets = FAssetData.Load(filter);

                SlowTaskSetModuleCount(1);
                SlowTaskBeginModule("Blueprints", assets.Count);

                foreach (FAssetData asset in assets)
                {
                    SlowTaskStep(null);

                    string assetFileName, assetFileNameError;
                    if (!asset.TryGetFilename(out assetFileName, out assetFileNameError))
                    {
                        FMessage.Log(string.Format("FAssetData.TryGetFilename failed. ObjectPath:'{0}' reason:'{1}'",
                                                   asset.ObjectPath.ToString(), assetFileNameError));
                        continue;
                    }

                    bool isEngineAsset = FPaths.IsSameOrSubDirectory(FPaths.EngineContentDir, FPaths.GetPath(assetFileName));
                    if (loadMode != AssetLoadMode.All)
                    {
                        if ((isEngineAsset && loadMode != AssetLoadMode.Engine) ||
                            (!isEngineAsset && loadMode != AssetLoadMode.Game))
                        {
                            continue;
                        }
                    }

                    if (!assetCache.HasAssetChanged(asset, assetFileName))
                    {
                        if (Settings.LogAssetLoadingVerbose)
                        {
                            AssetLogLine("'{0}' unchanged", assetFileName);
                        }
                        continue;
                    }

                    // Log that we are loading this asset so we know which assets crash on load
                    AssetLog("'{0}' - ", asset.ObjectPath.ToString());

                    if (assetBlacklist.Contains(asset.ObjectPath.ToString()))
                    {
                        AssetLogLine("blacklisted");
                        continue;
                    }

                    loadingAsset = asset.ObjectPath.ToString();
                    UObject obj = asset.GetAsset();
                    loadingAsset = null;

                    UClass unrealClass = asset.GetClass();

                    if (obj == null || unrealClass == null)
                    {
                        AssetLogLine("null");
                        continue;
                    }

                    AssetLogLine("done");

                    if (unrealClass.IsChildOf <UBlueprint>())
                    {
                        UBlueprint blueprint = obj as UBlueprint;
                        if (blueprint != null)
                        {
                            UBlueprintGeneratedClass blueprintGeneratedClass = blueprint.GeneratedClass as UBlueprintGeneratedClass;
                            if (blueprintGeneratedClass != null)
                            {
                                GenerateCodeForStruct(module, blueprintGeneratedClass);
                            }
                        }
                    }
                    else if (unrealClass.IsChildOf <UBlueprintGeneratedClass>())
                    {
                        UBlueprintGeneratedClass blueprintGeneratedClass = obj as UBlueprintGeneratedClass;
                        if (blueprintGeneratedClass != null)
                        {
                            GenerateCodeForStruct(module, blueprintGeneratedClass);
                        }
                    }
                    else if (unrealClass.IsChildOf <UUserDefinedStruct>())
                    {
                        UUserDefinedStruct unrealStruct = obj as UUserDefinedStruct;
                        if (unrealStruct != null)
                        {
                            GenerateCodeForStruct(module, unrealStruct);
                        }
                    }
                    else if (unrealClass.IsChildOf <UUserDefinedEnum>())
                    {
                        UUserDefinedEnum unrealEnum = obj as UUserDefinedEnum;
                        if (unrealEnum != null)
                        {
                            GenerateCodeForEnum(module, unrealEnum);
                        }
                    }
                    else if (unrealClass.IsChildOf(worldClass))
                    {
                        TArrayUnsafeRef <UObject> levels = new TArrayUnsafeRef <UObject>(Native.Native_UWorld.GetLevels(obj.Address));
                        foreach (UObject level in levels)
                        {
                            using (TArrayUnsafe <UBlueprint> levelBlueprints = new TArrayUnsafe <UBlueprint>())
                            {
                                Native.Native_ULevel.GetLevelBlueprints(level.Address, levelBlueprints.Address);
                                foreach (UBlueprint blueprint in levelBlueprints)
                                {
                                    UBlueprintGeneratedClass blueprintGeneratedClass = blueprint.GeneratedClass as UBlueprintGeneratedClass;
                                    if (blueprintGeneratedClass != null)
                                    {
                                        //GenerateCodeForStruct(blueprintGeneratedClass);
                                    }
                                }
                            }
                        }
                    }
                }
            }

            if (registeredCrashHandler)
            {
                FCoreDelegates.OnHandleSystemError.Unbind(OnAssetLoadingCrash);
            }

            assetCache.Save();

            EndGenerateModule(module);
            EndGenerateModules();
        }
示例#4
0
        internal static void GenerateCode(string[] args)
        {
            try
            {
                bool invalidArgs = false;

                if (args.Length > 0)
                {
                    CodeGenerator codeGenerator = null;

                    switch (args[0])
                    {
                    case "blueprints":
                        AssetLoadMode loadMode        = AssetLoadMode.Game;
                        bool          clearAssetCache = false;
                        bool          skipLevels      = false;
                        if (args.Length > 1)
                        {
                            switch (args[1])
                            {
                            case "game":
                                loadMode = CodeGenerator.AssetLoadMode.Game;
                                break;

                            case "engine":
                                loadMode = CodeGenerator.AssetLoadMode.Engine;
                                break;

                            case "all":
                                loadMode = CodeGenerator.AssetLoadMode.All;
                                break;
                            }
                        }
                        if (args.Length > 2)
                        {
                            bool.TryParse(args[2], out clearAssetCache);
                        }
                        if (args.Length > 3)
                        {
                            bool.TryParse(args[3], out skipLevels);
                        }
                        codeGenerator = new CodeGenerator();
                        codeGenerator.GenerateCodeForBlueprints(loadMode, clearAssetCache, skipLevels);
                        break;

                    case "game":
                        codeGenerator = new CodeGenerator();
                        codeGenerator.GenerateCodeForModules(new UnrealModuleType[] { UnrealModuleType.Game });
                        break;

                    case "gameplugins":
                        codeGenerator = new CodeGenerator();
                        codeGenerator.GenerateCodeForModules(new UnrealModuleType[] { UnrealModuleType.GamePlugin });
                        break;

                    case "modules":
                        // Engine modules (whitelisted)
                        codeGenerator = new CodeGenerator();
                        //codeGenerator.Settings.ExportMode = CodeGeneratorSettings.CodeExportMode.All;
                        //codeGenerator.Settings.ExportAllFunctions = true;
                        //codeGenerator.Settings.ExportAllProperties = true;
                        string whitelistFile = Path.Combine(codeGenerator.Settings.GetManagedPluginSettingsDir(), "ModulesWhitelist.txt");
                        string blacklistFile = Path.Combine(codeGenerator.Settings.GetManagedPluginSettingsDir(), "ModulesBlacklist.txt");
                        if (File.Exists(whitelistFile))
                        {
                            foreach (string line in File.ReadAllLines(whitelistFile))
                            {
                                if (!string.IsNullOrEmpty(line))
                                {
                                    codeGenerator.ModulesNamesWhitelist.Add(line);
                                }
                            }
                        }
                        if (File.Exists(blacklistFile))
                        {
                            foreach (string line in File.ReadAllLines(blacklistFile))
                            {
                                if (!string.IsNullOrEmpty(line))
                                {
                                    codeGenerator.ModulesNamesBlacklist.Add(line);
                                }
                            }
                        }
                        codeGenerator.GenerateCodeForEngineModules();
                        break;

                    case "all_modules":
                        codeGenerator = new CodeGenerator();
                        codeGenerator.GenerateCodeForAllModules();
                        break;

                    case "engine_modules":
                        codeGenerator = new CodeGenerator();
                        codeGenerator.GenerateCodeForEngineModules();
                        break;

                    case "module":
                        if (args.Length > 1)
                        {
                            codeGenerator = new CodeGenerator();
                            // Tests / using these for types for use in this lib
                            //codeGenerator.Settings.CheckUObjectDestroyed = false;
                            //codeGenerator.Settings.GenerateIsValidSafeguards = false;
                            //codeGenerator.Settings.ExportMode = CodeGeneratorSettings.CodeExportMode.All;
                            //codeGenerator.Settings.ExportAllFunctions = true;
                            //codeGenerator.Settings.ExportAllProperties = true;
                            //codeGenerator.Settings.MergeEnumFiles = false;
                            codeGenerator.GenerateCodeForModule(args[1], true);
                        }
                        else
                        {
                            invalidArgs = true;
                        }
                        break;

                    case "compile":
                        CompileGeneratedCode();
                        break;

                    default:
                        invalidArgs = true;
                        break;
                    }
                }
                else
                {
                    invalidArgs = true;
                }

                if (invalidArgs)
                {
                    FMessage.Log(ELogVerbosity.Warning, "Invalid input. Provide one of the following: game, gameplugins, modules, module [ModuleName], compile");
                }
            }
            catch (Exception e)
            {
                FMessage.Log(ELogVerbosity.Error, "Generate code failed. Error: \n" + e);
            }
        }
        private static void GenerateCode(bool timeSliced, string[] args)
        {
            try
            {
                bool invalidArgs = false;

                if (args.Length > 0)
                {
                    if (args[0] == "cancel")
                    {
                        if (timeSlicedCodeGenerator != null && !timeSlicedCodeGenerator.Complete)
                        {
                            timeSlicedCodeGenerator.EndGenerateModules();
                        }
                        timeSlicedCodeGenerator = null;
                        return;
                    }

                    if (timeSlicedCodeGenerator != null)
                    {
                        FMessage.Log("Already generating code");
                        return;
                    }

                    CodeGenerator codeGenerator = null;

                    switch (args[0])
                    {
                    case "game":
                        AssetLoadMode loadMode        = AssetLoadMode.Game;
                        bool          clearAssetCache = false;
                        bool          skipLevels      = false;
                        if (args.Length > 1)
                        {
                            switch (args[1])
                            {
                            case "game":
                                loadMode = CodeGenerator.AssetLoadMode.Game;
                                break;

                            case "engine":
                                loadMode = CodeGenerator.AssetLoadMode.Engine;
                                break;

                            case "all":
                                loadMode = CodeGenerator.AssetLoadMode.All;
                                break;
                            }
                        }
                        if (args.Length > 2)
                        {
                            bool.TryParse(args[2], out clearAssetCache);
                        }
                        if (args.Length > 3)
                        {
                            bool.TryParse(args[3], out skipLevels);
                        }
                        codeGenerator = new CodeGenerator(timeSliced);
                        codeGenerator.GenerateCodeForGame(loadMode, clearAssetCache, skipLevels);
                        break;

                    case "gameplugins":
                        codeGenerator = new CodeGenerator(timeSliced);
                        codeGenerator.GenerateCodeForModules(new UnrealModuleType[] { UnrealModuleType.GamePlugin });
                        break;

                    case "modules":
                        codeGenerator = new CodeGenerator(timeSliced);
                        //codeGenerator.Settings.ExportMode = CodeGeneratorSettings.CodeExportMode.All;
                        //codeGenerator.Settings.ExportAllFunctions = true;
                        //codeGenerator.Settings.ExportAllProperties = true;
                        codeGenerator.GenerateCodeForAllModules();
                        break;

                    case "module":
                        if (args.Length > 1)
                        {
                            codeGenerator = new CodeGenerator(timeSliced);
                            // Tests / using these for types for use in this lib
                            //codeGenerator.Settings.CheckUObjectDestroyed = false;
                            //codeGenerator.Settings.GenerateIsValidSafeguards = false;
                            //codeGenerator.Settings.ExportMode = CodeGeneratorSettings.CodeExportMode.All;
                            //codeGenerator.Settings.ExportAllFunctions = true;
                            //codeGenerator.Settings.ExportAllProperties = true;
                            //codeGenerator.Settings.MergeEnumFiles = false;
                            codeGenerator.GenerateCodeForModule(args[1], true);
                        }
                        else
                        {
                            invalidArgs = true;
                        }
                        break;

                    case "compile":
                        CompileGeneratedCode();
                        break;

                    default:
                        invalidArgs = true;
                        break;
                    }

                    if (!invalidArgs && timeSliced && codeGenerator != null)
                    {
                        timeSlicedCodeGenerator = codeGenerator;
                        Coroutine.StartCoroutine(null, ProcessTimeSlice());
                    }
                }
                else
                {
                    invalidArgs = true;
                }

                if (invalidArgs)
                {
                    FMessage.Log(ELogVerbosity.Warning, "Invalid input. Provide one of the following: game, gameplugins, modules, module [ModuleName], compile");
                }
            }
            catch (Exception e)
            {
                FMessage.Log(ELogVerbosity.Error, "Generate code failed. Error: \n" + e);
            }
        }