Unity头像上传功能实现 二
16lz
2021-01-24
前一篇写了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);
更多相关文章
- android中actionBar中字体颜色设置
- AndroidStudio使用GreenDao实战
- 【Android(安卓)UI设计与开发】第07期:底部菜单栏(二)Fragment的详
- Android(安卓)使用SQLiteDatabase操作SQLite数据库(一)
- Android笔记之广播Broadcast
- android 与服务器用 http Post方法通迅
- uniapp原生插件开发之调用原生方法(android)
- 初识Android(安卓)回调机制
- android 笔记 --- 相机应用