Unity | 快速集成华为AGC云存储服务

华为AppGallery Connect提供了一个云存储(CloudStorage)的服务,号称提供了一个便捷的云端存储服务,应用开发者使用的时候,可以不用关注服务器的部署,直接使用就行。

目前这个功能还在bate阶段,我先抢先体验了一下。

1、 环境与应用信息

版本名称 集成环境 测试设备
agconnect-storage:1.3.1.100 Unity 2019.4.17f1c1 荣耀magic2

AGC地址:https://developer.huawei.com/consumer/cn/service/josp/agc/index.html

2、开通云存储服务

PS: 云存储服务目前还处于beta状态,使用前应该发邮件去申请开通:
https://developer.huawei.com/consumer/cn/doc/development/AppGallery-connect-Guides/agc-cloudstorage-apply

开通步骤也就是界面点击而已,此处就不详细介绍了,大家可以参考之前的文档
https://developer.huawei.com/consumer/cn/forum/topic/0201411971207960391?fid=0101271690375130218

3、导入Unity Package:

官方文档:
https://docs.unity.cn/cn/Packages-cn/com.unity.huaweiservice@1.3/manual/cloudstorage.html

1、 下载Unity Hub,安装Unity
https://unity.cn/releases。 下载安装就不详细介绍了。

2、 Android环境配置:可参考如下截图

在这里插入图片描述

3、导入HuaweiServices的Package包:
首先从链接下载package:
https://share.unity.com/receive/?thread=237D-JA9D&packageCode=DzIiMvUpSO7GsT3dPV2M8qyBaw3R5bcbRhwD5RurQNM#keyCode=lkkIcH1nco7DIoL90AOReE0hwINGMsFP7mjwBAkg4_c

(当前该包还未完全对外开放)

下载到本地以后,在Unity中点击assets – Import package

在这里插入图片描述

然后,然后选择需要的包,点击Import即可

4、AGC环境配置

1、 配置华为AGC上的参数:回到AGC控制台:找到之前创建的App:

https://developer.huawei.com/consumer/cn/service/josp/agc/index.html

2、选择:我的项目-> 构建 – 云存储 点击开通,开通云存储服务,需要配置默认的存储实例名称。(按需配置即可)

为方便无需认证即可读写数据,安全策略配置为:

agc.cloud.storage[
   match: /{bucket}/{path=**} {
      allow read, write:  if true;
   }
]

3、 服务开通以后,回到项目设置界面,下载最新的json文件。

在这里插入图片描述

4、 将刚下载好json文件,放到Unity项目Assets / Plugins / Android目录下:

注意,如果下载的json文件中,cloudstorage下没有default_storage参数,请手动添加:此处添加的值即为步骤三中配置的默认存储实例。

在这里插入图片描述

5、设置Unity中的Android环境:

1、在Player-Publish Setting中启用Android的自定义清单和gradle

在这里插入图片描述

2、在Other Setting中配置包名:注意需要和AG官网的包名保持一致:

在这里插入图片描述

3、配置项目级gradle,此处对应Assets\Plugins\Android路径下的baseProjectTmeplate.gradle文件,添加如下内容

    allprojects {
        buildscript {
            repositories {
                maven { url 'https://developer.huawei.com/repo/' }
            }
        }
        dependencies {
            classpath 'com.android.tools.build:gradle:3.4.0'
            classpath 'com.huawei.agconnect:agcp:1.4.2.301'
            **BUILD_SCRIPT_DEPS**
        }
    }
        repositories {
            maven { url 'https://developer.huawei.com/repo/' }
        }
    }
  1. 配置应用级gradle,此处对应Assets\Plugins\Android路径下的LauncherTmeplate.gradle文件,添加如下内容:
apply plugin: 'com.android.application'
apply plugin: 'com.huawei.agconnect'

dependencies {
implementation project(':unityLibrary')
implementation "com.huawei.agconnect:agconnect-storage:1.3.1.100"
implementation 'com.huawei.agconnect:agconnect-auth:1.4.2.301'
  1. 配置Manifest文件:申请读写权限,用于读写文件
<uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

    <application
        android:allowBackup="false"
        android:requestLegacyExternalStorage="true" >

6、从零开发云存储功能

1、界面布局:

依次点击GameObject- UI –Button, 创建一个按钮。 点击选中按钮,然后在右侧选择 Add Component, 创建并且添加一个Script文件。在文件中创建对应的方法

在这里插入图片描述

2、初始化云存储实例、并且申请读写权限。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using HuaweiService;
using HuaweiService.CloudStorage;
using System;

public delegate void SuccessCallBack<T>(T o);
public class HmsSuccessListener<T>:OnSuccessListener{
    public SuccessCallBack<T> CallBack;
    public HmsSuccessListener(SuccessCallBack<T> c){
        CallBack = c;
    }
    public void onSuccess(T arg0)
    {
        Debug.Log("OnSuccessListener onSuccess");
        if(CallBack != null)
        {
            CallBack.Invoke(arg0);
        }
    }

    public override void onSuccess(AndroidJavaObject arg0){
        Debug.Log("OnSuccessListener onSuccess");
        if(CallBack !=null)
        {
            Type type = typeof(T);
            IHmsBase ret = (IHmsBase)Activator.CreateInstance(type);
            ret.obj = arg0;
            CallBack.Invoke((T)ret);
        }
    }
}

public class testStorageDemo : MonoBehaviour
{
    private AGCStorageManagement mAGCStorageManagement;
    private string[] permissions =
        {
            "android.permission.WRITE_EXTERNAL_STORAGE",
            "android.permission.READ_EXTERNAL_STORAGE",
        };
    // Start is called before the first frame update
    void Start()
    {
        AndroidJavaClass javaUnityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        AndroidJavaObject currentActivity = javaUnityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
        Activity aaa = HmsUtil.GetHmsBase<Activity>(currentActivity);
        ActivityCompat.requestPermissions(aaa, permissions, 1);
    }

    // Update is called once per frame
    void Update()
    {

    }

    public void initAGCStorageManagement() {

        mAGCStorageManagement = AGCStorageManagement.getInstance("9105385871708601205-ffeon");
        Debug.Log("Instance is: "+ mAGCStorageManagement);

    }

    public class MySuccessListener : OnSuccessListener
        {
            private string m_name;

            public MySuccessListener(string name)
            {
                m_name = name;
            }

            public MySuccessListener()
            {
                m_name = "default";
            }

            public override void onSuccess(AndroidJavaObject ex)
            {
                Debug.Log("download success: " + m_name);
            }
        }

}

3、上传文件:

     public void uploadFile() {
        if (mAGCStorageManagement == null){
            initAGCStorageManagement();
        }
        string fileName = "testUnity.jpg";
        StorageReference reference = mAGCStorageManagement.getStorageReference(fileName);
        string FileFolder = "/storage/emulated/0/AGCSdk/";
        string FilePath = FileFolder + fileName;

        Debug.Log("FilePath = " + FilePath);
        File file = new File(FilePath);
        Debug.Log("UploadFile = " + file);

        UploadTask task = reference.putFile(file);
        task.addOnSuccessListener(new MySuccessListener());
        Debug.Log("UploadFile done:");
    }

4、下载文件

public void downloadFile() {
        if (mAGCStorageManagement == null){
            initAGCStorageManagement();
        }
        StorageReference reference = mAGCStorageManagement.getStorageReference("test.jpg");
        string FileFolder = "/storage/emulated/0/AGCSdk/";
        string FilePath = FileFolder + "test.jpg";

        Debug.Log("FilePath = " + FilePath);
        File file = new File(FilePath);
        Debug.Log("File = " + file);

        DownloadTask task = reference.getFile(file);
        task.addOnSuccessListener(new MySuccessListener("NormalListener"));
        Debug.Log("DownloadTask Result:");
    }

5、删除文件

public void deleteFile() {
        if (mAGCStorageManagement == null){
            initAGCStorageManagement();
        }

        StorageReference reference = mAGCStorageManagement.getStorageReference("testUnity.jpg");
        reference.delete();
        Debug.Log("DeleteFileTest success.");
    }

6、打包测试

打包的安装好以后,点击每个按钮的同时,可以在Android Logcat中,筛选Unity关键字,查看Debug.Log输出的相关日志。

上传和下载时,同步关注agc界面上文件的变化

7、总结

仅关注前端应用的开发,就可以利用AGC云存储服务在unity上开发一个带云端存储服务功能的游戏,不用为了服务器的搭建和运维担心,省时省力。而且云存储服务还提供了类似于管理员模式的web控制台,可以简单直观的对服务器上的文件进行管理。

这个云存储服务,除了最普通的上传下载和删除功能,还包括有设置元数据等功能,具体可以看官方文档:

欲了解更多详情,请参见:

云存储服务开发指南:

https://developer.huawei.com/consumer/cn/doc/development/AppGallery-connect-Guides/agc-cloudstorage-introduction

Unity关于云存储的文档:

https://docs.unity.cn/cn/Packages-cn/com.unity.huaweiservice@1.3/manual/cloudstorage.html

云存储服务codelab:

https://github.com/AppGalleryConnect/agc-android-demos/tree/master/agc-cloudstorage-demo-java


原文链接:https://developer.huawei.com/consumer/cn/forum/topic/0201454878602100779?fid=0101271690375130218

原作者:Mayism

原文地址:https://blog.51cto.com/14772288/2661131

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


这篇文章主要介绍了Unity游戏开发中外观模式是什么意思,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家...
这篇文章主要介绍Unity中地面检测方案的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1.普通射线在角色坐标(一般是脚底)...
这篇文章主要介绍了Unity游戏开发中如何消除不想要的黄色警告,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带...
这篇文章主要介绍了Unity中有多少种渲染队列,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解
这篇文章主要介绍Unity中如何实现Texture,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!了解Texture2D 如上图,Texture2D是一张
小编给大家分享一下Unity中DOTS要实现的特点有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让...
这篇文章给大家分享的是有关unity中如何实现UGUI遮罩流光特效的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。下面是核心shader:Sh...
这篇文章主要为大家展示了“Unity中如何实现3D坐标转换UGUI坐标”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下...
这篇文章主要介绍了Unity游戏开发中设计模式的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家...
这篇文章主要介绍了Unity中如何实现仿真丝袜渲染,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了...
这篇文章给大家分享的是有关Unity插件OVRLipSync有什么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。项目需要接入对话口型动...
这篇文章主要介绍了Unity性能优化之DrawCall的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家...
这篇文章给大家分享的是有关Unity给力插件之Final IK怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。这插件有什么用:一般游...
这篇文章给大家分享的是有关Unity中如何内嵌网页插件UniWebView的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、常见Unity中内...
小编给大家分享一下Unity如何做流体物理的几个轮子,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让...
小编给大家分享一下Unity中Lod和Occlusion Culling的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收...
这篇文章将为大家详细讲解有关Unity中LineRenderer与TrailRenderer有什么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获...
这篇文章主要介绍了Unity中coroutine问题的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起...
这篇文章将为大家详细讲解有关unity中spine怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。骨骼动画首先我们来看到...
这篇文章主要为大家展示了“Unity Shader后处理中如何实现简单均值模糊”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学...