• iOS开发之OC调用unity


    OC回调unity

    有两种方法

    第一种:

    UnitySendMessage方式(接口声明固定,只能是void method(string message);不能带有返回值;必须要挂载到对象后才能调用。

    使用方法很简单

    NSString *resultStr = @"hello world";
    UnitySendMessage("Main Camera", "callback", resultStr.UTF8String);

    第二种:

    使用函数指针接口方法进行回调,可以传参,也可以带返回参数,调用灵活

    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方法,我上面的例子是一个方法、同理可以传入多个方法指针,每个方法也可以添加返回值等。大家有不懂的可以留言和我交流哈。

  • 相关阅读:
    Spring实现声明式事务
    Spring整合MyBatis
    Spring AOP
    代理模式
    Bean的作用域
    Spring的配置
    HQL题目记录以及解题思路--持续更新
    数仓学习之路一:数仓理论
    DBeaver连接Hive遇到的坑
    MySQL常见面试题
  • 原文地址:https://www.cnblogs.com/hecanlin/p/12801213.html
Copyright © 2020-2023  润新知