Unity iOS构建文件/文件夹缺失,嵌入Swift/Xcode项目遇阻
问题解决:Unity iOS构建Assets路径异常及NativeCallProxy缺失问题
核心问题确认
- Unity编辑器内项目运行正常,Win/Mac/Linux跨平台构建无问题,但iOS构建后存在两个关键异常:
- Assets文件夹位置不符合预期,导致嵌入Swift项目时无法识别资源,Unity窗口不显示
- 缺失
NativeCallProxy文件,无法推进Swift与Unity的交互开发 - 单独运行iOS构建的.xcodeproj能加载场景,说明资源未丢失,仅路径或构建配置异常
排查与修复步骤
1. 调整Unity iOS构建导出设置
- 打开Unity Player Settings → 切换到iOS标签:
- 确认Architecture设置为
ARM64,匹配Xcode当前iOS目标架构 - 开启Build Options中的
Export Project,避免直接用Build and Run(自动构建可能篡改路径导致异常) - 检查Other Settings → Configuration,将
Scripting Backend设为IL2CPP(Swift交互优先选择IL2CPP,规避Mono兼容性问题) - 确认Scenes In Build列表中已添加你的高尔夫球杆场景,不要仅依赖编辑器默认场景
- 确认Architecture设置为
2. 修正Assets文件夹路径配置
- 导出iOS项目后,在Xcode中操作:
- 右键项目根目录 → Add Files to "YourProject"
- 找到Unity导出包中的
Assets文件夹,勾选Copy items if needed,并选择Create groups(不要选Create folder references,否则Xcode无法识别Unity资源) - 检查Build Phases → Copy Bundle Resources,确保
Assets文件夹已被添加
3. 手动生成/添加NativeCallProxy文件
- 先在Unity中配置符号:打开Player Settings → iOS → Other Settings → Scripting Define Symbols,添加
UNITY_IOS和ENABLE_NATIVE_CALL_PROXY,重新导出iOS项目,此时NativeCallProxy.h和NativeCallProxy.mm应生成在Unity-iPhone/Classes目录下 - 若仍未生成,手动创建两个文件并添加到Xcode项目:
NativeCallProxy.h:#import <Foundation/Foundation.h> @interface NativeCallProxy : NSObject + (void)sendMessageToUnity:(NSString*)message; @endNativeCallProxy.mm:#import "NativeCallProxy.h" #include "UnityInterface.h" @implementation NativeCallProxy + (void)sendMessageToUnity:(NSString*)message { UnitySendMessage("GameManager", "ReceiveMessage", [message UTF8String]); } @end- 将文件添加到Xcode项目的
Classes组,确保Build Phases → Compile Sources中包含这两个文件
4. 正确嵌入Swift项目的步骤
- 不要直接复制Unity Assets到Swift项目,而是将Unity导出的Xcode项目作为子项目嵌入:
- 在Swift项目中,右键Project Navigator → Add Files to "YourSwiftProject"
- 选择Unity导出的
Unity-iPhone.xcodeproj,勾选Copy items if needed - 在Swift项目的Build Phases → Target Dependencies中添加
Unity-iPhone - 在Build Phases → Embed Frameworks中添加
UnityFramework.framework - Swift代码中初始化Unity的示例:
import UnityFramework class UnityManager: NSObject { static let shared = UnityManager() private var unityFramework: UnityFramework? func startUnity() { unityFramework = UnityFramework.shared() if let framework = unityFramework { framework.setDataBundleId("com.yourcompany.unityproject") framework.runEmbedded(withArgc: CommandLine.argc, argv: CommandLine.unsafeArgv, appLaunchOpts: nil) } } }
5. 清理重建操作
- 清空Unity的Library文件夹,重启Unity后重新构建
- 在Xcode中执行Product → Clean Build Folder,再重新编译
内容的提问来源于stack exchange,提问作者zeldro
相关产品推荐
相关产品推荐

