[转载]Unity用户手册-Unity与Android、iOS互相调用

本文详细介绍了如何在不同平台上调用C/C++代码,包括Windows上的DLL、Android上的SO库以及iOS上的.a静态库。在Unity中,利用DllImport调用这些库,并展示了Unity与Java在Android端的交互。同时,文章涵盖了不同平台的库文件放置路径和调用注意事项。
C#是以Assembly(汇编集)为一个基本单位组织代码的,dll就是一个assemble,dll之间有加载依赖顺序。dll是windows平台上的动态库,而so是linux平台上的动态库,最后.a是IOS平台的库文件。

Windows平台

1、外部导入C# dll

导入Unity中,放到Assets任意目录下,可以直接使用

2、PC平台调用C/C++代码

  • C代码需要使用extern “C”来封装成dll,因为Unity默认是使用C语言调用外部接口,会对C代码进行命名矫正,使用extern “C”避免这个问题。C语言代码(.c文件)可以直接在Unity的C#代码中调用(调用方式同C++代码一样)。
  • 将生成的api.dll放到Unity的Assets/Plugins/x86(或x86_64)下
  • 在C#代码中,通过[DllImport("api")] public static extern void API(int param); 的形式重新声明接口函数。注意:DllImport后面跟的dll名字不要加上.dll扩展名,否则会提示找不到。
示例:
xx.h extern "C"{ #include "gnugo.h" } extern "C" int _DLLExport Add(int x,int y); xx.cpp #include "xx.h" int _DLLExport Add(int x, int y){ return x + y; }
导出的库文件为api.dll,在unity中调用:
using System.Runtime.InteropServices; // 运行时加载动态库 [DllImport("api")] public static extern int Add(int x, int y); void Start(){ int result = Add(1,2); // 调用 }

Android平台

1、调用C/C++代码(jni层的so库)

  • C代码需要使用extern “C”来封装成.so库,因为Unity默认是使用C语言调用外部接口,会对C代码进行命名矫正,使用extern “C”避免这个问题。C语言代码(.c文件)可以直接在Unity的C#代码中调用(调用方式同C++代码一样)。
  • 将生成的api.so放到Unity的Assets/Plugins/Android/libs/armeabi(或armeabi-v7a或x86)下
  • 在C#代码中,通过[DllImport("api")] public static extern void API(int param); 的形式重新声明接口函数。注意:DllImport后面跟的名字不要加上.so扩展名,否则会提示找不到。

2、Unity与Java端互相调用

  • 在Android Studio 中新建一个Library的工程,包名要跟Unity的包名保持一致,在unity中playersettings下面的otherSetting里的scripting Backend中有Mono和IL2CPP两个选项,对应的就Unity/Editor/Data/PlaybackEngines/AndroidPlayer/Variations下的Mono和IL2CPP文件夹,去里面找到对应需要的classes.jar
  • 把classes.jar导入新建的Library工程,创建一个EmptyActivity,继承UnityPlayerActivity。
  • 在Android端,可以通过UnityPlayer.UnitySendMessage("Drive", "UnityMethod", str),调用Unity端的方法,UnityMethod为方法名,str为传递的string。
  • 在Unity端,可以通过AndroidJavaClass和AndroidJavaObject,调用Android端的方法。
示例:
Unity端:
using UnityEngine; public class Unity_Android : MonoBehaviour { private AndroidJavaObject m_AndroidJavaObject = null; void Start() { AndroidJavaClass androidJavaClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); m_AndroidJavaObject = androidJavaClass.GetStatic<AndroidJavaObject>("currentActivity"); if(m_AndroidJavaObject != null) { m_AndroidJavaObject.Call("CallUnityMethod", "Hello World"); } } public void UnityMethod(string str) { Debug.Log("Android: " + str); } }
Android端:
public class MainActivity extends UnityPlayerActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } public void CallUnityMethod(String str) { System.out.print("Android Call"); UnityPlayer.UnitySendMessage("Drive", "UnityMethod", str); } }

iOS平台

1、Unity调用C/C++/object-C代码

  • 创建Xcode工程,编译.a库,放到Assets/Plugins/iOS下
  • 在C#代码中,使用[DllImport("__Internal")] public static extern void Func();声明

2、在C/C++/object-C中使用C#中的代码

从Unity导出Xcode工程,在Xcode工程中,调用UnitySendMessage("Drive", "UnityMethod", str),调用场景中Drive的GameObject挂载的代码中的UnityMethod方法。
本文经作者同意,转自知乎@鹅厂程序小哥(https://www.zhihu.com/people/tencentboy),原文链接(https://zhuanlan.zhihu.com/p/339380697)
内容概要:本文为《科技类企业品牌传播白皮书》,系统阐述了新闻媒体发稿、自媒体博主种草短视频矩阵覆盖三大核心传播策略,并结合“传声港”平台的AI工具资源整合能力,提出适配科技企业的品牌传播解决方案。文章深入分析科技企业传播的特殊性,包括受众圈层化、技术复杂性传播通俗性的矛盾、产品生命周期影响及2024-2025年传播新趋势,强调从“技术输出”向“价值引领”的战略升级。针对三种传播方式,分别从适用场景、操作流程、效果评估、成本效益、风险防控等方面提供详尽指南,并通过平台AI能力实现资源智能匹配、内容精准投放全链路效果追踪,最终构建“信任—种草—曝光”三位一体的传播闭环。; 适合人群:科技类企业品牌市场负责人、公关传播从业者、数字营销管理者及初创科技公司创始人;具备一定品牌传播基础,关注效果可量化AI工具赋能的专业人士。; 使用场景及目标:①制定科技产品全生命周期的品牌传播策略;②优化媒体发稿、KOL合作短视频运营的资源配置ROI;③借助AI平台实现传播内容的精准触达、效果监测风险控制;④提升品牌在技术可信度、用户信任市场影响力方面的综合竞争力。; 阅读建议:建议结合传声港平台的实际工具模块(如AI选媒、达人匹配、数据驾驶舱)进行对照阅读,重点关注各阶段的标准化流程数据指标基准,将理论策略平台实操深度融合,推动品牌传播从经验驱动转向数据工具双驱动。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值