在 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 中讨论的内容。
- Unity .. 在 /StreamingAssets
中有文件 music.mp4 或 mesh.txt
- 构建到 Xcode
- 您将在 Xcode 项目中拥有 music.mp4 或 mesh.txt,包含在 Target
中
- 并且 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 很高兴识别为文件]
在 Unity 中我只有一个文件,afile.ts,位于 Assets/
在构建的 Xcode 中,我只是希望它位于项目中包含的项目文件夹中(真的,任何地方都可以)。
你使用
project.AddFileToBuild(g, something something something);
可是我明明想不通.
(显然它在 Unity 中完全没有记录。)
它是怎么做到的?只是一个简单的文件 - 实际上将它从 Assets/filename 复制到 Xcode 项目(它将具有目标成员资格并位于主包中)。
这是一个完美的 Unity 构建 post 脚本 BuildPostProcessor.cs,它很棒并且可以做其他所有事情:
但是我不能复制一个该死的文件!怎么做?
注意 - 备选方案
注意。如果你只是简单地将一个文件放在 Unity 命名错误的 magic 文件夹中:
/StreamingAssets
事实上,它所做的正是本 QA 中讨论的内容。
- Unity .. 在 /StreamingAssets 中有文件 music.mp4 或 mesh.txt
- 构建到 Xcode
- 您将在 Xcode 项目中拥有 music.mp4 或 mesh.txt,包含在 Target 中
- 并且 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 很高兴识别为文件]