代码之家  ›  专栏  ›  技术社区  ›  Fattie

在UnityBuildPostProcessor中,您如何精确地“复制”一个文件?

  •  0
  • Fattie  · 技术社区  · 6 年前

    在Unity中,我只有一个文件a file.ts,存放在资产中/

    enter image description here

    在构建的Xcode中,我只希望它位于项目中包含的项目文件夹(实际上,任何地方都可以)中。

    enter image description here

    你用

        project.AddFileToBuild(g, something something something);
    

    但我很清楚 不明白 .

    (很明显,它在Unity中完全没有文档。)

    怎么做到的?只需一个简单的文件—实际上将其从assets/filename复制到xcode项目(它将具有目标成员资格并位于主包中)。

    下面是一个完美的Unity Build Post-Script BuildPostProcessor.cs,它令人惊叹,并且可以执行其他所有操作:

    https://stackoverflow.com/a/54370793/294884

    但我不能复制一个该死的文件!如何?


    注-备选方案

    注意事项。如果你只是把一个文件放在Unity名字不好的magic文件夹中:

    /流式资产

    事实上,它做的正是这个QA中讨论的事情。

    1. 团结…在/streamingassets中有一个文件music.mp4或mesh.txt
    2. 构建到XCODE
    3. 在Xcode项目中,目标中包含music.mp4或mesh.txt。
    4. iOS的位置是…

    无论出于何种原因,iOS上的文件夹名都变为:/data/raw

    因此,您的低级别IOS侧代码是:

    而不是,例如:

    CFURLRef imageURL = CFBundleCopyResourceURL(
      mainBundle, CFSTR("music"), CFSTR("mp4"), NULL);
    

    你将拥有:

    CFURLRef imageURL = CFBundleCopyResourceURL(
      mainBundle, CFSTR("Data/Raw/music"), CFSTR("mp4"), NULL);
    

    那很好。但我们当然可以学习如何使用“.addfiletobuild”,这似乎是为了这个目的而存在的。

    2 回复  |  直到 6 年前
        1
  •  2
  •   Kuba Jurek    6 年前

    我让它有点工作(仍然是xcode突出显示红色文件夹),但我的插件正确识别这个文件

    您必须将文件添加到/streamingassets文件夹,这将使您的文件实际显示在xcode项目的“data/raw/”路径中。然后将此代码添加到[PostprocessBuild]函数中

        PBXProject project = new PBXProject();
        string sPath = PBXProject.GetPBXProjectPath(pathToBuiltProject);
        project.ReadFromFile(sPath);
        string tn = PBXProject.GetUnityTargetName();
        string g = project.TargetGuidByName(tn);
    
        project.AddFileToBuild(g, project.AddFile("Data/Raw/<YourFile.png>", "<YourPathInXcodeProject>/<YourFile.png>"));
    
        File.WriteAllText(sPath, project.WriteToString());
    

    这将将您的文件添加到“黄色”文件夹中的期望路径,而不是“蓝色”类/流资产的剂量。

    [我不是xcode的专家,但我注意到在“蓝色”文件夹中,用于更改应用程序图标的功能找不到它们,只有在将我的可选图标添加到黄色文件夹xcode之后,xcode才高兴地识别为文件]

        2
  •  1
  •   Fattie    6 年前

    FTR确实偶然发现了一些Unity示例代码(在一个不相关的示例项目中),这可能会有所帮助。

    public class MyBuildPostprocessor
    {
        // Build postprocessor. Currently only needed on:
        // - iOS: no dynamic libraries, so plugin source files have to be copied into Xcode project
        [PostProcessBuild]
        public static void OnPostprocessBuild(BuildTarget target, string pathToBuiltProject)
        {
            if (target == BuildTarget.iOS)
                OnPostprocessBuildIOS(pathToBuiltProject);
        }
    
        private static void OnPostprocessBuildIOS(string pathToBuiltProject)
        {
            // We use UnityEditor.iOS.Xcode API which only exists in iOS editor module
            #if UNITY_IOS
    
            string projPath = pathToBuiltProject + "/Unity-iPhone.xcodeproj/project.pbxproj";
    
            UnityEditor.iOS.Xcode.PBXProject proj = new UnityEditor.iOS.Xcode.PBXProject();
            proj.ReadFromString(File.ReadAllText(projPath));
            string target = proj.TargetGuidByName("Unity-iPhone");
    
            Directory.CreateDirectory(Path.Combine(pathToBuiltProject, "Libraries/Unity"));
    
            string[] filesToCopy = new string[]
            {
                "PlatformBase.h",
                "RenderAPI_Metal.mm",
                "RenderAPI_OpenGLCoreES.cpp",
                "RenderAPI.cpp",
                "RenderAPI.h",
                "RenderingPlugin.cpp",
            };
    
            for(int i = 0 ; i < filesToCopy.Length ; ++i)
            {
                var srcPath = Path.Combine("../PluginSource/source", filesToCopy[i]);
                var dstLocalPath = "Libraries/" + filesToCopy[i];
                var dstPath = Path.Combine(pathToBuiltProject, dstLocalPath);
                File.Copy(srcPath, dstPath, true);
                proj.AddFileToBuild(target, proj.AddFile(dstLocalPath, dstLocalPath));
            }
    
            File.WriteAllText(projPath, proj.WriteToString());
            #endif // #if UNITY_IOS
        }
    }
    
    推荐文章