Unity3D(以下简称U3D)是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。
作为一款跨平台开发工具,难免会与原生平台进行一些交互操作来完成一些特定的平台功能。例如:你需要直接操作iOS的IAP来实现游戏中的内付费功能;甚至一些第三方SDK没有提供U3D版本的情况下,你会直接在原生系统平台调用其提供接口等等。
下面将为大家介绍,在U3D下如何实现与iOS系统的交互工作,来满足一些需要借助原生系统的功能需求。
1:unity3D调用iOS的方法
由于U3D无法直接调用Objc或者Swift语言声明的接口,幸好U3D的主要语言是C#,因此可以利用C#的特性来访问C语言所定义的接口,然后再通过C接口再调用ObjC的代码(对于Swift代码则还需要使用OC桥接)。例如,有如下C语言方法:
实现步骤:
1:首先新建test.m和test.h两个文件(这两个文件用xcode可以创建)。分别写入如下内容:
/// test.h
extern "C"
{
extern void outputAppendString (char *str1, char *str2);
}
/// test.m
#import
void outputAppendString (char *str1, char *str2)
{
NSString *string1 = [[NSString alloc] initWithUTF8String:str1];
NSString *string2 = [[NSString alloc] initWithUTF8String:str2];
NSLog(@"###%@", [NSString stringWithFormat:@"%@ %@", string1, string2]);
}
2:然后将上面的两个文件放到U3D项目的Assets下。
3:分别选择test.h和test.m文件,在Inspector面板中去掉Any Platforms的勾选,然后仅保留iOS这一项选中。
4:新建一个叫Sample的C#脚本文件,并在这个文件中写入c接口的声明。
public class Sample : MonoBehaviour
{
//引入声明
[DllImport("__Internal")]
static extern void outputAppendString (string str1, string str2);
}
void Start ()
{
#if UNITY_IOS
outputAppendString("Hello", "World");
#endif
}
5:拖动Sample脚本到场景的某个对象上,让脚本进行挂载。
6:打包Xcode工程(平台选择IOS)打开导出的iOS项目,先检查之前创建的test.m和test.h是否已经导出到项目中。
解释:
其中DllImport为一个Attribute,目的是通过非托管方式将库中的方法导出到C#中进行使用。而传入"__Internal"则是表示这个是一个静态库或者是一个内部方法。通过上面的声明,这个方法就可以在C#里面进行调用了。如:
完成。。。。。
2:IOS调用unity3D中的方法
这个先粘贴代码,后面部分在解释一些地方。
1:首先是C#脚本:
using System;
public sealed class MonoPInvokeCallbackAttribute : Attribute {
public MonoPInvokeCallbackAttribute(Type type)
{
}
}
using UnityEngine;
using System.Runtime.InteropServices;
using System;
public class Sample : MonoBehaviour{
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void ResultHandler(string str);
#if UNITY_IOS
[MonoPInvokeCallback(typeof(ResultHandler))]
static void resultHandler(string resultStr)
{
print("----" + resultStr);
}
#endif
[DllImport("__Internal")]
static extern void outputAppendString(IntPtr resultHandler);
void Start () {
#if UNITY_IOS
ResultHandler handler = new ResultHandler(resultHandler);
IntPtr fp = Marshal.GetFunctionPointerForDelegate(handler);
outputAppendString(fp);
#endif
}
}
2:然后是.m和.h文件
//
// T.m
// Unity-iPhone
//
// Created by hpz on 8/21/19.
//
#import
typedef void (*ResultHandler) (const char *object);
void outputAppendString (ResultHandler resultHandler)
{
resultHandler ("ggg");
}
//
// T.h
// Unity-iPhone
//
// Created by hpz on 8/21/19.
//
#ifndef T_h
#define T_h
extern "C"
{
extern void outputAppendString (char *str1, char *str2);
}
#endif /* T_h */
这个其实是unity中调ios的一个方法,ios这个方法又调用了unity中的方法,这样就可以打印出来“ggg”了。
参考链接:一个大神
基本是复制这个写的,只是自己测试了下,把自己遇到的问题写了下。
完成。。。。。