Unity头像上传功能实现 二

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


1. 新建Unity项目

  • 创建新项目
    Unity头像上传功能实现 二_第1张图片

  • 设置项目包名

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

    Unity头像上传功能实现 二_第2张图片Unity头像上传功能实现 二_第3张图片


2. UI及项目代码

  • 导入NGUI插件,简单搭了个界面
    Unity头像上传功能实现 二_第4张图片Unity头像上传功能实现 二_第5张图片
  • 新建一个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方法,传递参数imagePath
UnityPlayer.UnitySendMessage(UNITY_GAMEOBJECT, "GetImage", imagePath);

3. 导入Android jar包和打包

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

4. 小结

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

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

你可能感兴趣的:(U3D学习)