原文链接:
【游戏蛮牛】Unity3D调用Android功能与组件(一)——调用Toast
发表于 2016-10-21 16:58:24 最后于2017-3-15 15:12 编辑
前言
- 前段时间有个小伙伴问我,在用Unity3D进行Android应用/游戏开发的时候,如何使用Android系统的空间和方法。我说可以用eclipse+Unity混合开发,网上也有很多相应的教程。他看了一圈之后觉得这样还是太麻烦,他想要调用的只是一些简单的东西比如Toast、分享、图库之类的,而且还会影响模块化设计,我觉得有点道理,于是打算用提供的AndroidJavaClass和AndroidJavaObject来实现Android部分简单的功能与空间调用。
- 如果您有任何疑问或者需求,请加Q群425377188交流。
1.先上代码
private void toastText(object str){
#if UNITY_ANDROID
AndroidJavaClass UnityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject currentActivity= UnityPlayer.GetStatic<AndroidJavaObject>("currentActivity");;
AndroidJavaClass Toast = new AndroidJavaClass("android.widget.Toast");
AndroidJavaObject context =currentActivity.Call<AndroidJavaObject>("getApplicationContext");
currentActivity.Call("runOnUiThread", new AndroidJavaRunnable(() => {
AndroidJavaObject javaString = new AndroidJavaObject("java.lang.String", str.ToString());
Toast.CallStatic<AndroidJavaObject>("makeText", context, javaString, Toast.GetStatic<int>("LENGTH_SHORT")).Call("show");
}
));
#endif
}
2、解释说明
- a. AndroidJavaClass对应着Android里面的Java类,而AndroidJavaObject对应着Android里面实例化的对象。
- b. 一定要切记C#里的String和Java的String不是一码事,所以调用Android方法时如果需要传字符串为参数时,不能直接给个字符串,应该给个Java里的String,例如 new AndroidJavaObject("java.lang.String","你想传的字符串");
- c. 由于AndroidJavaClass对应的是类,所以一般用之来调用对应的类的静态变量(GetStatic<Type>)或者静态方法(CallStatic<Type>("functionName",param1,param2,....));其中的Type为返回类型,注意是Java的返回类型不是C#的,一般整型和布尔型是通用的,其他的如果不清除可以统一写返回类型为AndroidJavaObject,当然没有返回类型的不需要写Type。
- d. AndroidJavaObject对应的是实例对象,所以用new方法给其初始化时要注意说明其是哪个类的实例对象。再比如刚才那个例子: AndroidJavaObject javaString=new AndroidJavaObject("java.lang.String","字符串的值");
- - - - - - - - - - - - -------------------------------2017-03-15-更-新--------------------------- - - - - - - - - - - - -
3、如果你觉得上述方法仍然麻烦,请忽略上面所有内容,往下看。
添加脚本MemoryCString.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// Discription:A String Extension Powered byMemoryC
/// Functions: extension a string text to showAsToast, toJavaString, or Speak out
/// CopyRight:MemoryC
/// Time:2017.02.15
/// </>
/// </summary>
public static class MemoryCString {
#if UNITY_ANDROID
/// <summary>
/// Show String as Toast.
/// </summary>
/// <param name="text">Text.</param>
/// <param name="activity">Activity.</param>
public static void showAsToast(this string text ,AndroidJavaObject activity=null){
Debug.Log (text);
if (activity == null) {
AndroidJavaClass UnityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
activity= UnityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
}
AndroidJavaClass Toast = new AndroidJavaClass("android.widget.Toast");
AndroidJavaObject context =activity.Call<AndroidJavaObject>("getApplicationContext");
activity.Call("runOnUiThread", new AndroidJavaRunnable(() => {
AndroidJavaObject javaString = new AndroidJavaObject("java.lang.String", text);
Toast.CallStatic<AndroidJavaObject>("makeText", context, javaString, Toast.GetStatic<int>("LENGTH_SHORT")).Call("show");
}
));
}
public static AndroidJavaObject toJavaString(this string CSharpString){
return new AndroidJavaObject ("java.lang.String", CSharpString);
}
#endif
}
由于简书的markdown对代码支持不是很好,请自行排版(如用Mono,选中代码——>Edit——>Format——>Format Selection即可)
-
使用方法:
对于任意一个你想显示出来的string myString,直接调用 myString.showAsToast();就可以了,
例如
"Welcome to Read Artical By MemoryC".showAsToast();
或者
string memoryc="Welcome to Read Artical By MemoryC";
memoryc.showAsToast();
效附显示效果
注意
如宏定义所示,该扩展方法仅适用于Android平台,如果报错请先切换到Android平台,如下图。
技术交流:请加Q群 425377188
-------------------------------------------------END--------------------------------------------------