Unity编译至Xcode工程后自动添加文件和库的方法

XUPorter项目Github链接

为什么想要自动添加

由于Unity是全平台的游戏开发环境,在开发中针对特定平台的特定功能时,很难避免根据对象平台的不同而引入不同的依赖。包括源码,需要的库和框架等。在使用各种插件后这种情况愈发严重:比如想加入内购功能,StroreKit.framework必不可少,而且也需要相应的处理代码。按照一般的Unity插件开发流程,在完成.cs的接口声明和Unity侧的调用实现后,最重要的当然是在iOS native侧完成实现。而在以前,包括依赖库和所有源码文件,都只有在Unity生成Xcode工程之后,再手动添加。如果工程小依赖少的话花不了太多时间,但是如果项目很大,很可能折腾一次就要十来分钟,严重影响了工作效率,必须加以解决。

怎么办

Unity开发团队也意识到了这个问题,在Unity编译的最后加入了一个脚本调用的命令,会自动搜索Editor文件夹下的PostprocessBuildPlayer,并进行调用,在该文件中可以自己加入脚本来向Xcode中添加库和文件。关于PostprocessBuildPlayer的详细信息,可以参看官方文档,关于向Xcode中添加文件或库,gonzoua的xcs也许是不错的选择。但是似乎xcs只能针对Xcode3来添加,在Xcode4中,主工程文件的结构发生了改变,导致xcs失效,而这个项目也迟迟没有更新(也许有时间我会考虑接手继续这个项目,但肯定不是现在...)。因此不得不打其他主意。

在Unity3.5中,加入了一个很棒的标签——[PostProcessBuild],被该标签标注的函数将自动在build player后被调用,这为大家提供了一个不需要用脚本和命令行就能添加或修改编译得到的工程的绝好的入口。darktable用python实现了一个Xcode4工程文件读写的接口Mod PBXProj,但是对于Unity来说,更需要的是C#的实现。Cariola完成了一部分实现,但是存在一些错误和不太好用的地方,代码也很乱。我在其基础上进行了一些改进和整理。但是因为变动的还是比较大,很难merge回去,所以决定自己开一个项目来继续推进这个项目。

XUPorter

我把它叫做XUPorter,a dependency porter from Unity to Xcode。XUPorter可以读取Xcode工程文件并进行解析(再次感谢darktable的工作),之后在Unity工程的Assets目录下寻找所有的.projmods文件,并根据文件内容向工程中添加文件或库。

使用方法

将Github项目中的所有文件copy到Unity工程文件夹下的/Assets/Editor目录中,XUPorter使用一个改良版的MiniJSON来进行。如果你的项目中已经在使用这个MiniJSON了的话,可以直接将XUPorter文件夹下的MiniJSON文件夹删掉;如果不一样的话,你可以选择其中一个重构一下或者加上命名空间来解决类名冲突。接下来,Mods文件夹下是示例文件以及需要导入Xcode的文件。在看完以后你需要把Mods文件夹下的所有.projmods文件以及Mods/iOS文件夹下的内容删除或者替换为你所需要的内容。

这里提供了.unitypackege格式文件的下载,你也可以选择下载打包好的文件并导入你的工程,之后的步骤和上面一样。

.projmods文件是一个JSON格式的配置patch文件,定义了要如何设置Xcode工程。举个基本的例子,比如KKKeychain.projmods:

{
    "group": "KKKeychain",
    "libs": [],
    "frameworks": ["Security.framework"],
    "headerpaths": [],
    "files":   [],
    "folders": ["iOS/KKKeychain/"],
    "linker_flags": [],
    "excludes": ["^.*.meta$", "^.*.mdown$", "^.*.pdf$"]
}

各参数定义如下:

  • group:所有由该projmods添加的文件和文件夹所属的Xcode中的group名称
  • libs:在Xcode Build Phases中需要添加的动态链接库的名称,比如libz.dylib
  • frameworks:在Xcode Build Phases中需要添加的框架的名称,比如Security.framework
  • headerpaths:Xcode中编译设置中的Header Search Paths路径
  • files:加入工程的文件名
  • folders:加入工程的文件夹,其中所有的文件和文件夹都将被加入工程中
  • linker_flags:添加到工程linker flag中的链接配置,比如-ObjC
  • excludes:忽略的文件的正则表达式,匹配的文件将不会被加入工程中

更多的例子可以参看Mods文件夹中的其他projmods文件。所有的定义路径都是基于当前projmods文件位置的相对路径。 最后,在完成projmods后,Unity会在编译完成后,调用XCodePostProcess的OnPostProcessBuild来对编译得到的Xcode工程进行修改。

之后进一步要做的是为MiniJSON添加一个namespace,这样可以避免不必要的冲突。另外如果您有什么好的想法,也欢迎fork这个项目并给我pull request。项目的github链接请猛击这里。.

转载自:https://onevcat.com/

时间: 2024-12-27 07:19:04

Unity编译至Xcode工程后自动添加文件和库的方法的相关文章

win7中怎样添加文件到库

  win7中添加文件到库的方法: 双击打开桌面的"计算机",在左边栏中你会看到"库",点击打开就可以了, 然后你会看到里面有文档,音乐,图片,视频等文件夹. 如果你经常在文档文件夹存储文件的话,那么,在库的文档中你也会看到这些文件夹和文件.一些软件还会在我的文档里建立文件夹,这些你也会看得到.如果你有些文档不是放在"我的文档"里,你可以把他们都添加到"库"中: 1.右击想要添加到库的文件夹,选择"包含到库"

jQuery使用append在html元素后同时添加多项内容的方法

 这篇文章主要介绍了jQuery使用append在html元素后同时添加多项内容的方法,实例分析了jQuery中append追加内容的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下     本文实例讲述了jQuery使用append在html元素后同时添加多项内容的方法.分享给大家供大家参考.具体分析如下: 下面的代码可以同时在文本段落后添加多项内容 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 <!DOCTYPE html

sql server-求自动添加不存在日期的方法 求助啊 大神来帮帮忙吧 谢谢了

问题描述 求自动添加不存在日期的方法 求助啊 大神来帮帮忙吧 谢谢了 求自动添加不存在日期的方法 求助啊 大神来帮帮忙吧 谢谢了 select t.number as 小时,ISNULL(tt.real_money,0) as 价格 from (SELECT class_id=DATEPART(hh,convert(varchar(20),db_ls.ls_datetime,20)),real_money=Convert(decimal(18,2),sum(round(db_ls_item.h_

jQuery使用append在html元素后同时添加多项内容的方法_jquery

本文实例讲述了jQuery使用append在html元素后同时添加多项内容的方法.分享给大家供大家参考.具体分析如下: 下面的代码可以同时在文本段落后添加多项内容 <!DOCTYPE html> <html> <head> <script src="js/jquery.min.js"> </script> <script> function appendText() { var txt1="<p&g

JS实现n秒后自动跳转的两种方法_javascript技巧

本文实例为大家分享了JS实现n秒后自动跳转的两种方法,供大家参考,具体内容如下 第一种使用SetInterval: $(function () { setInterval(ChangeTime, 1000); }); function ChangeTime() { var time; time = $("#time").text(); time = parseInt(time); time--; if (time <= 0) { window.location.href = &q

ajax 返回值自动添加pre标签的解决方法_AJAX相关

ajax返回,自动添加pre标签 ajax返回的内容,居然自动添加了<pre>标签 在FF,ie,谷歌浏览器中,每个返回的都不一样:ff小写,ie大写,谷歌加style 查了一下,原来是返回的类型不对. 最终解决结果,修改一般处理程序的返回类型 把 context.Response.ContentType = "text/plain"; 修改为 context.Response.ContentType = "text/html";

ajax 返回值自动添加pre标签的解决方法

ajax返回,自动添加pre标签 ajax返回的内容,居然自动添加了<pre>标签 在FF,ie,谷歌浏览器中,每个返回的都不一样:ff小写,ie大写,谷歌加style 查了一下,原来是返回的类型不对. 最终解决结果,修改一般处理程序的返回类型 把 context.Response.ContentType = "text/plain"; 修改为 context.Response.ContentType = "text/html";

开机自动打开文件夹的解决方法

  电脑开机进入桌面后,自动弹出文件夹;出现类似问题可能是由于病毒感染.启动项目设置错误.恶意软件造成的; 开机自动打开文件夹的解决办法 第一步:删除启动文件夹中的相关内容;点击"开始"菜单-- >选择"所有程序"-->鼠标指向"启动"-->查看弹出的"启动"项目中是否有该文件夹的信息-->如果有,双击"启动"打开 "启动文件夹",删除弹出文件夹的信息即可;或在该

文章内容被复制后自动添加文章链接代码

具体方法 你可以给你的WordPress站点添加一个功能:内容被复制后,粘贴的时候自动在后面添加文章链接. 将下面的代码添加到主题的 functions.php 文件中:  代码如下 复制代码 function add_copyright_text() {     if (is_single()) { ?>   <script type='text/javascript'> function addLink() {     if ( window.getSelection().conta