public static void Show( Color color, OnRGBColorSelectedCallback onRGBColorSelectedCallback, OnFinishCallback onFinishCallback) { if (gcHandleForRGBColorSelectedCallback != IntPtr.Zero || gcHandleForColorSelectedCallback != IntPtr.Zero || gcHandleForOnFinishCallback != IntPtr.Zero) { return; } OnEarlierIOSVersionsCallback onEarlierIOSVersionsCallback = DoNothing; // コールバック関数をGCされないようにAllocしてハンドルを取得する。 gcHandleForRGBColorSelectedCallback = (IntPtr)GCHandle.Alloc(onRGBColorSelectedCallback, GCHandleType.Normal); gcHandleForOnFinishCallback = (IntPtr)GCHandle.Alloc(onFinishCallback, GCHandleType.Normal); gcHandleForOnEarlierIOSVersionsCallback = (IntPtr)GCHandle.Alloc(onEarlierIOSVersionsCallback, GCHandleType.Normal); // 普通の引数 + コールバック関数のハンドル + コールバック関数を呼び出すためのstaticなメソッド _CallColorPickerPlugin( color.r, color.g, color.b, color.a, CallRGBColorSelectedCallback, CallOnFinishCallback, CallOnEarlierIOSVersionsCallback); }
static void CallRGBColorSelectedCallback(float r, float g, float b, float a) { GCHandle handle = (GCHandle)gcHandleForRGBColorSelectedCallback; OnRGBColorSelectedCallback callback = handle.Target as OnRGBColorSelectedCallback; callback(r, g, b, a); }