C# 在Unity BuildPostProcessor中,如何简单地“复制”一个文件?
在Unity中,我只是在资产中有一个文件afile.ts/ 在构建的Xcode中,我只是希望它放在项目文件夹中——实际上,项目中的任何地方都可以 你可以使用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
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更容易注意:您可以更改要添加的文件的名称。顺便说一句,请注意我输入的答案。这是另一种使用不同命令将文件复制到某处的方法。这可能会有帮助!: