前一篇写了Unity实现头像功能的Android部分 Unity头像上传功能实现 一
最近要接入微信接口动了Android部分,正好趁着这个机会把剩下的补充完整吧。
只把Unity接收Android消息和发送消息功能实现,至于往服务器上传这些逻辑就不写了。
项目源码:https://github.com/alexchenc/CameraOrAlbum


1. 新建Unity项目

  • 创建新项目

  • 设置项目包名

    File -> Build Setting -> Player Setting 选择Android设置,Other Settings
    Package Name 这里的包名要与Android项目的包名一致


2. UI及项目代码

  • 导入NGUI插件,简单搭了个界面
  • 新建一个GameObject名为Head,给它添加脚本ChangeHead.cs
    新建一个UITexture,两个按钮,将按钮和Texture绑定至脚本(直接在Unity拖上去即可)
    ChangeHead.cs完整代码如下:
using System;using System.Collections;using System.Collections.Generic;using UnityEngine;public class ChangeHead : MonoBehaviour{    public const string FILE_PREFIX = "file://";    public UITexture headTexture;    public GameObject btnAlbum;    public GameObject btnPhoto;    private void Awake()    {        UIEventListener.Get(btnAlbum).onClick += OpenAlbum;        UIEventListener.Get(btnPhoto).onClick += OpenPhoto;    }    void OpenAlbum(GameObject go)    {#if UNITY_EDITOR        //nothing#else        AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");        AndroidJavaObject jo = jc.GetStatic("currentActivity");        jo.Call("openAlbum");#endif    }    void OpenPhoto(GameObject go)    {#if UNITY_EDITOR        //nothing#else        AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");        AndroidJavaObject jo = jc.GetStatic("currentActivity");        jo.Call("openCamera");#endif    }    ///     /// 选择完图片回调    ///     /// Data.    public void GetImage(object data)    {        const string TEMP_IMAGE = "/images/temp.png";        StartCoroutine(LoadTextureFromLocal(TEMP_IMAGE, delegate (Texture texture)        {            //设置图片            headTexture.mainTexture = texture;        }));    }    ///     /// 读取本地图片    ///     /// The texture.    /// Path.    /// Callback.    public IEnumerator LoadTextureFromLocal(string relativePath, Action callback)    {        if (!string.IsNullOrEmpty(relativePath) && callback != null)        {            //从本地获取,file://xxx            string localPath = FILE_PREFIX + Application.persistentDataPath + relativePath;            Debug.Log("LoadTexture at local " + localPath);            WWW www = new WWW(localPath);            yield return www;            if (www.error != null)            {                Debug.LogError("加载本地图片失败;" + www.error);                callback(null);            }            else            {                callback(www.texture);            }        }    }}
  • 其中,往Android发送消息的代码如下:
    这里是固定的写法,调用Android里集成了UnityPlayerActivity类的方法
    还有其他调用形式(是否携带参数/有无返回值等)百度一下,这里就不一一提了
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");AndroidJavaObject jo = jc.GetStatic("currentActivity");//这里调用Android里的openCamera方法,没有传递参数jo.Call("openCamera");//如果调用的方法带参数,在后面加个参数即可,如下://jo.Call("openCamera", paramStr);
  • 新建一个GameObject,命名为AndroidManager,给这个GameObject新建一个脚本AndroidManager.cs
    这个脚本用于接收Android调用Unity的消息,并进行相应处理
using UnityEngine;namespace Core{    ///     /// 处理Unity与Android交互    ///     public class AndroidManager : MonoBehaviour    {        public ChangeHead changeHead;        void LogDebug(string str)        {            //Debug.Log(str);        }        void LogError(string str)        {            //Debug.Error(str);        }        public void GetImage(string imagePath)        {            Debug.Log("Android get image callback." + imagePath);            changeHead.GetImage(imagePath);        }    }}
  • 在Android中调用Unity的方法:
//此处的UNITY_GAMEOBJECT是Unity中用于接收回调的GameObject名称//可修改,但必须保证这里和Unity里名称相同public static final String UNITY_GAMEOBJECT = "AndroidManager";//调用Unity中GetImage方法,传递参数imagePathUnityPlayer.UnitySendMessage(UNITY_GAMEOBJECT, "GetImage", imagePath);

3. 导入Android jar包和打包

  • Android打出jar包参考前一篇文章 Unity头像上传功能实现 一
    在Asset目录下新建Plugins/Android文件夹
    • 新建bin文件夹,将jar包拷贝至其中
    • 将Android项目中res文件夹完全拷贝过来
    • 将Android项目中AndroidManifest.xml拷贝过来
    • 结构如下:
  • Unity打包成Apk,在手机上安装即可

4. 小结

Unity部分功能不多,只是接收消息和从本地读取图片,然后把Texture赋值给UITexture即可
至于上传功能,简单说一下,就是把Texture转成二进制字节然后调用上传方法
具体上传代码根据你们项目中的上传方法来写,保存成功后记录url
下载就用WWW去Download

//上传到服务器Texture2D texture = headTexture.mainTexture as Texture2D;byte[] data = texture.EncodeToPNG();FileServerManager.UploadFile(uploadPath, fileName, data);

更多相关文章

  1. android中actionBar中字体颜色设置
  2. AndroidStudio使用GreenDao实战
  3. 【Android(安卓)UI设计与开发】第07期:底部菜单栏(二)Fragment的详
  4. Android(安卓)使用SQLiteDatabase操作SQLite数据库(一)
  5. Android笔记之广播Broadcast
  6. android 与服务器用 http Post方法通迅
  7. uniapp原生插件开发之调用原生方法(android)
  8. 初识Android(安卓)回调机制
  9. android 笔记 --- 相机应用

随机推荐

  1. android ndk jni层访问java对象小结
  2. android实用技巧:android实现listview异步
  3. android Room数据库了解
  4. Android(安卓)4.0为Launcher主界面所有应
  5. android实现TextView、ImageView等按压效
  6. Android(安卓)PreferenceActivity源码分
  7. react-native 修改app应用名称
  8. Android,APP图标尺寸
  9. Android在putString和getString使用方法
  10. Android(安卓)号码, 来电归属地 Jni 使用