在 Unity BuildPostProcessor 中,您如何简单地 "copy over" 一个文件?

In Unity BuildPostProcessor, how exactly do you, simply, "copy over" one file?

在 Unity 中我只有一个文件,afile.ts,位于 Assets/

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

你使用

    project.AddFileToBuild(g, something something something);

可是我明明想不通.

(显然它在 Unity 中完全没有记录。)

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

这是一个完美的 Unity 构建 post 脚本 BuildPostProcessor.cs,它很棒并且可以做其他所有事情:

但是我不能复制一个该死的文件!怎么做?


注意 - 备选方案

注意。如果你只是简单地将一个文件放在 Unity 命名错误的 magic 文件夹中:

/StreamingAssets

事实上,它所做的正是本 QA 中讨论的内容。

  1. Unity .. 在 /StreamingAssets
  2. 中有文件 music.mp4 或 mesh.txt
  3. 构建到 Xcode
  4. 您将在 Xcode 项目中拥有 music.mp4 或 mesh.txt,包含在 Target
  5. 并且 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”。

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
    }
}

我有点用了(仍然 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());

这会将您的文件添加到 "yellow" 文件夹中的所需路径,而不是像 /StreamingAssets dose "blue" 这样的文件夹。

[我不是 Xcode 方面的专家,但我注意到在 "blue" 文件夹中找不到用于更改应用程序图标的功能,只有在将我的替代图标添加到黄色文件夹后 Xcode 很高兴识别为文件]