Ejemplo n.º 1
0
 // 异步加载资源
 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);
 }
Ejemplo n.º 2
0
        private UniTask <AnimationGroup> ReturnExistingAsync()
        {
            Debug.Assert(_asyncLoadInfo != null);
            var resName = commonResourceProperties.cameraResourceName;

            return(AsyncLoadInfo.ReturnExistingAsync(_asyncLoadInfo, $"Failed to load camera animation for {resName}."));
        }
Ejemplo n.º 3
0
        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 + " )";
                    }
                }
            }
        }
Ejemplo n.º 4
0
        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);
        }
Ejemplo n.º 5
0
        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);
        }
Ejemplo n.º 6
0
        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);
        }
Ejemplo n.º 7
0
        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);
        }
Ejemplo n.º 8
0
        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 + " )";
                    }
                }
            }
        }
Ejemplo n.º 9
0
        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);
        }
Ejemplo n.º 10
0
        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);
        }