c 跨平臺android,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里面來防止反編譯(盡管可能然并卵)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/271593.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/271593.shtml
英文地址,請注明出處:http://en.pswp.cn/news/271593.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

hades武器第四形態解鎖_凱多的第四個技能預告——冰凍!

在《海賊王》中,四皇凱多被譽為“海陸空最強生物”,能夠變成神龍,如果不出意外的話,凱多應該是動物系幻獸種神龍果實的能力者。畢竟凱多的海賊團就叫做“百獸海賊團”,手下也都是動物系果實能力者,能夠降服…

解決git@github.com: Permission denied (publickey). fatal: Could not read from remote repository. Pleas

今天用idea提交代碼到github上,push后報錯 gitgithub.com: Permission denied (publickey). fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists. 一:原因分析 Permission denied (publickey) 沒…

轉載------------java equals 方法

作者:海子出處:http://www.cnblogs.com/dolphin0520/淺談Java中的equals和 在初學Java時,可能會經常碰到下面的代碼: 1 String str1 new String("hello"); 2 String str2 new String("hello"); 3 …

計算機系統基礎:校驗碼知識筆記

1、校驗碼概念 校驗碼主要是為了解決計算機各部件進行數據傳輸和交換,確保傳送過程的正確無誤,一是為了提高硬件電路的可靠性,二是提高代碼的校驗能力。通常會用校驗碼來檢查傳送的數據是否正確。 校驗碼編碼分為兩類:合法編碼、錯…

qml與HTML數據交互,GitHub - toby20130333/QtQuickHtmlBridge: 基于QtQuick的C++,qml,Html三者的Bridge交互...

基于QtQuick的C,qml,Html三者的Bridge交互主要功能自定義C對象并注冊到QML可以在QML中繼續擴展C對象的屬性和方法 信號等將C對象注入到WebChannelHtml中引入C對象JavaScript與C直接交互示例代碼說明main.cpp://該實例必須直接繼承自Object的 QWidget的忽略qmlRegisterType(&quo…

html為什么要進行表單驗證_化學錨栓為什么要進行拉拔試驗?

點擊箭頭處“藍色字”,關注我們哦!!化學錨栓是繼膨脹錨栓之后出現的一種新型緊固材料,由化學藥劑與金屬桿體組成,是通過特制的化學粘接劑,將螺桿膠結固定于砼基材鉆孔中,以實現對固定件錨固的復…

電路基礎知識講解(太全面了)

IT技術分享社區個人博客網站:https://programmerblog.xyz文章推薦程序員效率:畫流程圖常用的工具程序員效率:整理常用的在線筆記軟件遠程辦公:常用的遠程協助軟件,你都知道嗎?51單片機程序下載、ISP及串口基…

github設置倉庫可見性 私人倉庫設置

一:點擊Setting 二:點擊Make private 三:閱讀關于將倉庫設為私有的警告。 入您要設為私有的倉庫的名稱,例如 accountname/reponame。 單擊 I understand, make this repository private(我已了解,請將此倉庫設為私有)

Git合并分支操作

1. 添加自己的文件 git add .; 2. 緩存自己的文件 git stash; 3. 查看狀態 git status; 4. 獲取別的分支 git pull origin master(分支名); 5. 出棧自己的文件 git stash pop 。 轉載于:https://www.cnblogs.com/csl0910/p/5605868.html

html鼠標懸停區域拉伸,html – :將鼠標懸停在具有邊框半徑的div上

這里的問題是子元素不繼承父元素的border-radius.有兩種方法可以實現您想要的:您可以將子元素的border-radius設置為匹配或大于父元素的radius,或者將父元素的overflow屬性設置為hidden.這是一個快速的片段,說明了問題和兩個解決方案:*{box-sizing:borde…

rfid在高速公路管理中的應用_RFID技術與ETC技術在弱電門禁系統中應用

前言:無線射頻識別技術(RFID技術)較早的大規模的綜合應用,發展至今,我國的RFID技術已經較為成熟。 相關技術1、無線射頻識別 RFID(Radio Frequency Identification,無線射頻識別)是一種非接觸式的自動識別技術,它通過射…

Idea中Terminal中git基本操作

列出分支 列出分支基本命令:git branch 沒有參數時,git branch 會列出你在本地的分支。 上圖的意思就是,我們有一個叫做 master 的分支,并且該分支是當前分支(有*星號的)。 當你執行 git init 的時候,默認情況下 Gi…

計算機體系結構知識筆記

計算機體系結構結構:計算機的概念結構、功能和性能特性,它從一個更高的層次對計算機的結構特征等宏觀特征進行研究。 1、計算機體系結構分類 2、CISC和RISC 指令體系結構(ISA):一個處理器支持的指令和指令的字節級編碼…

java類的加載機制

一、什么是類的加載 類的加載指的是將類的.class文件中的二進制數據讀入到內存中,將其放在運行時數據區的方法區內,然后在堆區創建一個java.lang.Class對象,用來封裝類在方法區內的數據結構。類的加載的最終產品是位于堆區中的Class對象&…

HttpServletRequestWrapper、HttpServletResponseWrapper結合 過濾器 實現接口的加解密、國際化

目錄 一、HttpServletRequestWrapper代碼 二、HttpServletRequestWrapper代碼 三、加解密過濾器代碼 四、國際化過濾器代碼 一、HttpServletRequestWrapper代碼 package com.vteam.uap.security.httpWrapper;import jakarta.servlet.ReadListener; import jakarta.servlet.…

razor 寫入html標記,如何在Razor中編寫“ Html.BeginForm”

泛舟湖上清波郎朗以下代碼可以正常工作:using (Html.BeginForm("Upload", "Upload", FormMethod.Post, new { enctype "multipart/form-data" })){ Html.ValidationSummary(true) …

windows安全模式_Winclone 8 for Mac(Windows分區備份遷移和還原工具)

winclone 8 Mac版是一款專業的boot Camp遷移助手,能夠將你的PC移動到你的Mac中,讓你實現win系統的遷移。winclone Mac版可以將Bootcamp分區安裝的windows進行克隆也可將克隆文件傳回Bootcamp分區。并且操作簡單。你只需要通過幾次點擊,就能快…

IDEA中一個被低估的功能,一鍵把項目代碼繪制成UML類圖

閱讀本文大概需要 2 分鐘。來自:blog.csdn.net/hy_coming/article/details/80741717最近在開發的過程當中,對于已有的代碼,想將相關類繪制成UML類圖,雖然現在有很多UML類圖的優秀軟件,比如ProcessOn(可視化…

java導出生成word(類似簡歷導出)

最近做的項目,需要將一些信息導出到word中。在網上找了好多解決方案,現在將這幾天的總結分享一下。 目前來看,java導出word大致有6種解決方案: 1:Jacob是Java-COM Bridge的縮寫,它在Java與微軟的COM組件之間…

計算機基礎:存儲系統知識筆記(一)

1、存儲系統定義 由一個不同容量、成本和訪問時間的存儲結構構成的層次結構,這些存儲器通過適當的硬件和軟件有機的組合在一起。 存儲器的層次:CPU內部的寄存器、高速緩存Cache、主存儲器、輔助存儲器 2、存儲器的分類 2.1 存儲位置分類 內存&#xff1a…