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.GetNativeTexturePtr
Texture2D.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;
}