首页 > 其他分享 >Unity用户手册-Unity与Android、iOS互相调用

Unity用户手册-Unity与Android、iOS互相调用

时间:2022-11-29 21:40:49浏览次数:42  
标签:调用 int 代码 iOS C++ Unity 用户手册 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方法。

 

标签:调用,int,代码,iOS,C++,Unity,用户手册,Android
From: https://blog.51cto.com/u_6871414/5897038

相关文章

  • 【Unity插件】NGUI核心组件之UIAtlas
    NGUI:UIAtlasUIAtlas是一个容器,他包含了许多sprite的坐标信息。如果你对这个概念不是很熟悉,你可以这样理解:与使用很多小的贴图来渲染UI相比,使用一张包含了所有小贴图的大......
  • Unity游戏的GC(garbage collection)优化
     Unity版本:5.5引言游戏运行时使用内存来存储数据,当这些数据不再被使用时,存储这些数据的内存被释放以便于之后这些内存可以被复用。垃圾(Garbage)是存储无用数据的内存的术语......
  • Unity--Cinemachine官方实例详解
    1.2DCamera搭建一个快速场景,MainCamera选择Orthographic。在Cinemachine下有Create2DCamera,在生成的相机中设置follow,同时注意body的设置,如下图所示在虚拟相机中还需要......
  • Unity Animator -- Apply Root Motion
    Animator.ApplyRootMotion这个属性是用来控制物体在播放骨骼动画的时候是否应用骨骼根节点的运动参数。一、当没有骨骼根节点的情况时,比如只是一个Cube立方体,如果勾选了Appl......
  • 【详细解析版】Unity UGUI Mask组件实现原理
    MaskingisimplementedusingthestencilbufferoftheGPU.即Mask是利用了GPU的模板缓冲来实现的,关于模板,打个简单的比方,就像一个面具,可以挡住一部分“脸”的显示一样。......
  • Unity-利用SkinnedMeshRenderer和Mesh的BindPose实现骨骼动画
    SkinnedMeshRenderer蒙皮网格渲染器。蒙皮是指将Mesh中的顶点附着(绑定)在骨骼之上,而且每个顶点可以被多个骨骼所控制。骨骼是皮肤网格内的不可见对象,它们影响动画过程中网格......
  • Unity判断对象是否在视野内
    判断对象是否在视野内,有两种方式:第一种:不设置固定的目标,使用LayerMask,设置寻找对象的Layer,使用Physics.OverlapSphere方法,以给定的位置为圆心,按照设定距离投射一个球体,返回......
  • Unity--Physics.OverlapSphere的参数LayerMask和GameObject的layer
    Layer介绍:Unity中是用int32来表示32个Layer层。int32表示二进制一共有32位(0—31)在Unity中每个GameObject都有Layer属性,默认的Layer都是Default。在Unity中可编辑的Layer共......
  • Unity-Animator Override Controller
    AnimatorOverrideController是一种资产类型,允许您扩展现有的AnimatorController,替换使用的特定动画,但保留原始结构,参数和逻辑。允许您创建相同基本状态机的多个变体,但每......
  • Unity用户手册-AssetBundle
    AssetBundle什么是AssetBundle?AssetBundle实际上是一个资源管理包。AssetBundle包含了两个部分:数据头以及数据段。数据头内包含了AssetBundle的元数据信息,比如它的标识符......