小编点评
## Generate content for integrating Unity into native platforms
This guide explains how to integrate Unity into native platforms like Java/Android, Objective C/iOS, and Windows Win32/UWP, enabling you to utilize its 3D and 2D rendering functionalities within your application.
**Generating UnityFramework static library:**
* Unity 2019.3 introduces support for integrating Unity runtime components directly into native platform projects, allowing for embedding 3D and 2D content like AR experiences, interactions with 3D models, and 2D mini-games.
* This enables the creation of UnityFramework static libraries that can be incorporated into other applications, reducing development effort.
**Building the static library:**
1. Create a `UnityCallNative` class in the iOS project.
2. Define a `outputAppendString` method in the `UnityCallNative.h` file, implementing the `C` signature for the method.
3. Create an `outputAppendString.m` file to implement the method.
4. Add the generated `UnityCallNative.h` and `outputAppendString.m` files to the `Plugins/ios` directory in the Unity project.
5. Build the `Unity-iPhone` project.
6. Import the `UnityCallNative.h` and `outputAppendString.m` files into your iOS project.
**Embedding the static library:**
1. Build the UnityFramework static library.
2. Add the static library to the appropriate build settings in your iOS project.
3. Use the `#pragma comment(link, “
")` directive to link the library at runtime.
**Using the static library:**
1. In your Unity scripts, use the `Unit3D` namespace to access the static methods and properties of the `UnityFramework` class.
2. For example, you can use `UnityFramework.Instance.StartCoroutine` to start an asynchronous coroutine.
**Example:**
```C#
// UnityCallNative.h
extern "C" {
void outputAppendString(string str1, string str2);
}
// UnityCallNative.m
void outputAppendString(string str1, string str2) {
// Implement the string appending logic here
}
```
This example demonstrates how to access Unity functions from your native code by using the `UnityCallNative` class.
**Additional notes:**
* The `Unity-iPhone Target` file defines the static dependency on `UnityFramework.framework`.
* Ensure that the `UnityCallNative.h` and `outputAppendString.m` files are accessible from the target application.
* Follow the Unity documentation for further details and best practices.
正文
如果想让原生平台(例如 Java/Android、Objective C/iOS 或 Windows Win32/UWP)包含 Unity 功能,可以通过Unity 生成UnityFramework静态库包含到项目中进行实现。
Unity 从2019.3 开始支持将 Unity 运行时组件集成到原生平台项目中,从而将Unity 静态库用于其他应用程序中。
这样就可以以嵌入的方式让APP使用 3D 或 2D 实时渲染的内容,例如 AR 体验、与 3D 模型交互、2D 迷你游戏等。
Unity 静态库提供了多种方法来管理如何在原生应用程序中加载、激活和卸载Unity3DPlayer。
以下平台目前支持Unity 用作库:Android,iOS,Windows 和通用 Windows 平台。
使用Unity构建iOS工程
先使用 Unity 构建 一个Xcode 项目,然后制作iOS静态库。
每个 Unity iOS Xcode 项目具有以下结构:
UnityFramework 部分,其中包含源、插件和相关框架。它还生成 UnityFramework.framework 文件。
Unity-iPhone 部分,其中包含应用程序需要的资源数据和运行库。Unity-iPhone Target对 UnityFramework 具有单一依赖关系,所以直接运行Unity-iPhone,构建出UnityFramework 。
要将 Unity 集成到另一个 Xcode 项目中,可以通过将 UnityFramework.framework 文件添加到原生 Xcode 项目的应用程序 (Application) 的依赖库中,并设置成嵌入 (Embedded Binaries) 。完成此操作后,可以使用 UnityFramework 类来控制 Unity 运行时。
可通过 UnityFramework Objective-C 类(该类是 UnityFramework.framework 的主体类)的实例来控制 Unity 运行时:
UnityFramework提供了一系列的方法,举例如下:
+ (UnityFramework*)getInstance; 单例类方法,可将实例返回到 UnityFramework。
- (UnityAppController*)appController; 返回 UIApplicationDelegate 的 UnityAppController 子类。这是原生端的根 Unity 类,可以访问应用程序的视图相关对象,例如 UIView、UIViewControllers、CADisplayLink 或 DisplayConnection。
- (void)setDataBundleId:(const char*)bundleId; 设置捆绑包,Unity 运行时应在其中查找 Data 文件夹。有关更多信息,请参阅 Data 文件夹的相关文档。应在调用 runUIApplicationMainWithArgc 或 runEmbeddedWithArgc 之前调用此方法。
- (void)runUIApplicationMainWithArgc:(int)argc argv:(char*[])argv; 从没有其他视图的主要方法中运行 Unity 的默认方式。
制作iOS静态库
1.先创建一个UnityCallNative类,可以在iOS项目中创建。
UnityCallNative.h中定义声明一个供unity调用原生的方法,注意这里的方法定义必须使用C语法。
UnityCallNative.m中实现.h中定义的接口,注意实现的地方是除@implementation-end只外的地方,也就是直接把@implementation-end以及中间的内容都删除,然后使用C语言来实现,C语言的调用部分可以使用OC实现。
比如:
UnityCallNative.h文件声明方法
extern "C" {
void outputAppendString("test1", "test2");
}
UnityCallNative.m文件实现方法
void outputAppendString(string str1, string str2) {
....
}
2.将完成后的UnityCallNative类添加到Unity项目中
在Unity的Project/Asserts/Plugins/ios/目录下添加这2个文件。
3.通过Unity项目File-Buile Settings-iOS-Build 重新构建出新的Unity-iPhone项目
4.把Data资源文件夹,UnityCallNative.h 的Target MemberShips 设置到UnityFromework下(打勾),同时把UnityCallNative.h作用域设置成public
5.构建UnityFramework工程,生成静态库
6.把UnityFramework静态库导入到iOS工程中,同时在General-Libaray,Frameworkd设置成Embed&Sign
Unity3D与iOS原生交互
Unity3D调iOS
1.在Unity的脚本文件中使用原生项目暴露的方法
Unit3D中新建一个脚本文件,引入交互服务。
using System.Runtime.InteropServices;
public class ChangeLabel : MonoBehaviour
{
[DllImport("__Internal")]
static extern void outputAppendString(string str1, string str2); // 声明ios原生定义的C方法
void Start() {
#if UNITY_IPHONE
outputAppendString("test1", "test2"); // 调用ios原生定义的C方法
#endif
}
}
iOS原生调用Unity3D
原生调Unity3D通过下面这一句函数就够了。
举个例子 :
UnitySendMessage("UIChargeMoneyPage", "callback", "0");
在UnityInterface.h声明中声明了下面的函数
UnitySendMessage(const char * GameObjectName, const char *methodName, const char *msg);
GameObjectName: Unity场景中的游戏对象
methodName: 游戏对象下绑定的脚本中的函数名
msg:函数的参数
另外:
UnityInterface.h文件是Unity导出的iOS项目中包含的。
在发送消息到Unity前,要确保成功导入了UnityInterface.h文件。
参考文章:
https://docs.unity3d.com/cn/2021.1/Manual/UnityasaLibrary-iOS.html
https://juejin.cn/post/6844903933790388231
https://blog.51cto.com/myselfdream/2559580
https://blog.51cto.com/myselfdream/2559599
https://blog.csdn.net/weixin_42714258/article/details/122454019