美文网首页
unity 与oc、java交互

unity 与oc、java交互

作者: 忆中异 | 来源:发表于2021-04-13 16:02 被阅读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

    相关文章

      网友评论

          本文标题:unity 与oc、java交互

          本文链接:https://www.haomeiwen.com/subject/yhrclltx.html