Unity Android 之 基础 Unity 调用 Android 的原生方法的方式的一些简单整理(仅供参考)

 

 

Unity Android 之 基础 Unity 调用 Android 的原生方法的方式的一些简单整理(仅供参考)

 

目录

Unity Android 之 基础 Unity 调用 Android 的原生方法的方式的一些简单整理(仅供参考)

一、简单介绍

二、Unity Android 相关整理

1、Unity 获取 Android 当前的 currentActivity (或者叫Context上下文)

2、Unity 获取 Android 类、类的方法函数、字段属性等

3、Unity 获取 Android 定义的接口回调,并对应设置的方法

三、Unity 直接调用 Android 原生接口的使用案例

1、Unity 段代码

2、对应同样功能 Android 端代码


 

一、简单介绍

整理一些在Unity上可以方便调用 Android 方法的一些接口脚本,便于后期开发使用。

本节整理一些 Unity 直接调用 Android 类、函数、字段等的一些方法。

根据unity用户手册,unity可以采用native code(c/c++),但是也提供了C#调用方法,本文对此进行简单讲解。

 

二、Unity Android 相关整理

1、Unity 获取 Android 当前的 currentActivity (或者叫Context上下文)

private static string unityPlayerClass = "com.unity3d.player.UnityPlayer";
    public static AndroidJavaObject GetActivity()
    {
        AndroidJavaClass jc = new AndroidJavaClass(unityPlayerClass);
        if (jc == null)
        {
            Debug.LogErrorFormat("Failed to get Unity Player class, {0}", unityPlayerClass);
            return null;
        }
        AndroidJavaObject activity = jc.GetStatic<AndroidJavaObject>("currentActivity");
        if (activity == null)
        {
            Debug.LogError("Failed to obtain Android Activity from Unity Player class.");
            return null;
        }
        return activity;
    }

 

2、Unity 获取 Android 类、类的方法函数、字段属性等

1、通过下述方法即可获取包com.xan.intentreceiver(可类比于C#命名空间)下的类MainActivity。
2、继而可以调用MainActivity的静态方法getIntentResult。
3、其返回值为string,如果无返回值,则直接调用CallStatic即可。
(说明:
1、Call<返回参数>("非静态公共函数名")  调用非静态公共函数
2、CallStatic<返回参数>("静态公共函数名")  调用静公共态函数
3、Get<字段类型>("非静态公共字段名称")   获取非静态公共字段
4、GetStatic<字段类型>("静态公共字段名称")  获取静态公共字段
5、Set<字段类型>("非静态公共字段名称")   设置非静态公共字段
6、SetStatic<字段类型>("静态公共字段名称")  设置静态公共字段
)

using (AndroidJavaClass mainActivityClass = new AndroidJavaClass("com.xan.intentreceiver.MainActivity"))
        {
            Debug.Log("IntentReceiver start catch infomation");
            try
            {
                result = mainActivityClass.CallStatic<string>("getIntentResult");
            }
            catch(Exception ex)
            {
                Debug.Log("IntentReceiver get result failed:" + ex.Message);
            }
        }

 

3、Unity 获取 Android 定义的接口回调,并对应设置的方法

1、Android定义的接口


此处Android端通过接口来实现的回调

package com.xan.Manager;

public class PluginCallback {
    public interface ResultCallback {
        public void OnSuccess(String result, String hint);
        public void OnError(String result, int errorCode);
    }
}

Android层方法:

package com.xan.Manager;
public class Method { 
    public void Execute(PluginCallback.ResultCallback callback){。。。}
    }



2、Unity定义相应的类

接受回调的类:
此类要继承AndroidJavaProxy,同时根据原Android中的接口定义两个同名的方法。
 public delegate void SuccessHandler(string result, string hint);
            public delegate void ErrorHandler(string result, int errorCode);
            class ExecuteCallback : AndroidJavaProxy
            {
                SuccessHandler successHandler;
                ErrorHandler errorHandler;
                public InstallApkCallback(SuccessHandler successCallback,
                                          ErrorHandler errorCallback)
                                        : base("com.xan.Manager.PluginCallback$ResultCallback")
                {
                    successHandler = successCallback;
                    errorHandler = errorCallback;
                }

                public void OnSuccess(string result, string hint)
                {
                    if (successHandler != null)
                        successHandler(result, hint);
                }

                public void OnError(string result, int errorCode)
                {
                    if (errorHandler != null)
                        errorHandler(result, errorCode);
                }
            }


3、Unity 设置使用 Android 对应的接口回调

在new ExecuteCallback(null,null)处填入回调方法。

AndroidJavaObject jo = new AndroidJavaObject("package com.xan.Manager.Method");
jo.Call("Execute",new ExecuteCallback(null,null));

 

三、Unity 直接调用 Android 原生接口的使用案例

大家可以比对两幅代码,学会一些Unity 直接调用 Android 的方法,有时候 Unity Android(原生) 交互 不一定要构建aar/jar包

1、Unity 段代码

    public static string GetSystemLanguage_STCN()
    {
        string systemLanguage;
        if (Application.platform == RuntimePlatform.Android)
        {
           
 
            AndroidJavaObject locale = UnityContext.Call<AndroidJavaObject>("getResources").Call<AndroidJavaObject>("getConfiguration").Get<AndroidJavaObject>("locale");
            if (locale.Call<string>("getLanguage").Equals("zh"))
            {
                if (locale.Call<string>("toLanguageTag").Equals("zh-Hans"))
                {
                    systemLanguage = "简体中文 " + locale.Call<string>("toLanguageTag");
                }
                else if (locale.Call<string>("toLanguageTag").Equals("zh-Hant"))
                {
                    systemLanguage = "繁体中文 " + locale.Call<string>("toLanguageTag");
                }
                else
                { // 第二种简繁中文情况
                    switch (locale.Call<string>("getCountry"))
                    {
                        case "CN":
 
                            systemLanguage = "简体中文 " + locale.Call<string>("toLanguageTag");
                            break;
 
                        default:
                            systemLanguage = "繁体中文 " + locale.Call<string>("toLanguageTag");
                            break;
                    }
                }
            }
            else {
                systemLanguage = "非中文 " + locale.Call<string>("toLanguageTag");
            }
        }
        else
        {
            systemLanguage = Application.systemLanguage.ToString();
        }
 
        return systemLanguage;
    }

 

2、对应同样功能 Android 端代码

    void GeyLanguage(){
 
        Locale locale = getResources().getConfiguration().locale;
        // 获取当前系统语言
 
        String ZH = "zh";
        //中文简体
        String CN_HANS = "zh-Hans";
        //中文繁体
        String CN_HANT = "zh-Hant";
        //如果是中文
        if (locale.getLanguage().equals(ZH)) {
            //locale.toLanguageTag()
            //中国 zh-Hans-CN
            //台湾 zh-Hans-TW
            //澳门 zh-Hans-MO
            //香港 zh-Hans-HK
 
            if (locale.toLanguageTag().contains(CN_HANS)) {
                //简体
                Toast.makeText(this,"当前手机语言环境是 简体",Toast.LENGTH_LONG).show();
            } else if (locale.toLanguageTag().contains(CN_HANT)){
                //繁体
                Toast.makeText(this,"当前手机语言环境是 繁体",Toast.LENGTH_LONG).show();
            } else {
                switch (locale.getCountry()) {
                    case "CN":
                        //简体
                        Toast.makeText(this,"当前手机语言环境是 简体",Toast.LENGTH_LONG).show();
                        break;
                    default:
                        Toast.makeText(this,"当前手机语言环境是 繁体",Toast.LENGTH_LONG).show();
                        break;
                }
            }
        } else {
            Toast.makeText(this,"当前手机语言环境是 不是中文",Toast.LENGTH_LONG).show();
        }
 
    }

 

 

猜你喜欢

转载自blog.csdn.net/u014361280/article/details/107692986
今日推荐