private static void CopyFiles(BundleObject bundleobj) { foreach (BundleObject.copyInfo info in bundleobj.copyinfo) { string sourthPath = info.sourthPath; string destPath = info.destPath; if (sourthPath == string.Empty || destPath == string.Empty) { continue; } if (sourthPath == null) { return; } string[] files = Directory.GetFiles(sourthPath, info.filePattern, info.searchOption); foreach (string filePath in files) { if (filePath.EndsWith(".meta")) { continue; } Directory.CreateDirectory(destPath); string newpath = destPath + filePath.Replace(sourthPath, ""); Directory.CreateDirectory(Path.GetDirectoryName(newpath)); File.Copy(sourthPath, newpath, true); } } }
private static List <AssetBundleBuild> GetBundleList(BundleObject bundleobj) { List <AssetBundleBuild> buildList = new List <AssetBundleBuild>(); foreach (BundleObject.bundleInfo info in bundleobj.bundleinfo) { if (string.IsNullOrEmpty(info.bundleName)) { continue; Debug.LogWarning("bundleName is Empty"); } if (info.filePattern == "") { info.filePattern = "*"; } string[] files = Directory.GetFiles("Assets/" + info.searchPath, info.filePattern, info.searchOption); for (int i = 0; i < files.Length; ++i) { files[i] = files[i].Replace("\\", "/"); } AssetBundleBuild abb = new AssetBundleBuild(); abb.assetBundleName = info.bundleName; abb.assetNames = files; buildList.Add(abb); } Debug.LogError(buildList.Count); return(buildList); }
public void Test_RoundTrip() { ClearAll(); Ioc.RegisterSingleton <IMvxStringToTypeParser>(new MvxStringToTypeParser()); var testObject = new BundleObject { TheBool1 = false, TheBool2 = true, TheGuid1 = Guid.NewGuid(), TheGuid2 = new Guid(123, 10, 444, 1, 2, 3, 4, 5, 6, 7, 8), TheInt1 = 123, TheInt2 = 456, TheString1 = "Hello World", TheString2 = null }; var bundle = new MvxBundle(); bundle.Write(testObject); var output = bundle.Read <BundleObject>(); Assert.AreEqual(testObject, output); }
//卸载 private void UnloadBundleObject(BundleObject mainBundleObj) { if (mainBundleObj != null) { string mainBundlePath = mainBundleObj.bundlePath; var dependiencies = GetBundleDependencies(mainBundlePath); foreach (var subBundlePath in dependiencies) { if (m_bundlesMap.TryGetValue(subBundlePath, out var subBundleObj)) { UnLoad(subBundlePath); } } mainBundleObj.Release(); //因为被m_bundlesMap弱引用着,导致无法正确释放 if (mainBundleObj.RefCount == 1) //最后一次是m_bundlesMap的引用 { mainBundleObj.Release(); } if (mainBundleObj.RefCount == 0) { m_bundlesMap.Remove(mainBundlePath); } } }
public void Test_WithReloadState() { _fixture.ClearAll(); _fixture.Ioc.RegisterSingleton <IMvxStringToTypeParser>(new MvxStringToTypeParser()); var testThing = new MockTestThing(); _fixture.Ioc.RegisterSingleton <ITestThing>(testThing); var initBundleObject = new BundleObject { TheBool1 = false, TheBool2 = true, TheGuid1 = Guid.NewGuid(), TheGuid2 = new Guid(123, 10, 444, 1, 2, 3, 4, 5, 6, 7, 8), TheInt1 = 123, TheInt2 = 456, TheString1 = "Hello World", TheString2 = null }; var initBundle = new MvxBundle(); initBundle.Write(initBundleObject); var reloadBundleObject = new BundleObject { TheBool1 = true, TheBool2 = true, TheGuid1 = Guid.NewGuid(), TheGuid2 = new Guid(1123, 10, 444, 1, 2, 3, 4, 5, 6, 7, 8), TheInt1 = 1234, TheInt2 = 4567, TheString1 = "Foo Bar", TheString2 = null }; var reloadBundle = new MvxBundle(); reloadBundle.Write(reloadBundleObject); var toTest = new MvxDefaultViewModelLocator(); var args = new MvxNavigateEventArgs(NavigationMode.Show); IMvxViewModel viewModel = toTest.Load(typeof(Test1ViewModel), initBundle, reloadBundle, args); Assert.NotNull(viewModel); var typedViewModel = (Test1ViewModel)viewModel; Assert.Equal(initBundle, typedViewModel.BundleInit); Assert.Equal(reloadBundle, typedViewModel.BundleState); Assert.Equal(testThing, typedViewModel.Thing); Assert.Equal(initBundleObject, typedViewModel.TheInitBundleSet); Assert.Equal(reloadBundleObject, typedViewModel.TheReloadBundleSet); Assert.Equal(initBundleObject.TheGuid1, typedViewModel.TheInitGuid1Set); Assert.Equal(initBundleObject.TheGuid2, typedViewModel.TheInitGuid2Set); Assert.Equal(initBundleObject.TheString1, typedViewModel.TheInitString1Set); Assert.Equal(reloadBundleObject.TheGuid1, typedViewModel.TheReloadGuid1Set); Assert.Equal(reloadBundleObject.TheGuid2, typedViewModel.TheReloadGuid2Set); Assert.Equal(reloadBundleObject.TheString1, typedViewModel.TheReloadString1Set); Assert.True(typedViewModel.StartCalled); }
public void Test_WithReloadState() { ClearAll(); var testThing = new MockTestThing(); Ioc.RegisterSingleton <ITestThing>(testThing); var initBundleObject = new BundleObject { TheBool1 = false, TheBool2 = true, TheGuid1 = Guid.NewGuid(), TheGuid2 = new Guid(123, 10, 444, 1, 2, 3, 4, 5, 6, 7, 8), TheInt1 = 123, TheInt2 = 456, TheString1 = "Hello World", TheString2 = null }; var initBundle = new MvxBundle(); initBundle.Write(initBundleObject); var reloadBundleObject = new BundleObject { TheBool1 = true, TheBool2 = true, TheGuid1 = Guid.NewGuid(), TheGuid2 = new Guid(1123, 10, 444, 1, 2, 3, 4, 5, 6, 7, 8), TheInt1 = 1234, TheInt2 = 4567, TheString1 = "Foo Bar", TheString2 = null }; var reloadBundle = new MvxBundle(); reloadBundle.Write(reloadBundleObject); var toTest = new MvxDefaultViewModelLocator(); IMvxViewModel viewModel; var result = toTest.TryLoad(typeof(Test1ViewModel), initBundle, reloadBundle, out viewModel); Assert.IsTrue(result); var typedViewModel = (Test1ViewModel)viewModel; Assert.AreSame(initBundle, typedViewModel.BundleInit); Assert.AreSame(reloadBundle, typedViewModel.BundleState); Assert.AreSame(testThing, typedViewModel.Thing); Assert.AreEqual(initBundleObject, typedViewModel.TheInitBundleSet); Assert.AreEqual(reloadBundleObject, typedViewModel.TheReloadBundleSet); Assert.AreEqual(initBundleObject.TheGuid1, typedViewModel.TheInitGuid1Set); Assert.AreEqual(initBundleObject.TheGuid2, typedViewModel.TheInitGuid2Set); Assert.AreEqual(initBundleObject.TheString1, typedViewModel.TheInitString1Set); Assert.AreEqual(reloadBundleObject.TheGuid1, typedViewModel.TheReloadGuid1Set); Assert.AreEqual(reloadBundleObject.TheGuid2, typedViewModel.TheReloadGuid2Set); Assert.AreEqual(reloadBundleObject.TheString1, typedViewModel.TheReloadString1Set); Assert.IsTrue(typedViewModel.StartCalled); }
private void AddBundleObject(string bundlePath, AssetBundle assetBundle) { if (!m_bundlesMap.ContainsKey(bundlePath)) { var bundleObject = new BundleObject(); bundleObject.bundlePath = bundlePath; bundleObject.assetBundle = assetBundle; m_bundlesMap.Add(bundlePath, bundleObject); } }
public void Read(JsonObject Object) { JsonObject[] BundleObjects = Object.GetObjectArrayField(nameof(Entries)); foreach (JsonObject BundleObject in BundleObjects) { Entry Bundle = new Entry(); Bundle.Name = BundleObject.GetStringField(nameof(Bundle.Name)); Bundle.ObjectKey = BundleObject.GetStringField(nameof(Bundle.ObjectKey)); Bundle.Time = DateTime.Parse(BundleObject.GetStringField(nameof(Bundle.Time))); Bundle.CompressedLength = BundleObject.GetIntegerField(nameof(Bundle.CompressedLength)); Bundle.UncompressedLength = BundleObject.GetIntegerField(nameof(Bundle.UncompressedLength)); Entries.Add(Bundle); } }
public void Test_NoReloadState() { _fixture.ClearAll(); _fixture.Ioc.RegisterSingleton <IMvxStringToTypeParser>(new MvxStringToTypeParser()); var testThing = new MockTestThing(); _fixture.Ioc.RegisterSingleton <ITestThing>(testThing); var testObject = new BundleObject { TheBool1 = false, TheBool2 = true, TheGuid1 = Guid.NewGuid(), TheGuid2 = new Guid(123, 10, 444, 1, 2, 3, 4, 5, 6, 7, 8), TheInt1 = 123, TheInt2 = 456, TheString1 = "Hello World", TheString2 = null }; var bundle = new MvxBundle(); bundle.Write(testObject); var navigationService = _fixture.Ioc.Resolve <IMvxNavigationService>(); var toTest = new MvxDefaultViewModelLocator(navigationService); IMvxViewModel viewModel = toTest.Load(typeof(Test1ViewModel), bundle, null); Assert.NotNull(viewModel); var typedViewModel = (Test1ViewModel)viewModel; Assert.Equal(bundle, typedViewModel.BundleInit); Assert.Null(typedViewModel.BundleState); Assert.Equal(testThing, typedViewModel.Thing); Assert.Equal(testObject, typedViewModel.TheInitBundleSet); Assert.Null(typedViewModel.TheReloadBundleSet); Assert.Equal(testObject.TheGuid1, typedViewModel.TheInitGuid1Set); Assert.Equal(testObject.TheGuid2, typedViewModel.TheInitGuid2Set); Assert.Equal(testObject.TheString1, typedViewModel.TheInitString1Set); Assert.Equal(Guid.Empty, typedViewModel.TheReloadGuid1Set); Assert.Equal(Guid.Empty, typedViewModel.TheReloadGuid2Set); Assert.Null(typedViewModel.TheReloadString1Set); Assert.True(typedViewModel.StartCalled); }
public static void BuildBundle(BundleObject bundleobj) { if (bundleobj.forceRebuild && Directory.Exists(bundleobj.outPath)) { Directory.Delete(bundleobj.outPath, true); //判断要不要重新生成StreamingAssets } Directory.CreateDirectory(bundleobj.outPath); AssetDatabase.Refresh(); CopyFiles(bundleobj); AssetDatabase.Refresh(); BuildPipeline.BuildAssetBundles(bundleobj.outPath, GetBundleList(bundleobj).ToArray(), BuildAssetBundleOptions.DeterministicAssetBundle, bundleobj.target); if (bundleobj.filetxtName != null) { CreateFileList(bundleobj.outPath, bundleobj.filetxtName); } AssetDatabase.Refresh(); Debug.Log("Build Complete"); }
private IEnumerator CheckAssetBundles(bool offlineMode = false) { if (this.checkAssetBundleCount == 0) { Bundle.bundleObjects = new Dictionary <string, BundleObject>(); } Bundle.initialized = false; this.checkAssetBundleCount++; for (int i = 0; i < this.assetBundles.Count; i++) { string bundleId = this.assetBundles[i].assetBundleId; BundleObject bo; if (Bundle.bundleObjects.ContainsKey(bundleId)) { bo = Bundle.bundleObjects[bundleId]; } else { bo = new BundleObject(bundleId, "unity3d", this.assetBundles[i].loadAtStart, string.Empty); } string path = Path.Combine(UnityEngine.Application.streamingAssetsPath, "AssetBundles/" + bo.BundleFileName); bo.SetBundleLocation(path); if (!Bundle.bundleObjects.ContainsKey(bundleId)) { Bundle.bundleObjects.Add(bundleId, bo); } } foreach (KeyValuePair <string, BundleObject> keyValuePair2 in Bundle.bundleObjects) { if (keyValuePair2.Value.LoadAtStart) { string bundleId = keyValuePair2.Key; base.StartCoroutine(this.LoadAssetBundle(bundleId, delegate { this.BundleLoaded(bundleId); })); } } Bundle.checkingBundles = false; yield break; }
public void Test_FillArguments() { ClearAll(); Ioc.RegisterSingleton <IMvxStringToTypeParser>(new MvxStringToTypeParser()); var testObject = new BundleObject { TheBool1 = false, TheBool2 = true, TheGuid1 = Guid.NewGuid(), TheGuid2 = new Guid(123, 10, 444, 1, 2, 3, 4, 5, 6, 7, 8), TheInt1 = 123, TheInt2 = 456, TheString1 = "Hello World", TheString2 = "Goo" }; var bundle = new MvxBundle(); bundle.Write(testObject); var method = GetType().GetMethod("TestFunction"); var args = bundle.CreateArgumentList(method.GetParameters(), "ignored debug text"); var output = method.Invoke(this, args.ToArray()); var expected = new BundleObject { TheBool1 = false, TheBool2 = true, TheGuid1 = Guid.Empty, TheGuid2 = new Guid(123, 10, 444, 1, 2, 3, 4, 5, 6, 7, 8), TheInt1 = 0, TheInt2 = 456, TheString1 = "Hello World", TheString2 = null }; Assert.AreEqual(expected, output); }
private IEnumerator LoadAssetBundle(string bundleId, Action onFinish) { if (Bundle.bundleObjects == null || !Bundle.bundleObjects.ContainsKey(bundleId)) { yield break; } BundleObject bo = Bundle.bundleObjects[bundleId]; if (bo.IsAssetBundleInMemory) { if (onFinish != null) { onFinish(); } yield break; } string path = bo.BundleLocation; if (!string.IsNullOrEmpty(path)) { AssetBundleCreateRequest request = AssetBundle.LoadFromFileAsync(path); yield return(request); AssetBundle assetBundle = request.assetBundle; if (assetBundle != null) { assetBundle.name = bo.BundleId; bo.SetLoadedBundle(assetBundle); if (onFinish != null) { onFinish(); } } } yield break; }