zoukankan      html  css  js  c++  java
  • iOS开发之OC和unity交互

    1、unity调用OC

     OC类代码

    // testUnity.h
    
    extern "C"{
        //声明一个方法
        void testUnityFunction(int index, const char *userName);
    }
    // testUnity.m
    
    extern "C"{
        void testUnityFunction(int index, const char *userName) {
            NSLog(@"接收到来自unity的传参");
        }
    }

    unity的C#文件代码

    #if UNITY_IOS
        //引入声明
        [DllImport("__Internal")]
        static extern void testUnityFunction (int index, string str);
    #endif
    
    //实现方法
    void Start() 
    {
        #if UNITY_IOS    
        testUnityFunction(1, "hello World");
        #endif
    }

    这样就可以直接实现unity调用OC。

    2、OC回调unity:这里我们使用函数指针接口方法进行回调,可以传参,也可以带返回参数

    C#文件代码

    void Start()
    {
        #if UNITY_IOS
        
        //设置回调托管函数指针
        eckShowPlayer handler = new eckShowPlayer(eckShowPlayerHandler);
        IntPtr showPlayer = Marshal.GetFunctionPointerForDelegate(handler);
        //调用OC的方法,将C#的回调方法函数指针传给OC
        eckRegisterRecieveGameCallback(showPlayer);
    
        #endif
    }
    
    #if UNITY_IOS
    
            //声明一个OC的注册回调方法函数指针的函数方法,每一个参数都是函数指针
        [DllImport("__Internal")]
        public static extern void eckRegisterRecieveGameCallback(
            IntPtr showPlayer
        );    
        
            //先声明方法、delegate修饰标记是回调方法
        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
        public delegate void eckShowPlayer(string userId);
    
            //实现回调方法 MonoPInvokeCallback修饰会让OC通过函数指针回调此方法
        [AOT.MonoPInvokeCallback(typeof(eckShowPlayer))]
        static void eckShowPlayerHandler(string userId) 
        {
            Debug.Log("收到来自oc的参数  - "+userId );
        }
    
    #endif 

    OC代码

    // testUnity.h
    
    //定义一个名字参数和C#类一样的方法
    typedef void (*eckShowPlayerHandler) (const char *userId);
    
    extern "C"{
        /**
         设置回调游戏的托管函数
         */
        void eckRegisterRecieveGameCallback(eckShowPlayerHandler showPlayer);
    }
    // testUnity.m
    
    //生命一个静态变量存储回调unity的函数指针
    static eckShowPlayerHandler showPlayerBlock;
    
    extern "C"{
        /**
         设置回调游戏的托管函数
         */
        void eckRegisterRecieveGameCallback(eckShowPlayerHandler showPlayer)
        {
            showPlayerBlock = showPlayer;
        }
    }

    这样在OC想要回调游戏的是时候即可调用 showPlayerBlock 就行了。

    其实大概流程就是先将C#的函数指针存入OC内存,在OC需要回调unity的时候就可以使用不同的指针来回调不同的unity方法,我上面的例子是一个方法、同理可以传入多个方法指针,每个方法也可以添加返回值等。大家有不懂的可以留言和我交流哈。

  • 相关阅读:
    C++:delete和delete[]释放内存的区别
    C++:四种必须使用初始化列表情况
    C++:获取数组长度
    C++:构造函数默认的参数声明
    java 的开源wiki维基系统
    openfire 最大连接数调优
    即时通讯服务器的对比
    分分钟带你玩转 Web Services
    让git忽略ignore所有文件,只对某些文件进行版本控制
    miracast 协议wifi display
  • 原文地址:https://www.cnblogs.com/hecanlin/p/12800883.html
Copyright © 2011-2022 走看看