Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Unity BuildPostProcessor中,如何简单地“复制”一个文件?_C#_Unity3d_Automation_Unity3d Native Plugins - Fatal编程技术网

C# 在Unity BuildPostProcessor中,如何简单地“复制”一个文件?

C# 在Unity BuildPostProcessor中,如何简单地“复制”一个文件?,c#,unity3d,automation,unity3d-native-plugins,C#,Unity3d,Automation,Unity3d Native Plugins,在Unity中,我只是在资产中有一个文件afile.ts/ 在构建的Xcode中,我只是希望它放在项目文件夹中——实际上,项目中的任何地方都可以 你可以使用 project.AddFileToBuild(g, something something something); 但我实在想不出来 很明显,它在Unity是完全没有记录的 怎么做的?仅仅是一个简单的文件——实际上是将它从Assets/filename复制到Xcode项目,它将拥有目标成员资格,并位于主捆绑包中 下面是一个完美的U

在Unity中,我只是在资产中有一个文件afile.ts/

在构建的Xcode中,我只是希望它放在项目文件夹中——实际上,项目中的任何地方都可以

你可以使用

    project.AddFileToBuild(g, something something something);
但我实在想不出来

很明显,它在Unity是完全没有记录的

怎么做的?仅仅是一个简单的文件——实际上是将它从Assets/filename复制到Xcode项目,它将拥有目标成员资格,并位于主捆绑包中

下面是一个完美的Unity build post script BuildPostProcessor.cs,它令人惊叹,并完成了所有其他功能:

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

注:备选方案 注意。如果您非常简单地将一个文件放入Unity名称不正确的magic文件夹:

/流线型资产 事实上,它正是本QA中讨论的内容

团结一致在/StreamingAssets中有一个文件music.mp4或mesh.txt 编译到Xcode 您将在Xcode项目中拥有music.mp4或mesh.txt,并包含在目标中 而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
    }
}

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/path中。然后将此代码添加到[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());
这会将您的文件添加到黄色文件夹中的所需路径,而不是像/StreamingAssets那样的蓝色文件夹


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

我得到了它,但Xcode仍以红色突出显示文件夹,但我的插件正确识别了该文件

您必须将文件添加到/StreamingAssets文件夹,这将使您的文件实际显示在Xcode项目的Data/Raw/path中。然后将此代码添加到[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());
这会将您的文件添加到黄色文件夹中的所需路径,而不是像/StreamingAssets那样的蓝色文件夹


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

以前从未使用过,所以出于好奇。是否有理由使用project.AddFiletoBuild方法?它的文档记录确实很差,而且您似乎正确地使用了它。。。而不是直接使用System.Io.file.Copy复制文件?乍一看,它似乎只是一个直接的副本,并没有修改它?为了理智起见,您确定所有值都设置正确了吗?我唯一能找到的其他文档就是这个例子。如果您还没有看到它,它可能会有一些用处。下面是我在AddFileToBuild中找到的一些随机文件。。令人困惑的是,有些人似乎将其用于框架——事实上,AddFrameworkToProject完美地做到了这一点……或者。。。没有人知道如何使用它。。顺便说一句@remy_rm看起来您可以使用StreamingAssets解决此问题。。我编辑了几句话:以前没有人用过这个,所以只是出于好奇。是否有理由使用project.AddFiletoBuild方法?它的文档记录确实很差,而且您似乎正确地使用了它。。。而不是直接使用System.Io.file.Copy复制文件?乍一看,它似乎只是一个直接的副本,并没有修改它?为了理智起见,您确定所有值都设置正确了吗?我唯一能找到的其他文档就是这个例子。如果您还没有看到它,它可能会有一些用处。下面是我在AddFileToBuild中找到的一些随机文件。。令人困惑的是,有些人似乎将其用于框架——事实上,AddFrameworkToProject完美地做到了这一点……或者。。。没有人知道如何使用它。。顺便说一句@remy_rm看起来您可以使用StreamingAssets解决此问题。。我在上面编辑了几句话:Oactually yes Kuba-注意,我在底部提到,作为替代,您可以使用StreamingAssets/文件夹!谢谢没错。但在我的例子中,仅仅将文件添加到StreamingAssets文件夹是不够的。因为由于某些原因,若你们想使用该功能更改应用程序图标,你们的文件必须在黄色文件夹中。这个函数恰好是这样做的。我希望它能帮助一些人你好,库巴!对,如果您确实想使用StreamingAssets/。一种可能性是注意
在Xcode中,文件以:/Data/Raw结尾。所以它就像:。。主束/Data/Raw/filename.txt。实际上,您可以在iOS中从main bundle/Data/Raw/位置访问它。是的,它确实已经添加到目标中,但找到它的位置就是那个奇怪的位置,/Data/Raw.Hi Fattie,是的位置很奇怪,您可以使用此函数更改它add reference,第一个参数是从项目到文件位置的相对路径,第二个是相对路径,您希望在Unity生成的项目中添加引用。因此,如果您不想添加特定于您的建筑位置的相同奇怪的相对路径,使用StreamingAssets功能将此文件添加到Data/Raw更容易注意:您可以更改要添加的文件的名称。顺便说一句,请注意我输入的答案。这是另一种使用不同命令将文件复制到某处的方法。这可能会有帮助!:实际上是的,库巴-注意,我在底部提到,作为替代方案,您可以使用StreamingAssets/文件夹!谢谢没错。但在我的例子中,仅仅将文件添加到StreamingAssets文件夹是不够的。因为由于某些原因,若你们想使用该功能更改应用程序图标,你们的文件必须在黄色文件夹中。这个函数恰好是这样做的。我希望它能帮助一些人你好,库巴!对,如果您确实想使用StreamingAssets/。一种可能性是,请注意,在Xcode中,文件以:/Data/Raw结尾。所以它就像:。。主束/Data/Raw/filename.txt。实际上,您可以在iOS中从main bundle/Data/Raw/位置访问它。是的,它确实已经添加到目标中,但找到它的位置就是那个奇怪的位置,/Data/Raw.Hi Fattie,是的位置很奇怪,您可以使用此函数更改它add reference,第一个参数是从项目到文件位置的相对路径,第二个是相对路径,您希望在Unity生成的项目中添加引用。因此,如果您不想添加特定于您的建筑位置的相同奇怪的相对路径,使用StreamingAssets功能将此文件添加到Data/Raw更容易注意:您可以更改要添加的文件的名称。顺便说一句,请注意我输入的答案。这是另一种使用不同命令将文件复制到某处的方法。这可能会有帮助!: