zoukankan      html  css  js  c++  java
  • Unity 使用C/C++ 跨平台终极解决方式(PC,iOS,Android,以及支持C/C++的平台)

    PC的事实上根本不用说,毕竟C#和C++交互的文章已经够多了,当然我自觉得经过几次折腾后。差点儿全部游戏须要到的操作我都掌握了(各种传參方法,各种坑,不懂的能够留言问。尽管基本上没人看。哈哈)




    废话不多说,我们主要来讲两大平台——iOS和android——与unity的native代码交互


    这里啰嗦一下就是去网上搜都是各种蛋疼的东西,比方假设要调用unity C#的函数怎么办,差点儿清一色是给出UnitySendMessage的方法。在项目中用这个简直是作死。那么多函数那么复杂的參数你这个破函数顶个屁用啊。

    iOS还好说。Android更是坑,竟然要你去和java代码交互,简单来说就是C/C++ -》 Java -》C#。而实际上大部分时候你根本不须要这么蛋疼,直接C/C++ -》C#就能够了。由于C/C++差点儿能够操作全部底层资源。当然个别需求例外


    正题


    typedef struct Parameter {
        int a;
        int b;
    } Param;
    
    
    typedef void (*CallBack)(Param* p);
    
    void TestFunc(CallBack cb){
        Param p;
        p.a = 10;
        p.b = 20;
        cb(&p);
    }

    extern “C” 这样的细节就不多说了,由于我直接建立的是.c文件所以不须要这个标记,这里直接用典型的回调函数做样例,由于有了回调。你就不必考虑怎样使用C/C++调用C#或者反过来,由于这个样例实际上已经包括了信息的交换


    public class NewBehaviourScript : MonoBehaviour {
    
        [StructLayout(LayoutKind.Sequential)]
        struct Parameter {
           public int a;
           public int b;
        }
    
        delegate void CallBack(IntPtr param);
    
        [DllImport("TestLib")]
        static extern void TestFunc(CallBack cb);
    
        [MonoPInvokeCallback(typeof(CallBack))]
        static void CallBackFunc(IntPtr param) {
           var p = (Parameter)Marshal.PtrToStructure(param, typeof(Parameter));
           Debug.Log("a:" + p.a + " b:" + p.b);
        }
    
    	// Use this for initialization
    	void Start () {
            TestFunc(CallBackFunc);
    	}
    	
    	// Update is called once per frame
    	void Update () {
    	
    	}
    }

    以上是unity的脚本。输出a,b。

    注意到关键没,对,就是

    [MonoPInvokeCallback(typeof(CallBack))]

    这个标签。没有这个标签就无法回调成功。

    使用这种方法就能够保证编码效率和运行效率,你不须要进行各种中间层的封装。不需把字符串转来转去,这全然归功于Mono的跨平台机制。Unity仅仅是进行了一些简便操作

    另外须要注意的是Android可能须要编译各种相应的.so。其有用AndroidStudio一下子全部编译出来然后丢到unity就好了

    还有在PC平台以下不须要这个标签!


    事实上假设不是为了保护代码,对于unity开发差点儿都能够在C#中完毕,C#功能已经足够强大了,对于Android保护C#也在上篇文章提到过,尽管个人并不知道安全性假设,唯一的提示就是使用Coroutine之后,反编译无法看到其过程。可是我并不知道是否仅仅是移到别的地方去了。我个人在把一下敏感信息放在Coroutine里面来防止反编译(尽管可能然并卵)

  • 相关阅读:
    JavaScript面向对象之闭包的理解
    JavaScript面向对象之函数构造器的理解
    记录jq控制select 选中状态
    JavaScript面向对象之创建类和方法
    获取对象属相 点运算符 和方括号 运算符
    parseFloat 和 Number isNaN 转换
    Js数据类型和运算符
    break , continue 和 标签 跳出循环
    javaScript--循环语句
    三元运算符
  • 原文地址:https://www.cnblogs.com/llguanli/p/8454822.html
Copyright © 2011-2022 走看看