WRITE IOS PLUGIN FOR UNITY

 • 

在 Unity 里面调用 iOS 原生功能是一件很爽的事情,其实这个方向可以干很多事情,目前我在做的是把 WKWebView 作为贴图传给 Unity 显示在 Mesh / RawImage 上:

WKWebView <-- MTLTexture <--> Texture2d --> Unity  


但是还有很多功能可以做,比如目前 Unity 似乎还不支持手机上运行 Compute Shader,但是 iOS 自身可以进行 GPGPU 计算,而且在其他的一些方面,Native 效率上理论是甩 Mono 运行时一大截的,这个后面有可能会去实验下。

Unity 调用 iOS 方法:

Test.cs

----------------
using UnityEngine;  
using System;  
using System.Runtime.InteropServices;

public class Test : MonoBehaviour  
{
    void Start ()
    {
        Hello ();
    }
    #region extern methods

    [DllImport ("__Internal")]
    public static extern void Hello();

    #endregion
}
Test.h

----------------
#import <Foundation/Foundation.h>

@interface Test : NSObject

@end

extern "C" void Hello();  
Test.mm

----------------
#import "Test.h"

@implementation Test

@end

void Hello()  
{
    NSLog(@"Hello");
}

iOS 获取贴图指针

参见 Texture.GetNativeTexturePtrTexture2D.CreateExternalTexture
GetNativeTexturePtr 为 Unity 创建贴图后获取其在对应平台的贴图地址,CreateExternalTexture 则是对应平台已经有一个贴图指针并传入 Unity 创建 Texture2d。
对于 Metal 平台,GetNativeTexturePtr 返回的是一个 id<MTLTexture> 的指针,可以通过以下方式在 iOS 部分获取:

Test.cs

----------------
public class Test : MonoBehaviour  
{
private Texture2D webViewTexture;  
    void Start ()
    {
        webViewTexture = new Texture2D (512, 512, TextureFormat.ARGB32, false);
SetWebViewTexturePtr(webViewTexture.GetNativeTexturePtr ());  
    }

[DllImport ("__Internal")]
    public static extern void SetWebViewTexturePtr(IntPtr ptr);
}
Test.h

----------------
extern "C" void SetWebViewTexturePtr(uintptr_t ptr);  
Test.mm

----------------
void SetWebViewTexturePtr(uintptr_t ptr)  
{
id<MTLTexture> ptrToMetalTexture = (__bridge_transfer id<MTLTexture>)(void*) ptr;  
}