unity 与oc、java交互

2021-04-13  本文已影响0人  忆中异

1.unity cs 书写
基类PlatformFactory.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;

public class PlatformFactory {
    protected static PlatformFactory _Instance = null;
    public static PlatformFactory Instance
    {
        get
        {
            if (null == _Instance)
            {
                _Instance = CreatePlatformInterface();
            }
            return _Instance;
        }
    }
    static PlatformFactory CreatePlatformInterface()
    {
#if UNITY_IOS && !UNITY_EDITOR
            _Instance = new IOSPlatform();
#elif UNITY_ANDROID && !UNITY_EDITOR
            _Instance = new AndroidPlatform();
#else
        _Instance = new EditorPlatform();
#endif
        return _Instance;
    }
    public virtual void initSDK() { }
    public virtual void loadInterAd() { }
    public virtual void showInterAd() { }
    public virtual void loadRewardedVideo() { }
    public virtual void showRewardedVideo(string tag,Action<string> succeed = 
null,Action<string> fail = null) { }
    /// <summary>
    /// Tea平台打点
    /// </summary>
    /// <param name="custom"></param>
    /// <param name="dic"></param>
    public virtual void TeaAnalystic(string custom, Dictionary<string, string> 
dic) { }
    public virtual void GameQuit() { }
}

Android AndroidPlatform.cs

#if UNITY_ANDROID

using System.Collections;

using System.Collections.Generic;

using System.Runtime.InteropServices;

using UnityEngine;

using System;


public class AndroidPlatform : PlatformFactory
{

    public override void initSDK()

    {

        AndroidPlatformWrapper.Instance.initSDK();

    }

    public override void showRewardedVideo(string tag, Action<string> succeed = 
null, Action<string> fail = null)

    {

        Debug.Log("AndroidPlatform showRewardedVideo");

        AndroidPlatformWrapper.Instance.showRewardedVideo(tag);

    }

    public override void showInterAd()

    {

        Debug.Log("AndroidPlatform showInterAd");

        AndroidPlatformWrapper.Instance.showInterAd();

    }

    public override void TeaAnalystic(string custom, Dictionary<string, string> 
dic)

    {

        AndroidPlatformWrapper.Instance.TeaAnalystic(custom,dic);

    }

    public override void GameQuit()

    {

        AndroidPlatformWrapper.Instance.GameQuit();

    }



}

#endif

AndroidPlatformWrapper.cs

#if UNITY_ANDROID

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

using AOT;

using System;



public class AndroidPlatformWrapper : MonoBehaviour {



    static AndroidPlatformWrapper _instance;

    AndroidJavaObject jo;

    public delegate void CallbackDelegate(string str);

    private Action<string> succeed;

    private Action<string> fail;

    public static AndroidPlatformWrapper Instance

    {

        get

        {

            if (_instance == null)

            {

                GameObject go = new GameObject("AndroidPlatformWrapper");

                go.AddComponent<AndroidPlatformWrapper>();

                _instance = go.GetComponent<AndroidPlatformWrapper>();

                DontDestroyOnLoad(go);

            }

            return _instance;

        }

    }



    public void initSDK()

    {

        AndroidJavaClass unityPlayer = new 
AndroidJavaClass("com.unity3d.player.UnityPlayer");

        AndroidJavaObject currentActivity = 
unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");

        //jo = new AndroidJavaObject("com.hw.GamePlayer");

        jo = new AndroidJavaObject("com.hellowd.HwGamePlayer");

        jo.Call("initHwSDK", currentActivity, Config_Android.SERVER_URL);

    }

    /// <summary>

    /// 播放视频

    /// </summary>

    public void showRewardedVideo(string tag, Action<string> succeed = null, 
Action<string> fail = null)

    {

        this.succeed = succeed;                

        Debug.Log("AndroidPlatformWrapper showRewardedVideo");

        object[] paramArray = new object[3];

        paramArray[0] = tag;

        paramArray[1] = "PlatformCallback_FinishRewardAd";

        paramArray[2] = "PlatformCallback_FailedRewardAd";

        if(jo != null)

            jo.Call("showHwRewardAd", paramArray);

    }

    /// <summary>

    /// 视频播放成功

    /// </summary>

    /// <param name="jsonStr"></param>

    [MonoPInvokeCallback(typeof(CallbackDelegate))]

    void PlatformCallback_FinishRewardAd(string jsonStr)

    {

        Debug.Log("AndroidPlatformWrapper 
PlatformCallback_FinishRewardAd:"+jsonStr);

        IAP_Ad.ADPlaySuccess();

    }

    /// <summary>

    /// 视频播放失败

    /// </summary>

    /// <param name="jsonStr"></param>

    [MonoPInvokeCallback(typeof(CallbackDelegate))]

    void PlatformCallback_FailedRewardAd(string jsonStr)

    {

        Debug.Log("AndroidPlatformWrapper 
PlatformCallback_FailedRewardAd:"+jsonStr);

        IAP_Ad.ADPlayFailed();

    }

    public void showInterAd()

    {

        Debug.Log("AndroidPlatformWrapper showInterAd");

        object[] paramArray = new object[3];

        paramArray[0] = "showInterAd";

        paramArray[1] = "PlatformCallback_FinishInterAd";

        paramArray[2] = "PlatformCallback_FailedInterAd";

        if (jo != null)

            jo.Call("showHwInterAd", paramArray);

    }

    [MonoPInvokeCallback(typeof(CallbackDelegate))]

    void PlatformCallback_FinishInterAd(string jsonStr)

    {

        Debug.Log("AndroidPlatformWrapper 
PlatformCallback_FinishInterAd:"+jsonStr);

    }

    [MonoPInvokeCallback(typeof(CallbackDelegate))]

    void PlatformCallback_FailedInterAd(string jsonStr)

    {

        Debug.Log("AndroidPlatformWrapper PlatformCallback_FailedInterAd:" + 
jsonStr);  

    }



    public void TeaAnalystic(string custom, Dictionary<string, string> dic)

    {

        Debug.Log("AndroidPlatformWrapper TeaAnalystic:" + custom);

        string jsonStr = FullSerializerAPI.Serialize(typeof(Dictionary<string, 
string>), dic);

        object[] paramArray = new object[2];

        paramArray[0] = custom;

        paramArray[1] = jsonStr;

        AndroidJavaObject hwjo = new AndroidJavaObject("com.hw.GamePlayer");

        hwjo.Call("TeaAnalystic", paramArray);

    }

    /// <summary>

    /// 退出游戏

    /// </summary>

    public void GameQuit()

    {

        if (jo != null)

            jo.Call("GameQuit");

    }

}

#endif


ios IOSPlatform.cs

#if UNITY_IOS && !UNITY_EDITOR

using System.Collections;

using System.Collections.Generic;

using UnityEngine;



public class IOSPlatform : PlatformFactory

{



    public override void initSDK()

    {

        IOSPlatformWrapper.initSDK();

    }

     public override void showRewardedVideo(string tag, Action<string> succeed = 
null, Action<string> fail = null)

    {

        Debug.Log("AndroidPlatform showRewardedVideo");           

    }

    public override void showInterAd()

    {

        Debug.Log("AndroidPlatform showInterAd");        

    }

    public override void TeaAnalystic(string custom, Dictionary<string, string> 
dic)

    {

        

    }

    public override void GameQuit()

    {

        

    }



}

#endif


IOSPlatformWrapper.cs

using AOT;

using System.Collections;

#if UNITY_IOS && !UNITY_EDITOR

using System.Collections.Generic;

using System.Runtime.InteropServices;

using UnityEngine;



public class IOSPlatformWrapper{



    public delegate void CallbackDelegate(string str);



    [DllImport("__Internal")]

    private static extern void initHwAds( string jsonStr, CallbackDelegate 
callBack = null);

    public static void initSDK()

    {

        Debug.Log("initSDK");

        initHwAds("121212", initSDKCallback);

    }

    [MonoPInvokeCallback(typeof(CallbackDelegate))]

    public static void initSDKCallback(string str)

    {

        Debug.Log("initSDKCallback");

    }



    public static void showRewardedVideo(string tag, Action<string> succeed = 
null, Action<string> fail = null)

    {

        

    }

    /// <summary>

    /// 视频播放成功

    /// </summary>

    /// <param name="jsonStr"></param>

    [MonoPInvokeCallback(typeof(CallbackDelegate))]

    static void PlatformCallback_FinishRewardAd(string jsonStr)

    {          



    }

    /// <summary>

    /// 视频播放失败

    /// </summary>

    /// <param name="jsonStr"></param>

    [MonoPInvokeCallback(typeof(CallbackDelegate))]

    static void PlatformCallback_FailedRewardAd(string jsonStr)

    {

        Debug.Log("AndroidPlatformWrapper 
PlatformCallback_FailedRewardAd:"+jsonStr);      

    }

    public static void showInterAd()

    {

        Debug.Log("AndroidPlatformWrapper showInterAd");  

    }

    [MonoPInvokeCallback(typeof(CallbackDelegate))]

    static void PlatformCallback_FinishInterAd(string jsonStr)

    {

        Debug.Log("AndroidPlatformWrapper 
PlatformCallback_FinishInterAd:"+jsonStr);

    }

    [MonoPInvokeCallback(typeof(CallbackDelegate))]

    static void PlatformCallback_FailedInterAd(string jsonStr)

    {

        Debug.Log("AndroidPlatformWrapper PlatformCallback_FailedInterAd:" + 
jsonStr);  

    }



    public static void TeaAnalystic(string custom, Dictionary<string, string> dic)

    {

        Debug.Log("AndroidPlatformWrapper TeaAnalystic:" + custom);       

    }

    /// <summary>

    /// 退出游戏

    /// </summary>

    public static void GameQuit()

    {

        if (jo != null)

            jo.Call("GameQuit");

    }

}

#endif


  1. From U3D to JAVA
        object[] paramArray = new object[3];

        paramArray[0] = "showInterAd";

        paramArray[1] = "PlatformCallback_FinishInterAd";

        paramArray[2] = "PlatformCallback_FailedInterAd";

        if (jo != null)

            jo.Call("showHwInterAd", paramArray);
            
image.png
  1. From JAVA to U3D
UnityPlayer.UnitySendMessage("AndroidPlatformWrapper",arg2,arg1);

4.From OC to U3D

1)分为两种办法:一种是通过UnitySendMessage方法来调用Unity所定义的方法。另一种方法则是通过入口参数,传入一个U3D的非托管方法,然后调用该方法即可。两种方式的对比如下:

UnitySendMessage方式 非托管方法方式
接口声明固定,只能是void method(string message)。 接口灵活,可以为任意接口。
不能带有返回值 可以带返回值
必须要挂载到对象后才能调用。 可以不用挂载对象,但需要通过接口传入该调用方法

2)UnitySendMessage
oc书写如下:

UnitySendMessage("Main Camera", "callback", resultStr.UTF8String);

3)非托管方式 cs代码如下

    [DllImport("__Internal")]
    private static extern void initHwAds( string jsonStr, CallbackDelegate callBack = null);
    public static void initSDK()
    {
        Debug.Log("initSDK");
        initHwAds("121212", initSDKCallback);

    }

oc代码如下


    typedef void (*CallbackDelegate)(const char *object);
    CallbackDelegate call;
    + (void)ToUnity:(char *) str{
        call(str);
    }
    void initHwAds( char *str ,CallbackDelegate callback){
        NSLog(@"initHwAds complete  111111 %s",str);
        //callback(str);
        call = callback;
        [IOSJSHelper initAd];
    }

5.DllImport 介绍

Unity本身对第三方C/C++/Objective-C编写的类库具有广泛的支持。不过不能使用Using的方式来引用,需要使用DllImport的方式来引用,一下是官方文档内容

Unity has extensive support for native plug-ins, which are libraries of native code written in C, C++, Objective-C, etc. Plug-ins allow your game code (written in Javascript or C#) to call functions from these libraries. This feature allows Unity to integrate with middleware libraries or existing C/C++ game code.(
Unity对本地插件有广泛的支持,这些插件是用C、c++、Objective-C等语言编写的本地代码库。插件允许游戏代码(用Javascript或c#编写)从这些库调用函数。这个特性允许Unity集成中间件库或现有的C/ c++游戏代码。)

6.MonoPInvokeCallback标签声明

声明一个静态方法,并使用MonoPInvokeCallback特性来标记为回调方法,目的是让iOS中调用该方法时可以转换为对应的托管方法。如:

    [MonoPInvokeCallback(typeof(CallbackDelegate))]
    static void PlatformCallback_FinishInterAd(string jsonStr)
    {
        Debug.Log("AndroidPlatformWrapper 
        PlatformCallback_FinishInterAd:"+jsonStr);
    }

注意:MonoPInvokeCallback特性参数是上一步中定义的非托管delegate。方法的声明一定要与delegate定义一致,并且必须为static进行修饰(iOS不支持非静态方法回调),否则会导致异常。

7.类型传递

对于基础类型数据(如:int、double、string等)是可以直接从U3D中传递给iOS的。具体对应关系如下表所示

image.png
上一篇下一篇

猜你喜欢

热点阅读