// 异步加载资源 public bool loadAssetAsync(ref string fileNameWithSuffix, AssetLoadDoneCallback callback, object userData) { if (!mAssetList.ContainsKey(fileNameWithSuffix)) { return(false); } // 如果当前资源包还未加载完毕,则需要等待资源包加载完以后才能加载资源 if (mLoaded == LOAD_STATE.LS_UNLOAD || mLoaded == LOAD_STATE.LS_LOADING) { // 记录下需要异步加载的资源名 if (!mLoadAsyncList.ContainsKey(fileNameWithSuffix)) { AsyncLoadInfo loadInfo = new AsyncLoadInfo(); loadInfo.mAssetInfo = mAssetList[fileNameWithSuffix]; loadInfo.mCallback = callback; loadInfo.mUserData = userData; mLoadAsyncList.Add(fileNameWithSuffix, loadInfo); } else { logError("asset is loading, can not load asset async again! name : " + fileNameWithSuffix); return(false); } if (mLoaded == LOAD_STATE.LS_UNLOAD) { loadAssetBundleAsync(null); } } // 如果资源包已经加载,则可以直接异步加载资源 else { callback(mAssetList[fileNameWithSuffix].mAssetObject, null, userData); } return(true); }
private UniTask <AnimationGroup> ReturnExistingAsync() { Debug.Assert(_asyncLoadInfo != null); var resName = commonResourceProperties.cameraResourceName; return(AsyncLoadInfo.ReturnExistingAsync(_asyncLoadInfo, $"Failed to load camera animation for {resName}.")); }
private static void InitializeTreeAsync(AsyncLoadInfo ali) { string nodeText = string.IsNullOrEmpty(ali.Error) ? StaticMyMeta.DriverString : ali.Error; TreeNode serverNode = new TreeNode("MyMeta (" + nodeText + ")"); serverNode.Tag = new NodeData(NodeType.MYMETA, StaticMyMeta); serverNode.SelectedImageIndex = serverNode.ImageIndex = 21; ali.RootNode.Nodes.Add(serverNode); if (!string.IsNullOrEmpty(ali.Error)) { // There's an error when trying to connect, let's bail with the error text in the node serverNode.Expand(); } else if (StaticMyMeta.Databases != null) { try { TreeNode databasesNode = new TreeNode("Databases"); databasesNode.Tag = new NodeData(NodeType.DATABASES, StaticMyMeta.Databases); databasesNode.SelectedImageIndex = databasesNode.ImageIndex = 0; serverNode.Nodes.Add(databasesNode); //foreach (IDatabase database in ali.MyMeta.Databases) foreach (IDatabase database in StaticMyMeta.Databases) { TreeNode dbNode = new TreeNode(database.Name); dbNode.Tag = new NodeData(NodeType.DATABASE, database); dbNode.SelectedImageIndex = dbNode.ImageIndex = 1; dbNode.Nodes.Add(ali.BlankNode); databasesNode.Nodes.Add(dbNode); } serverNode.Expand(); databasesNode.Expand(); } catch (Exception ex) { if (serverNode != null) { serverNode.Text = "MyMeta (" + ex.Message + " )"; } } } }
public async UniTask <AssetBundle> LoadFromRelativePathAsync([NotNull] string relativePath) { AsyncLoadInfo <AssetBundle> info = null; bool wasAdded; lock (this) { wasAdded = _bundles.ContainsKey(relativePath); } if (wasAdded) { return(await ReturnExistingAsync(relativePath)); } // Double lock lock (this) { wasAdded = _bundles.ContainsKey(relativePath); if (!wasAdded) { info = new AsyncLoadInfo <AssetBundle>(); _bundles.Add(relativePath, info); } } if (wasAdded) { return(await ReturnExistingAsync(relativePath)); } Debug.Assert(info != null); AssetBundle bundle; try { bundle = await LoadFromRelativePathInternalAsync(relativePath); } catch (Exception ex) { info.Fail(ex); throw; } info.Success(bundle); return(bundle); }
public void SetupAsync() { if (IsTreeBusy) { return; } this.toolBar1.Enabled = false; this.Text = "MyMeta Browser (" + DefaultSettings.Instance.DbDriver + ")"; static_rootNode = new TreeNode(); this.MyTree.BeginUpdate(); this.MyTree.Nodes.Clear(); this.MyTree.Nodes.Add(loadingNode); this.MyTree.EndUpdate(); this.MyTree.Invalidate(); loadingNode.ImageIndex = 26; loadingNode.SelectedImageIndex = loadingNode.ImageIndex; this.MyTree.Invalidate(); timerIconAnimate.Start(); // RESET MYMETA! StaticMyMeta = null; AsyncLoadInfo ali = new AsyncLoadInfo(); ali.RootNode = static_rootNode; ali.ShowSystemEntities = this.chkSystem.Checked; ali.Error = string.Empty; this.Invalidate(); this.Refresh(); ParameterizedThreadStart ts = new ParameterizedThreadStart(SetupAndBuildNodeTree); asyncres = ts.BeginInvoke(ali, new AsyncCallback(SetupAsyncCompleted), null); }
private static void SetupAndBuildNodeTree(object parentObj) { AsyncLoadInfo ali = parentObj as AsyncLoadInfo; DefaultSettings settings = DefaultSettings.Instance; //Setup try { if (string.IsNullOrEmpty(ali.Error)) { StaticMyMeta.Connect(settings.DbDriver, settings.ConnectionString); StaticMyMeta.ShowDefaultDatabaseOnly = settings.ShowDefaultDatabaseOnly; StaticMyMeta.LanguageMappingFileName = settings.LanguageMappingFile; StaticMyMeta.Language = settings.Language; StaticMyMeta.DbTargetMappingFileName = settings.DbTargetMappingFile; StaticMyMeta.DbTarget = settings.DbTarget; StaticMyMeta.UserMetaDataFileName = settings.UserMetaDataFileName; StaticMyMeta.DomainOverride = settings.DomainOverride; StaticMyMeta.ShowSystemData = ali.ShowSystemEntities; StaticMyMeta.UserDataDatabaseMappings.Clear(); foreach (string key in settings.DatabaseUserDataXmlMappings.Keys) { StaticMyMeta.UserDataDatabaseMappings[key] = settings.DatabaseUserDataXmlMappings[key]; } } } catch (Exception ex) { ali.Error = ex.Message; } //build tree InitializeTreeAsync(ali); }
private async UniTask <AnimationGroup> LoadClipsAsync(CameraControlMode cameraControlMode) { if (_asyncLoadInfo != null) { return(await ReturnExistingAsync()); } AsyncLoadInfo <AnimationGroup> info = null; lock (this) { if (_asyncLoadInfo == null) { info = new AsyncLoadInfo <AnimationGroup>(); _asyncLoadInfo = info; } } if (info == null) { return(await ReturnExistingAsync()); } var songResourceName = commonResourceProperties.cameraResourceName; if (string.IsNullOrWhiteSpace(songResourceName)) { info.Fail(); throw new FormatException("Song resource name is empty."); } var camAssetName = $"cam_{songResourceName}"; var camBundle = await bundleLoader.LoadFromRelativePathAsync($"{camAssetName}.imo.unity3d"); AnimationClip mainCamera; { var camAssetPath = $"assets/imas/resources/exclude/imo/camera/{songResourceName}/{camAssetName}_cam.imo.asset"; var mainCamData = camBundle.LoadAsset <CharacterImasMotionAsset>(camAssetPath); switch (cameraControlMode) { case CameraControlMode.Direct: mainCamera = CameraAnimation.CreateClipForCamera(mainCamData, camAssetName); break; case CameraControlMode.Indirect: mainCamera = CameraAnimation.CreateIndirectClip(mainCamData, camAssetName); break; default: throw new ArgumentOutOfRangeException(nameof(cameraControlMode), cameraControlMode, null); } } AnimationClip LoadAppealMotion(string postfix) { // For portrait variations: ".../{camAssetName}_tate_{postfix}.imo.asset" var assetPath = $"assets/imas/resources/exclude/imo/camera/{songResourceName}/{camAssetName}_{postfix}.imo.asset"; if (!camBundle.Contains(assetPath)) { return(null); } var motionData = camBundle.LoadAsset <CharacterImasMotionAsset>(assetPath); AnimationClip result; switch (cameraControlMode) { case CameraControlMode.Direct: result = CameraAnimation.CreateClipForCamera(motionData, $"{camAssetName}_{postfix}"); break; case CameraControlMode.Indirect: result = CameraAnimation.CreateIndirectClip(motionData, $"{camAssetName}_{postfix}"); break; default: throw new ArgumentOutOfRangeException(nameof(cameraControlMode), cameraControlMode, null); } return(result); } var specialAppeal = LoadAppealMotion("apg"); var anotherAppeal = LoadAppealMotion("apa"); var gorgeousAppeal = LoadAppealMotion("bpg"); var group = new AnimationGroup(mainCamera, specialAppeal, anotherAppeal, gorgeousAppeal); info.Success(group); return(group); }
public void SetupAsync() { if (IsTreeBusy) return; this.toolBar1.Enabled = false; this.Text = "MyMeta Browser (" + DefaultSettings.Instance.DbDriver + ")"; static_rootNode = new TreeNode(); this.MyTree.BeginUpdate(); this.MyTree.Nodes.Clear(); this.MyTree.Nodes.Add(loadingNode); this.MyTree.EndUpdate(); this.MyTree.Invalidate(); loadingNode.ImageIndex = 26; loadingNode.SelectedImageIndex = loadingNode.ImageIndex; this.MyTree.Invalidate(); timerIconAnimate.Start(); // RESET MYMETA! StaticMyMeta = null; AsyncLoadInfo ali = new AsyncLoadInfo(); ali.RootNode = static_rootNode; ali.ShowSystemEntities = this.chkSystem.Checked; ali.Error = string.Empty; this.Invalidate(); this.Refresh(); ParameterizedThreadStart ts = new ParameterizedThreadStart(SetupAndBuildNodeTree); asyncres = ts.BeginInvoke(ali, new AsyncCallback(SetupAsyncCompleted), null); }
private async UniTask <AnimationGroup> LoadClipsAsync() { if (_asyncLoadInfo != null) { return(await ReturnExistingAsync()); } AsyncLoadInfo <AnimationGroup> info = null; lock (this) { if (_asyncLoadInfo == null) { info = new AsyncLoadInfo <AnimationGroup>(); _asyncLoadInfo = info; } } if (info == null) { return(await ReturnExistingAsync()); } var songResourceName = commonResourceProperties.danceResourceName; if (string.IsNullOrWhiteSpace(songResourceName)) { info.Fail(); throw new FormatException("Song resource name is empty."); } if (placement.motionNumber < MltdSimulationConstants.MinDanceMotion || placement.motionNumber > MltdSimulationConstants.MaxDanceMotion) { info.Fail(); throw new FormatException($"Invalid motion number: {placement.motionNumber}, should be {MltdSimulationConstants.MinDanceMotion} to {MltdSimulationConstants.MaxDanceMotion}."); } if (placement.formationNumber < MltdSimulationConstants.MinDanceFormation || placement.motionNumber > MltdSimulationConstants.MaxDanceFormation) { info.Fail(); throw new FormatException($"Invalid formation number: {placement.motionNumber}, should be {MltdSimulationConstants.MinDanceFormation} to {MltdSimulationConstants.MaxDanceFormation}."); } var danceAssetName = $"dan_{songResourceName}_{placement.motionNumber:00}"; if (!DanceAssetNameRegex.IsMatch(danceAssetName)) { info.Fail(); throw new FormatException($"\"{danceAssetName}\" is not a valid dance asset name."); } var mainDanceBundle = await bundleLoader.LoadFromRelativePathAsync($"{danceAssetName}.imo.unity3d"); AssetBundle appealBundle = null; bool? appealBundleFound = null; AnimationClip mainDance; { var assetPath = $"assets/imas/resources/exclude/imo/dance/{songResourceName}/{danceAssetName}_dan.imo.asset"; var motionData = mainDanceBundle.LoadAsset <CharacterImasMotionAsset>(assetPath); mainDance = await DanceAnimation.CreateAsync(motionData, danceAssetName); } async UniTask <AnimationClip> LoadAppealMotionAsync(string postfix) { var appealAssetName = $"dan_{songResourceName}_{placement.formationNumber:00}"; AnimationClip result; var assetPath = $"assets/imas/resources/exclude/imo/dance/{songResourceName}/{appealAssetName}_{postfix}.imo.asset"; if (mainDanceBundle.Contains(assetPath)) { var motionData = mainDanceBundle.LoadAsset <CharacterImasMotionAsset>(assetPath); result = await DanceAnimation.CreateAsync(motionData, $"{appealAssetName}_{postfix}"); } else { if (appealBundleFound.HasValue) { if (!appealBundleFound.Value) { return(null); } } else { bool found; (appealBundle, found) = await TryLoadExternalAppealBundleAsync(); appealBundleFound = found; } if (appealBundle != null && appealBundle.Contains(assetPath)) { var motionData = appealBundle.LoadAsset <CharacterImasMotionAsset>(assetPath); result = await DanceAnimation.CreateAsync(motionData, $"{appealAssetName}_{postfix}"); } else { result = null; } } return(result); } var specialAppeal = await LoadAppealMotionAsync("apg"); var anotherAppeal = await LoadAppealMotionAsync("apa"); var gorgeousAppeal = await LoadAppealMotionAsync("bpg"); var animationGroup = new AnimationGroup(mainDance, specialAppeal, anotherAppeal, gorgeousAppeal); info.Success(animationGroup); return(animationGroup); }