【ハルシオンブログ】Unity+Playfab Playfabサーバに置いた絵のファイルをアプリ起動時に持ってくるよぅ(ファイル管理の使い方一例)
こんにちは。坂内っす。
蒸し暑い日が続きますね。さすが梅雨って感じです。
まぁ一日中クーラーの効いた部屋にいるので、あんまり関係ないですが。
さて、Unity使いで最近Playfabが流行ってきてるみたいですね。
うちも1年前から使ってます。
色々とかゆくても手が届かないところも多いPlayfabですが使える機能の一つとして、「ファイル管理」という機能があります。
画像ファイルやサウンドファイルなどをここにアップロードし、アプリから落として使うといったことに使える機能です。
まずはPlayfabに画像ファイルをアップロードします。

コンテンツ>ファイル管理>ファイルをアップロードからアップロードができます。
ちなみに今回はテスト用にポケガ2のロゴを置いてみました。

説明にも書いてますが、CDNを使用するため、お金がかかるのでカード等の登録が必要になります。
※PlayFab にファイルをアップロードして保存し、グローバル CDN 経由でゲーム クライアントにダウンロードします。CDN の使用コストは、課金期間中にダウンロードされたギガバイトの合計数に基づいて計算され、1 GB あたり 0.10 米ドルのレートで計算されます。CDN へのアップロードと保存は無料で提供されます。
とのことです。
ちなみにファイルのダウンロードはPlayfabにアプリ側でログインしないといけない感じです。
【Blog20200713.cs】
画面を開くとログインをし、SpriteをPlayfabから持ってきて表示するだけのもの。
【PlayfabManager.cs】
ちょっと長いですが、Playfabへのログインとデータを取得するところが書かれています。
PlayFabContentLoadメソッドの以下の行でローカルに保存していますが、毎回とってくるならこの行入らない感じですね。
File.WriteAllBytes(localFilePath, getTextureRequest.downloadHandler.data);
本当は、ローカルに保存し、ファイルがローカルに存在する場合はPlayfabから持ってこないで、ローカルのやつを使用ってやるのがいいかと思います。
CDNはお金かかるので、無駄に使わないのがいいですね!
実際に実行するとこんな感じ。

アプリ起動時にSpriteキャッシュとかに入れといて、実際に使うときにはそこから持ってくる感じにしないと、ロードに時間かかるから気持ち悪いですね。
ってことで、こんな感じで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)
« 【ハルシオンブログ】ファイルパスを作る時や取得するときのお話 | 【ハルシオンブログ】Awakeより先にメソッドを呼び出したいとき »
コメント
| h o m e |