国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Unity3d】Unity與iOS之間通信

這篇具有很好參考價值的文章主要介紹了【Unity3d】Unity與iOS之間通信。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

在Unity開發(fā)或者SDK開發(fā)經(jīng)常遇到Unity與移動端原生層之間進行通信,這里把它們之間通信做一個整理。

關(guān)于Unity與Android之間通信,參考【Unity3d】Unity與Android之間通信

Unity調(diào)用Objective-C

主要分三個步驟:

(一)、在xcode中定義要被unity調(diào)用的函數(shù)

新建一個類,名字可以任意,比如UnityBridge:

頭文件:UnityBridge.h (頭文件中不需要字段和函數(shù)聲明)

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface UnityBridge : NSObject

@end

NS_ASSUME_NONNULL_END

頭文件里沒什么代碼,主要代碼在實現(xiàn)文件中。

實現(xiàn)文件:UnityBridge.m

實現(xiàn)文件中需要用c語言定義函數(shù),這些函數(shù)定義了之后,就可以被unity調(diào)用:

#import "UnityBridge.h"

//如果c#調(diào)用oc函數(shù)時需要一個回調(diào),需要先聲明回調(diào)參數(shù)類型:
typedef void (*MyResultCallback) (int status,const char *result);

//在.m文件中以下4行可以不需要
#if defined (__cplusplus)
extern "C"
{
#endif

	//這里寫被unity調(diào)用的函數(shù)
	
 	void test1(void){
		//這里是函數(shù)實現(xiàn),支持oc語法
	}

	/**
	* int類型參數(shù),返回int
	*/
	int test2(int params){
		//這里是函數(shù)實現(xiàn),支持oc語法
	}
	/**
	* 字符串類型參數(shù)
	*/
	void test3(const char *params){
		//這里是函數(shù)實現(xiàn),支持oc語法
	}

	/**
	* 返回字符串時,不能直接返回oc轉(zhuǎn)c的字符串,要調(diào)用strdup函數(shù)再返回
	*/
	const char* test4(void){
		//返回字符串時,需要使用c分配內(nèi)存再返回,否則閃退
		//return "abc" //錯誤,會閃退
		//return [@"abc" UTF8String];//錯誤,會閃退
		//return strdup("abc") //正確	
		
		//strdup函數(shù)需要引入#import <string.h>
		return strdup([@"abc" UTF8String]) //要調(diào)用strdup()函數(shù)分配c內(nèi)存再返回給unity,不然閃退
	}

	/**
	* 支持回調(diào)參數(shù)
	*/
	void test5(MyResultCallback callback){
		//這里是函數(shù)實現(xiàn),支持oc語法
		int code = 0;
		NSString p = @"test";
		const char *result = [p UTF8String];
		//回調(diào)給c#
		callback(code,result)
	}
	
//在.m文件中以下3行可以不需要
#if defined (__cplusplus)
}
#endif

函數(shù)返回類型是字符串時,oc這邊不能直接返回oc轉(zhuǎn)c的char*字符,否則閃退,c++閃退代碼行:

// Marshaling cleanup of return value native representation
il2cpp_codegen_marshal_free(returnValue);
原因是oc使用了ARC自動釋放內(nèi)存,c層再去free內(nèi)存發(fā)現(xiàn)未分配就會報錯。
需要調(diào)用strdup()函數(shù)再返回,函數(shù)所在頭文件:#import <string.h> 參見上面示例代碼的test4()函數(shù)。

注意這些代碼不要寫在@implementation中,它是c語言的函數(shù)。

C++支持函數(shù)重載,而C不支持,兩者的編譯規(guī)則也不一樣。函數(shù)被C++編譯后在符號庫中的名字與C語言的不同。例如,假設某個函數(shù)的原型為: void foo( int x, int y ); 該函數(shù)被C編譯器編譯后在符號庫中的名字可能為_foo,而C++編譯器則會產(chǎn)生像_foo_int_int之類的名字(不同的編譯器可能生成的名字不 同,但是都采用了相同的機制,生成的新名字稱為“mangled name”)。_foo_int_int這樣的名字包含了函數(shù)名、函數(shù)參數(shù)數(shù)量及類型信息,C++就是靠這種機制來實現(xiàn)函數(shù)重載的。如果要在C++中使用C的函數(shù),需要加extern "C"修飾。
#if defined (__cplusplus) 這是一個宏判斷,c++中才有這個宏。extern "C"也是c++的關(guān)鍵字。因為oc是支持c++(在.mm文件中才支持),extern "C"表示后面函數(shù)是c語言的,供外部調(diào)用的。如果在.m文件中,可以不需要extren “C”。

(二)、將oc代碼復制到unity工程中。

將oc代碼(包括.h和.m源文件)拷貝到Unity工程的Assets目錄或子目錄中。

實際上將oc代碼放在unity工程的Assets目錄下的任意位置都可以,oc代碼會自動被unity引擎識別。

(筆者使用的unity版本是2019.4,以前的版本不知道是否可以是任意位置。)

為了方便管理,oc代碼一般放在Assets/Plugins/iOS中。

也可以將代碼打包成framework靜態(tài)庫,然后將其拷貝到unity工程的Assets目錄中,一般放在 Assets/Plugins/iOS這個目錄中。Unity導出xcode會自動依賴這個framework。

(三)、在unity的c#腳本中聲明外部(oc)函數(shù)原型
using System.Runtime.InteropServices; //需要引入這個命名空間,會提示引入
using UnityEngine;

public class Test

{
   
    private Test() {}


  
#if UNITY_IOS //加個宏比較好

	//以下是外部函數(shù)聲明,函數(shù)簽名必須與oc函數(shù)保持一致,參數(shù)類型用各自語言的,類型映射見文末。
	//聲明無參數(shù)無返回值的函數(shù)
    [DllImport("__Internal")]
    private static extern void test1();
    
	//聲明有一個int參數(shù)和int返回值的函數(shù)
 	[DllImport("__Internal")]
    private static extern int test2(int p);
    
	//聲明一個string參數(shù)的函數(shù)
    [DllImport("__Internal")]
    private static extern void test3(string p);

	//聲明返回string類型的函數(shù)
    [DllImport("__Internal")]
    private static extern string test4();

	//如果需要oc的回調(diào),聲明一個回調(diào)函數(shù)類型
    delegate void MyResultDelegate(int code,string result);
    
    [DllImport("__Internal")]
    private static extern void test5(MyResultDelegate resultDelegate);
    
	/**
	* 回調(diào)函數(shù)的實現(xiàn)(或者叫實例)
	*  注意:必須是static類型的
	*/
   	[AOT.MonoPInvokeCallback(typeof(MyResultDelegate))]
     private static void MyResultDelegateInstance(int code, string result)
     {
       //這里寫接收到oc回調(diào)的代碼
     }

#endif

 	 public  void CallOC()
	  {
	  #if UNITY_IOS
	  	test1();
	  	int result1 = test2(1);
	  	test3("abc");
	  	string result2 = test4();
	  	test5(MyResultDelegateInstance);
	  #endif
      }
}

在c#中調(diào)用oc中對應的方法,參見以上 CallOC()。

c#調(diào)用oc注意事項:

1、數(shù)據(jù)類型需要使用各自語言的,兩者數(shù)據(jù)類型映射關(guān)系在文未。

2、c#中聲明的oc方法、回調(diào),都需要static修飾。

Objective-C調(diào)用Unity(c#)

oc調(diào)用c#比較簡單,一般使用以下這個方法:

  UnitySendMessage("MyTestObject", "TestFunc", "msg");

UnitySendMessage函數(shù)聲明在UnityFramework.frameworkUnityInterface.h頭文件中:

void  UnitySendMessage(const char* obj, const char* method, const char* msg);

第一個參數(shù)obj表示unity中物體GameObject的名字,注意不是c#腳本的名稱也不是類名。

如下圖:
unity 自動生成objective-c,Unity3D,iOS,unity,ios
第二個參數(shù)method表示這個物體掛載的c#腳本中方法的名字。

第三個參數(shù)表示msg表示這個方法接收的數(shù)據(jù)。

例如,以上物體MyTestObject掛載了MyScript.c#腳本(如上圖),MyScript.c#中有TestFunc方法:

using UnityEngine;

public class MyScript : MonoBehaviour
{

    private void TestFunc(string content)
 	{
 		//這里是接收oc調(diào)用的實現(xiàn)
	}  
             
}

那么在oc中調(diào)用UnitySendMessage("MyTestObject", "TestFunc", "msg") c#的TestFunc方法就會執(zhí)行。

如果有多個參數(shù)需要發(fā)送,推薦使用json格式。

oc調(diào)用c#注意事項:

1、需要依賴UnityFramework.framework框架。

2、unity工程導出的xcode工程默認已經(jīng)有UnityFramework.framework。

3、如果是自己新建的xcode工程需要手動導入這個框架。

附:c#與oc數(shù)據(jù)類型映射:文章來源地址http://www.zghlxwxcb.cn/news/detail-789074.html

Unity(c#) Objective-C
int int
float float
bool bool
string const char *
long long long

到了這里,關(guān)于【Unity3d】Unity與iOS之間通信的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務器費用

相關(guān)文章

  • vue項目接入unity3D模塊并進行數(shù)據(jù)通信

    vue項目接入unity3D模塊并進行數(shù)據(jù)通信

    unity工程師會提供一個前端可使用的包,將其放在vue項目的 public 下,我這里以 unity 文件夾命名

    2024年02月01日
    瀏覽(20)
  • Unity3D WebGL平臺使用WebSocket通信的方法和示例

    Unity3D WebGL平臺使用WebSocket通信的方法和示例

    ? ? ? 之前在WebGL平臺和服務端交互的時候使用的是UnityWebRequest,通過WebAPI的方式進行交互,后來發(fā)現(xiàn)可以用WebSocket交互后就果斷換了WebSocket。 一、Unity3D客戶端 我在Unity端使用的是 NativeWebSocket NativeWebSocket下載地址 直接導入Unity即可, 下面是適配的代碼,直接掛載在GameObject。

    2024年02月11日
    瀏覽(26)
  • Unity3d使用Netcode實現(xiàn)Hololens、Android和Pc端通信

    Unity3d使用Netcode實現(xiàn)Hololens、Android和Pc端通信

    在Unity3d中使用現(xiàn)有的Netcode/Mirror組件實現(xiàn)Hololens、Android和Pc端的三方通信,可以指定一平臺為服務器端,其他的兩平臺多為客戶端,不過通常是進行兩個平臺的通信即可。在這片文章中,可以實現(xiàn)平移、縮放以及旋轉(zhuǎn)的同步 具體步驟如下: 版本:unity2020.3LTS、VS2019 一、配置

    2024年02月09日
    瀏覽(27)
  • unity3D基礎操作之01--unity3d窗口界面介紹

    unity3D基礎操作之01--unity3d窗口界面介紹

    提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 1、Scene場景編輯窗口; 2、Game游戲運行窗口; 3、Hierarchy場景物體列表窗口; 4、Project項目資源列表窗口; 5、Inspector屬性編輯列表窗口; 6、其他常調(diào)節(jié)窗口 在屏幕左上方為場景編輯窗口Scene,在場景編

    2024年02月06日
    瀏覽(31)
  • 【Unity3D日常開發(fā)】Unity3D中協(xié)程的使用

    【Unity3D日常開發(fā)】Unity3D中協(xié)程的使用

    推薦閱讀 CSDN主頁 GitHub開源地址 Unity3D插件分享 簡書地址 我的個人博客 大家好,我是佛系工程師 ☆恬靜的小魔龍☆ ,不定時更新Unity開發(fā)技巧,覺得有用記得一鍵三連哦。 最近有小伙伴問協(xié)程怎么用、怎么寫,我也是會用會寫,但是原理不是很明白。 學習了一下,總結(jié)出

    2024年02月12日
    瀏覽(30)
  • 【Unity3D】Unity3D 軟件安裝 ( 注冊賬號并下載 Unity Hub | 安裝 Unity Hub | 獲取個人版授權(quán) | 中文環(huán)境設置 | 安裝 Unity3D 編輯器 )

    【Unity3D】Unity3D 軟件安裝 ( 注冊賬號并下載 Unity Hub | 安裝 Unity Hub | 獲取個人版授權(quán) | 中文環(huán)境設置 | 安裝 Unity3D 編輯器 )

    Unity 官方網(wǎng)站 : 英文 : https://unity.com 中文 : https://unity.cn 進入 中文網(wǎng)站 https://unity.cn , 點擊右上角的 \\\" 下載 Unity \\\" 按鈕 ; 推薦下載 Unity3D 的長期支持版本 ; 點擊界面中的 \\\" 下載 Unity Hub \\\" 選項 ; 根據(jù)你的系統(tǒng) , 選擇對應的 Unity Hub , 我在 Windows 上開發(fā) , 因此選擇 \\\" Windows 下載 \\\"

    2024年01月25日
    瀏覽(119)
  • 【Unity3D小功能】Unity3D中實現(xiàn)Text顯示版本功能

    【Unity3D小功能】Unity3D中實現(xiàn)Text顯示版本功能

    推薦閱讀 CSDN主頁 GitHub開源地址 Unity3D插件分享 簡書地址 我的個人博客 大家好,我是佛系工程師 ☆恬靜的小魔龍☆ ,不定時更新Unity開發(fā)技巧,覺得有用記得一鍵三連哦。 在項目開發(fā)中,會遇到要控制版本的情況,比如說對比版本號,版本不對再更新版本的功能,這些就是

    2024年02月05日
    瀏覽(99)
  • 【Unity3D日常開發(fā)】Unity3D中實現(xiàn)單例模式詳解

    【Unity3D日常開發(fā)】Unity3D中實現(xiàn)單例模式詳解

    推薦閱讀 CSDN主頁 GitHub開源地址 Unity3D插件分享 簡書地址 我的個人博客 大家好,我是佛系工程師 ☆恬靜的小魔龍☆ ,不定時更新Unity開發(fā)技巧,覺得有用記得一鍵三連哦。 首先,說一下,什么是 單例模式(Singleton) 。 單例模式是設計模式中常見的一種設計模式,目的是為了

    2024年02月02日
    瀏覽(29)
  • 【Unity3D-01】 記錄Unity3D調(diào)用外接攝像頭

    【Unity3D-01】 記錄Unity3D調(diào)用外接攝像頭

    最近想在Unity3D上調(diào)用一個攝像頭,通過查找資料發(fā)現(xiàn)仙魁XAN和八哥快走開的博客符合我的想法,實現(xiàn)起來也不難就嘗試了一下 2.1 在這個工程里新建Canvas 如下圖所示 然后下設RawImage為載體 2.2 在Assets里面新建一個腳本命名為PlaneManager.cs 代碼內(nèi)容如下(參考八哥快走開的博客)

    2024年02月04日
    瀏覽(30)
  • 【Unity3D小功能】Unity3D中實現(xiàn)點擊‘文字’出現(xiàn)‘UI面板’

    【Unity3D小功能】Unity3D中實現(xiàn)點擊‘文字’出現(xiàn)‘UI面板’

    推薦閱讀 CSDN主頁 GitHub開源地址 Unity3D插件分享 簡書地址 QQ群:398291828 大家好,我是佛系工程師 ☆恬靜的小魔龍☆ ,不定時更新Unity開發(fā)技巧,覺得有用記得一鍵三連哦。 寵粉博主又來了,今天有粉絲問我如何實現(xiàn)點擊一段文字然后出現(xiàn)的面板在那段文字附近顯示: 深入了

    2024年04月13日
    瀏覽(167)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包