Unity跨平台技术分享

Unity调用Toast

2017-09-03  本文已影响0人  MemoryC

原文链接:
【游戏蛮牛】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即可)

效附显示效果

Toast效果图

注意

如宏定义所示,该扩展方法仅适用于Android平台,如果报错请先切换到Android平台,如下图。

切换平台至Android

技术交流:请加Q群 425377188

-------------------------------------------------END--------------------------------------------------

由于游戏蛮牛对于版权保护不给力,经常出现自己辛苦发的文章被非法转载到其他论坛(不注明原文作者和链接),后续MemoryC将转战 简书。游戏蛮牛上仍然会发,但以后可能会以转载或图片形式出现。请各位码友们支持原版,转载请务必注明原文链接。写篇博客不容易,本身就是免费的福利,非法转载更让人心寒。
上一篇下一篇

猜你喜欢

热点阅读