Unity用户手册:跨平台调用指南

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.hextern "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;}1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.

导出的库文件为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); // 调用}1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.

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);    }}1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.

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);    }}1.2.3.4.5.6.7.8.9.10.11.12.13.

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方法。



免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删

QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空