如何将委托从 Unity C# 传递到本机 Kotlin Android SDK?

问题描述 投票:0回答:1

我有一个本机 Android 库,正在集成到 Unity 中,这需要我将 C# 委托传递给本机 SDK。作为一项设计决策,我将函数传递给本机 SDK,以便在发生各种事件时调用。我不知道如何将委托传递给本机代码,该本机代码将处理程序定义为类上的公共变量,如

var onMyEvent: () -> Unit = {}
。如何将 Unity C# 函数传递给生成的
setOnMyEvent
方法?

c# android kotlin unity-game-engine delegates
1个回答
0
投票

我在这个问题上遇到了困难,因为我仍在考虑 iOS 集成的函数指针。我尝试使用低级

AndroidJNI
函数来强制方法签名并从委托创建函数指针,但无济于事。然而,解决方案比我想象的要简单得多。查看反编译的AAR后,我意识到
setOnMyEvent
函数需要一个
Function0
参数,这是一个符合
kotlin.jvm.functions.Function0
接口的对象,定义如下:

/** A function that takes 0 arguments. */
public interface Function0<out R> : Function<R> {
    /** Invokes the function. */
    public operator fun invoke(): R
}

使用这个,使用内置的 Unity

AndroidJavaProxy
类来实现是很简单的:

using UnityEngine;
// ...
class Function0 : AndroidJavaProxy {
  private MyDelegate _callback;
  public Function0(MyDelegate callback) : base("kotlin.jvm.functions.Function0") {
    this._callback = callback;
  }

  public void invoke() { _callback(); }
}

在 Unity C# 包装类中,我需要做的就是以下操作:

public void SetOnMyEvent(MyDelegate callback) {
  _myAndroidJavaObject.Call("setOnMyEvent", new Function0(callback));
}

我希望这可以帮助任何遇到类似问题的人,因为我找不到任何有关此主题的先前参考资料。我在这方面花费的时间比我愿意承认的要多。

© www.soinside.com 2019 - 2024. All rights reserved.