public async Task SetObjectToEdit(ResourceEditorContext context)
        {
            if (context.ResInfo == null)
            {
                return;
            }

            await Particle_Client.Viewport.WaitInitComplated();

            SetBinding(TitleProperty, new Binding("ResourceName")
            {
                Source = context.ResInfo, Converter = new EditorCommon.Converter.RNameConverter_PureName()
            });

            await Particle_Client.SetObjectToEdit();

            // ResInfo 可能在不同的线程生成的,所以这里强制读取一下文件
            CurrentResourceInfo = await EditorCommon.Resources.ResourceInfoManager.Instance.CreateResourceInfoFromFile(context.ResInfo.AbsInfoFileName, context.ResInfo.ParentBrowser) as Macross.ResourceInfos.MacrossResourceInfo;

            CurrentParticleResourceInfo = CurrentResourceInfo as ParticleResourceInfo;
            UpdateUndoRedoKey();

            Particle_Client.CurrentResourceInfo = CurrentResourceInfo;
            //var ddd = new EngineNS.Bricks.Particle.McParticleEffector();
            await Particle_Client.Load();


            string filename = CurrentResourceInfo.AbsInfoFileName.Replace(CurrentResourceInfo.AbsPath, "").Replace(".macross.rinfo", "");
            string csname   = CurrentResourceInfo.ResourceName.Address + "/" + filename + "_Client.cs";

            if (!EngineNS.CEngine.Instance.FileManager.FileExists(csname))
            {
                await Save();
            }
            else
            {
                if (CurrentParticleResourceInfo.NeedRefresh)
                {
                    await CompileCode(EngineNS.EPlatformType.PLATFORM_WIN);

                    CurrentParticleResourceInfo.NeedRefresh = false;
                    await CurrentParticleResourceInfo.Save();
                }
                //await CompileCode(EngineNS.EPlatformType.PLATFORM_WIN);
                string         pfxcs   = CurrentResourceInfo.AbsInfoFileName.Replace(".rinfo", "");
                EngineNS.RName pfxname = EngineNS.RName.GetRName(pfxcs.Replace(CEngine.Instance.FileManager.ProjectContent, ""));

                await Particle_Client.AddPfxMacross(pfxname);
            }

            //await CompileCode(EngineNS.EPlatformType.PLATFORM_WIN);
        }
Пример #2
0
        public override async Task <ResourceInfo> CreateEmptyResource(string absFolder, string rootFolder, IResourceCreateData createData)
        {
            await EngineNS.Thread.AsyncDummyClass.DummyFunc();

            var result = new ParticleResourceInfo();

            var data = createData as ParticleCreateData;
            //result.CenterDataTypeName = data.CenterDataTypeName;
            var reName = EngineNS.CEngine.Instance.FileManager._GetRelativePathFromAbsPath(absFolder + "/" + data.ResourceName, rootFolder);

            reName += EngineNS.CEngineDesc.MacrossExtension;
            result.ResourceName      = EngineNS.RName.GetRName(reName, data.RNameType);
            result.BaseTypeIsMacross = data.IsMacrossType;
            if (result.BaseTypeIsMacross)
            {
                result.BaseTypeSaveName = data.ClassType.FullName;
                var baseResInfo = await GetBaseMacrossResourceInfo(this);

                if (baseResInfo != null)
                {
                    ReferenceRNameList.Add(baseResInfo.ResourceName);
                }
            }
            else
            {
                result.BaseTypeSaveName = EngineNS.Rtti.RttiHelper.GetTypeSaveString(data.ClassType);
            }
            result.ResourceType = EngineNS.Editor.Editor_RNameTypeAttribute.Macross;


            //拷贝模板
            if (string.IsNullOrEmpty(data.TemplateName) == false)
            {
                string newfolder = result.ResourceName.Address;

                string tempfolder = RName.GetRName(data.TemplateName).Address;
                EngineNS.CEngine.Instance.FileManager.CreateDirectory(newfolder);
                EngineNS.CEngine.Instance.FileManager.CopyDirectory(tempfolder, newfolder);
                //EngineNS.CEngine.Instance.FileManager.DeleteFile(newfolder + "/particle1_Client.cs");
                //string newcsname = newfolder + "/" + data.ResourceName + "_Client.cs";
                //if (EngineNS.CEngine.Instance.FileManager.FileExists(newcsname))
                //{
                //    EngineNS.CEngine.Instance.FileManager.DeleteFile(newcsname);
                //}

                var csfiles = EngineNS.CEngine.Instance.FileManager.GetFiles(newfolder, "*.cs", System.IO.SearchOption.AllDirectories);
                if (csfiles != null && csfiles.Count != 0)
                {
                    for (int i = 0; i < csfiles.Count; i++)
                    {
                        if (EngineNS.CEngine.Instance.FileManager.FileExists(csfiles[i]))
                        {
                            EngineNS.CEngine.Instance.FileManager.DeleteFile(csfiles[i]);
                        }
                    }
                }
            }


            // 创建时走一遍编译,保证当前Macross能够取到this类型
            var csType        = ECSType.Client;
            var codeGenerator = new CodeGenerator();
            var ctrl          = new ParticleMacrossLinkControl();

            ctrl.CurrentResourceInfo = result;
            ctrl.CSType = csType;
            var codeStr = await codeGenerator.GenerateCode(result, ctrl);

            if (!EngineNS.CEngine.Instance.FileManager.DirectoryExists(result.ResourceName.Address))
            {
                EngineNS.CEngine.Instance.FileManager.CreateDirectory(result.ResourceName.Address);
            }
            var codeFile = $"{result.ResourceName.Address}/{result.ResourceName.PureName()}_{csType.ToString()}.cs";

            using (var fs = new System.IO.FileStream(codeFile, System.IO.FileMode.Create, System.IO.FileAccess.ReadWrite, System.IO.FileShare.ReadWrite))
            {
                fs.Write(System.Text.Encoding.Default.GetBytes(codeStr), 0, Encoding.Default.GetByteCount(codeStr));
            }
            await codeGenerator.GenerateAndSaveMacrossCollector(csType);

            var files = codeGenerator.CollectionMacrossProjectFiles(csType);

            codeGenerator.GenerateMacrossProject(files.ToArray(), csType);
            EditorCommon.Program.BuildGameDll(true);
            return(result);
        }