【发布时间】:2020-07-15 21:52:09
【问题描述】:
问题:
我正在尝试在 Swift 和 Unity 之间架起一座桥梁,为了实现这一目标,我需要在 Swift 和 Obj-C 之间架起一座桥梁,并从 Unity 调用 Obj-C 代码。我现在可以构建并运行生成的 Unity Xcode 项目,并且可以从 Unity 调用 Obj-C 代码而不会出现问题。但是当我尝试从 Obj-C 调用 Swift 代码时,似乎从未调用过 Swift 代码(我在 Swift 代码中添加了 print("abc"),但控制台中没有出现任何内容)。
我做了什么
基本遵循this的文章,总之:
- 在 Xcode 中创建一个框架,添加一个 swift 类并将我想公开给 Obj-C 的代码标记为
@obj public - 在框架下添加一个调用Swift代码的
.mmObj-C文件,实现需要包含生成的<MODULE_NAME>-Swift.h头文件。 - 创建一个
<PROJECT_NAME>-Bridging-Header.h来桥接这两个代码文件。 - 编译代码,将这3个文件放在Unity的iOS插件文件夹(Assets/Plugin/iOS/
),添加调用Obj-C代码的ac#脚本和一个postprocess文件来在构建时调整Xcode设置iOS 项目。 - 将生成的
<PROJECT_NAME>.framework文件夹放入Assets/StreamingAssets。 - 在 Unity 中构建 iOS 项目,打开
Unity-iPhone.xcodeproj。 - 将
<PROJECT_NAME>.framework从/Data/Raw拖到/Frameworks,将其添加到 Unity-iPhone 和 UnityFramework 目标,将两者的目标成员身份更改为可选。 - 运行Unity-iPhone xcode工程,可以通过Unity C#代码调用Obj-C代码,但不调用Swift代码。
我的想法
在 Obj-C 文件中包含了一个 <MODULE_NAME>-Swift.h 头文件,描述了暴露的 Swift 类函数,理论上应该由 Unity-iPhone 项目自动生成,但我必须拖动之前生成的 @987654333 @ 到 Unity-iPhone 项目中的 /Frameworks 组以供 Obj-C 文件参考,否则将出现模块未找到问题。所以Unity-iPhone项目中实际上有2个<MODULE_NAME>-Swift.h文件,一个在<PROJECT_NAME>.framework中,另一个在UnityFramework.framework中,这是Unity-iPhone项目的产品之一。在Bridge.mm 中,如果我cmd+单击对-Swift.h 的引用,它将转到/Framework 组中框架中的-Swift.h 文件。然后在-Swift.h 中有这样一个Swift 类的定义:
...
SWIFT_CLASS("_TtC11<MODULE_NAME>12<CLASS_NAME>")
@interface CLASS_NAME : NSObject
...
如果我 cmd+单击该类,它会将我引回到插件中的实际 swift 类,这是正确的,但实际上它根本没有调用 Swift 代码... 也许 Obj-C 没有调用正确的 Swift 代码?或者它会感到困惑?也许某些构建设置在后期处理中设置不正确?我没有从控制台看到任何错误,呼叫只是静默失败,有什么解决方法的想法吗?
【问题讨论】: