本文屬于「Unity與iOS、Android平臺的整合」系列文章之一,轉(zhuǎn)載請注明出處。
主要講解Unity與iOS、Android平臺相互傳遞參數(shù)
零、前言
這篇我不打算寫得太多,因?yàn)橹黧w內(nèi)容在上一篇5、與iOS、Android的交互 實(shí)踐篇——主動(dòng)調(diào)用有詳細(xì)的講解,希望大家能夠跟著流程一步一步向下走。
一、前期工作
把上一個(gè)工程打開,然后開始添加代碼
二、Unity向iOS、Android傳遞參數(shù)
首先,我們需要設(shè)計(jì)一個(gè)需求
現(xiàn)在策劃說:需要一個(gè)原生彈窗,顯示一個(gè)隨機(jī)數(shù)和一個(gè)字符串
好的,需求有了,可以開始設(shè)計(jì)接口了
C#需要向外提供一個(gè)接口,供其他C#代碼調(diào)用
OC需要提供一個(gè)接口,用于接收參數(shù)、調(diào)用iOS系統(tǒng)彈窗
Java需要提供一個(gè)接口,用于接收參數(shù)、調(diào)用Android系統(tǒng)彈窗
0.Unity內(nèi)部
在ConnectUnityToiOSAndroid.cs中寫兩個(gè)方法,寫得很簡單,大家看一下注釋就清楚了
//C#面向Unity開發(fā)者的接口
public void ShowStringAndInt()
{
MyConsole.Print("向iOS、Android傳遞參數(shù)");
ShowStringAndInt_("Unity向iOS、Android傳遞參數(shù)", Random.Range(0, 100));
}
#if UNITY_EDITOR
//運(yùn)行在編輯器環(huán)境的接口,一般用于編輯器內(nèi)模擬數(shù)據(jù)
private void ShowStringAndInt_(string str, int num)
{
MyConsole.Print(str + " " + num);
}
#endif
1.Unity -> iOS
在ConnectUnityToiOSAndroid.cs中關(guān)聯(lián)C++的接口
#if UNITY_IOS
//運(yùn)行在iOS環(huán)境的接口,關(guān)聯(lián)到C++接口
[DllImport("__Internal")]
private static extern void ShowStringAndInt_(string str, int num);
#endif
在ConnectUnityToiOS.mm中用OC寫調(diào)用系統(tǒng)彈窗
-(void)ShowStringAndInt:(NSString*)str Num:(int)num {
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:str
message:[NSString stringWithFormat:@"數(shù)字是%d",num]
delegate:self
cancelButtonTitle:@"確定"
otherButtonTitles:nil];
[alertView show];
}
在ConnectUnityToiOS.mm中用C++調(diào)用OC的接口
extern "C"{
void ShowStringAndInt_(const char* str, const int num){
[[ConnectUnityToiOS sharedInstance] ShowStringAndInt:[NSString stringWithUTF8String:str] Num:num];
}
}
運(yùn)行效果~
2.Unity -> Android
在ConnectUnityToiOSAndroid.cs中關(guān)聯(lián)Java的接口
#if UNITY_ANDROID
//運(yùn)行在Android環(huán)境的接口
private static void ShowStringAndInt_(string str, int num)
{
//注意,這邊一定要把游戲的包名寫正確,否則找不到類。
using (AndroidJavaClass jc = new AndroidJavaClass("com.wsc.ConnectUnityToiOSAndroid.ConnectUnityToAndroid"))
{
jc.CallStatic("ShowStringAndInt_", str, num);
}
}
#endif
在ConnectUnityToAndroid.java中用Java調(diào)用系統(tǒng)彈窗
public static void ShowStringAndInt_(final String str, final int num){
UnityPlayer.currentActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
AlertDialog.Builder builder = new AlertDialog.Builder(UnityPlayer.currentActivity)
.setTitle(str)
.setMessage("數(shù)字是" + num)
.setPositiveButton("確定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
UnityPlayer.UnitySendMessage("Camera", "NativeTipClosed", "");
}
});
builder.show();
}
});
}
運(yùn)行效果~
三、iOS、Android向Unity傳遞參數(shù)
首先,我們需要設(shè)計(jì)一個(gè)需求
現(xiàn)在策劃說:需要獲得當(dāng)前系統(tǒng)的語言
好的,需求有了,可以開始設(shè)計(jì)接口了
C#需要向OC、Java提供一個(gè)接口,以接收原生代碼的參數(shù)
OC需要在被調(diào)用后,主動(dòng)調(diào)用C#并傳遞參數(shù)
Java需要在被調(diào)用后,主動(dòng)調(diào)用C#并傳遞參數(shù)
0.Unity
將ConnectUnityToiOSAndroid.cs掛載在某個(gè)物體上,我選擇了名為「Camera」的攝像機(jī)物體。
在ConnectUnityToiOSAndroid.cs中寫
//C#面向Unity開發(fā)者的接口
public void GetLanguage()
{
MyConsole.Print("Unity請求系統(tǒng)語言");
GetLanguage_();
}
//C#面向iOS、Android的接口
private void NativeLanguage(string language)
{
MyConsole.Print("系統(tǒng)語言是:" + language);
}
#if UNITY_EDITOR
//運(yùn)行在編輯器環(huán)境的接口,一般用于編輯器內(nèi)模擬數(shù)據(jù)
private void GetLanguage_()
{
SendMessage("NativeLanguage", Application.systemLanguage + "-來自Unity");
}
#endif
1.iOS -> Unity
在ConnectUnityToiOSAndroid.cs中關(guān)聯(lián)C++的接口
#if UNITY_IOS
//運(yùn)行在iOS環(huán)境的接口,關(guān)聯(lián)到C++接口
[DllImport("__Internal")]
private static extern void GetLanguage_();
#endif
在ConnectUnityToiOS.mm中用OC獲取當(dāng)前系統(tǒng)語言并回調(diào)
-(void)GetLanguage{
NSString* languageStr = [NSString stringWithFormat:@"%@ -來自iOS",[[NSLocale preferredLanguages] objectAtIndex:0]];
UnitySendMessage("Camera", "NativeLanguage", strdup([languageStr UTF8String]));
}
在ConnectUnityToiOS.mm中用C++調(diào)用OC的接口
extern "C"{
void GetLanguage_(){
[[ConnectUnityToiOS sharedInstance] GetLanguage];
}
}
運(yùn)行效果~
2.Android -> Unity
在ConnectUnityToiOSAndroid.cs中關(guān)聯(lián)Java的接口
#if UNITY_ANDROID
//運(yùn)行在Android環(huán)境的接口
private static void GetLanguage_()
{
//注意,這邊一定要把游戲的包名寫正確,否則找不到類。
using (AndroidJavaClass jc = new AndroidJavaClass("com.wsc.ConnectUnityToiOSAndroid.ConnectUnityToAndroid"))
{
jc.CallStatic("GetLanguage_");
}
}
#endif
在ConnectUnityToAndroid.java中用Java調(diào)用系統(tǒng)彈窗
public static void GetLanguage_(){
UnityPlayer.currentActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
UnityPlayer.UnitySendMessage("Camera", "NativeLanguage", Locale.getDefault().getLanguage() + " -來自Android");
}
});
}
四、收個(gè)尾
以上內(nèi)容為Unity與iOS、Android之間相互傳遞參數(shù)的所有內(nèi)容。
如果你不知道如何導(dǎo)出工程,請看一下前幾篇文章
如果你不能理解我的實(shí)現(xiàn)步驟,請看一下前幾篇文章
附上我的Unity示例工程,里面包含了上文中所有代碼,打包編譯,進(jìn)行對應(yīng)修改應(yīng)該就能跑~
下載鏈接: https://pan.baidu.com/s/1miAWkwK 密碼: 9yaz