Unity3D与iOS交互(接入原生sdk方法)

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是否已经导出到项目中。
Unity3D与iOS交互(接入原生sdk方法)_第1张图片
解释:
其中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”了。
参考链接:一个大神
基本是复制这个写的,只是自己测试了下,把自己遇到的问题写了下。
完成。。。。。

你可能感兴趣的:(Unity3D与iOS交互(接入原生sdk方法))