在 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;
}