FC2ブログ
    07 «1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.» 09

    ハルシオンシステムの気ままBlog

    株式会社ハルシオンシステムのメンバーが送る、UnityやらJavaやらの技術的話題から、自社開発のアプリの宣伝とかとかのブログです。ほんと気ままにいきたいと思います。更新日は毎週 月 木でっす!

     

    【ハルシオンブログ】Unity+Playfab Playfabサーバに置いた絵のファイルをアプリ起動時に持ってくるよぅ(ファイル管理の使い方一例) 

    こんにちは。坂内っす。

    蒸し暑い日が続きますね。さすが梅雨って感じです。
    まぁ一日中クーラーの効いた部屋にいるので、あんまり関係ないですが。

    さて、Unity使いで最近Playfabが流行ってきてるみたいですね。
    うちも1年前から使ってます。
    色々とかゆくても手が届かないところも多いPlayfabですが使える機能の一つとして、「ファイル管理」という機能があります。

    画像ファイルやサウンドファイルなどをここにアップロードし、アプリから落として使うといったことに使える機能です。

    まずはPlayfabに画像ファイルをアップロードします。



    コンテンツ>ファイル管理>ファイルをアップロードからアップロードができます。

    ちなみに今回はテスト用にポケガ2のロゴを置いてみました。



    説明にも書いてますが、CDNを使用するため、お金がかかるのでカード等の登録が必要になります。

    ※PlayFab にファイルをアップロードして保存し、グローバル CDN 経由でゲーム クライアントにダウンロードします。CDN の使用コストは、課金期間中にダウンロードされたギガバイトの合計数に基づいて計算され、1 GB あたり 0.10 米ドルのレートで計算されます。CDN へのアップロードと保存は無料で提供されます。

    とのことです。

    ちなみにファイルのダウンロードはPlayfabにアプリ側でログインしないといけない感じです。

    【Blog20200713.cs】

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.UI;

    public class Blog20200713 : MonoBehaviour
    {
    public Image img;

    IEnumerator Start()
    {
    yield return StartCoroutine(PlayfabManager.instance.ConnectPlayfab());
    yield return new WaitWhile(() => !PlayfabManager.instance.isLogin && !PlayfabManager.instance.isError);

    StartCoroutine(PlayfabManager.instance.GetImageFromPlayfab(img, "image01.png"));
    }

    }



    画面を開くとログインをし、SpriteをPlayfabから持ってきて表示するだけのもの。

    【PlayfabManager.cs】

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.IO;
    using PlayFab;
    using PlayFab.ClientModels;
    using UnityEngine;
    using UnityEngine.UI;
    using UnityEngine.Networking;


    public class PlayfabManager : MonoBehaviour {
    public static PlayfabManager instance;
    private void Awake() {
    if (instance == null) {
    instance = this;
    DontDestroyOnLoad(gameObject);
    } else {
    Destroy(gameObject);
    }
    }

    public bool isLogin;
    public bool isError;

    string downloadPath;
    Sprite contentSprite;

    public IEnumerator ConnectPlayfab() {
    if (string.IsNullOrEmpty(PlayFabSettings.TitleId)) {
    PlayFabSettings.TitleId = "TestGame"; // Please change this value to your own titleId from PlayFab Game Manager
    }

    bool isWait = true;

    var request = new LoginWithCustomIDRequest { CustomId = SystemInfo.deviceUniqueIdentifier, CreateAccount = true };
    PlayFabClientAPI.LoginWithCustomID(request, OnSuccess, OnError);

    while (isWait) {
    yield return null;
    }

    void OnSuccess(LoginResult result) {
    isLogin = true;
    isWait = false;
    }
    void OnError(PlayFabError error) {
    isLogin = true;
    isWait = false;
    }
    }

    ///
    /// Playfabから画像を取得
    ///

    ///
    ///
    ///
    public IEnumerator GetImageFromPlayfab(Image img, string fileName) {
    contentSprite = null;
    yield return StartCoroutine(GetContentURL(fileName));
    yield return StartCoroutine(PlayFabContentLoad(fileName));
    if (contentSprite != null) {
    img.sprite = contentSprite;
    }
    }

    ///
    /// 素材ダウンロード用URL取得
    ///

    public IEnumerator GetContentURL(string playfabPath) {
    bool isWait = true;
    GetContentDownloadUrlRequest request = new GetContentDownloadUrlRequest() {
    Key = playfabPath,
    ThruCDN = true,
    };
    PlayFabClientAPI.GetContentDownloadUrl(request, OnSuccess, OnError);

    while (isWait) {
    yield return null;
    }

    void OnSuccess(GetContentDownloadUrlResult result) {
    Debug.Log("GetContentURL:OnSuccess");

    downloadPath = result.URL;
    isWait = false;
    }

    void OnError(PlayFabError error) {
    Debug.Log(error.GenerateErrorReport());
    isWait = false;
    }
    }

    ///
    /// Playfabからファイルを取得
    ///

    ///
    ///
    private IEnumerator PlayFabContentLoad(string fileName) {
    string localFilePath = Application.persistentDataPath + "/" + fileName;
    var getTextureRequest = UnityWebRequestTexture.GetTexture(downloadPath, false);
    yield return getTextureRequest.SendWebRequest();

    while (!getTextureRequest.isDone) {
    yield return getTextureRequest;
    }

    if (getTextureRequest.isNetworkError) {
    Debug.Log("Error:" + getTextureRequest.error);
    } else {
    File.WriteAllBytes(localFilePath, getTextureRequest.downloadHandler.data);
    byte[] bytes = getTextureRequest.downloadHandler.data;
    Texture2D texture = new Texture2D(1, 1);

    if (texture.LoadImage(bytes)) {
    contentSprite = Sprite.Create(texture, new Rect(0.0f, 0.0f, texture.width, texture.height),Vector2.zero);
    } else {
    contentSprite = null;
    }

    }
    }
    }


    ちょっと長いですが、Playfabへのログインとデータを取得するところが書かれています。
    PlayFabContentLoadメソッドの以下の行でローカルに保存していますが、毎回とってくるならこの行入らない感じですね。

    File.WriteAllBytes(localFilePath, getTextureRequest.downloadHandler.data);

    本当は、ローカルに保存し、ファイルがローカルに存在する場合はPlayfabから持ってこないで、ローカルのやつを使用ってやるのがいいかと思います。

    CDNはお金かかるので、無駄に使わないのがいいですね!

    実際に実行するとこんな感じ。



    アプリ起動時にSpriteキャッシュとかに入れといて、実際に使うときにはそこから持ってくる感じにしないと、ロードに時間かかるから気持ち悪いですね。

    ってことで、こんな感じでPlayfabに置いたファイルをもってこれます!

    では今日はこんなところで。

    あでゅ~ノシ

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    コメント

    コメントの投稿

    Secret

    トラックバック

    トラックバックURL
    →http://halcyonsystemblog.jp/tb.php/717-4c04544a
    この記事にトラックバックする(FC2ブログユーザー)