找回密码
 立即注册
查看: 641|回复: 0

unity 与oc、java交互

[复制链接]
发表于 2021-4-14 09:13 | 显示全部楼层 |阅读模式
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_ANDROIDusing 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_ANDROIDusing 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_EDITORusing 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_EDITORusing 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
    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

    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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-9-20 22:55 , Processed in 0.090463 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表