創作世界のいろいろ〜AdobeとかC#とか

絵を描く人がC#とか3Dとか動画編集とかやる為の備忘録

【連載 Unity初心者向け】歴史学習アプリを作る(4 csvデータをunityへDLする)

この記事の続き

matsrikagraphic.hatenablog.com

MCNBのファイルストアへアップロードしたcsvデータをDLしてstring配列に直し、Unityのコンソールに出せるまでをやります。下記のように↓

最小限の実装scriptはこちら↓

using System;
using System.Collections;
using System.Collections.Generic;
using NCMB;
using UnityEngine;

public class ContentsDownloader : MonoBehaviour
{
    [SerializeField] string sourceFileName;//~~~.csvのファイル名をインスペクターから指定する

    private void Start()
    {
        var file = new NCMBFile(sourceFileName);// NCMBFileを初期化

        // データを取得する (FetchAsync は NCMBAPI)
        file.FetchAsync((byte[] fileData, NCMBException error) =>
        {
            if (error != null) //失敗
            {
                Debug.Log(error);
            }
            else //成功
            {
                // 受け取った byte[] を string 化する
                var sourceText = System.Text.Encoding.UTF8.GetString(fileData);

                //11colums * 3rows = 0始まりで33個の値なので32
                var allQuestoins = new string[32];

                allQuestoins = sourceText.Split(',');
                for (int i = 0 ; i <allQuestoins.Length ; i++)
                {
                    
                    Debug.Log(allQuestoins[i]);
                }

            }
        });

    }

まずはNCMBへクイズデータをアップロード

NCMBへアップロードするのはcsvデータです。

下記記事参考にさせていただきました。

negi-lab.blog.jp

上記記事に書かれているように、csvデータをMCNBのファイルストアでアップロードすれば、いちいちUnity上で何かを修正することなく、クイズのデータを更新することが可能になります。

きちんとした形にするのであれば上記記事参考にしていただいたほうが良いです。(確実にDLが完了した状態で次の手順にすすんだりとか、多分)

本記事ではもっと簡易的に実装します。

 

はじめに、下記のようなcsvを作成しました。

エクセルでも良いと思うのですが、エクセルで作成したcsvだとUnicodeの変換がうまくいかないです。私は下記のアプリを使用しています。

Easy CSV Editor

Easy CSV Editor

  • VDT LABS S.R.L.
  • 開発ツール
  • ¥1,500

apps.apple.com

このエディターは有料ですが、JSON変換、EXCEL変換などにも対応しており、SQLへデータをJSON形式等でアップロードする際にも日本語をきちんと変換してくれるのでストレスが無くて良いと思っています。Windowsで販売されてるかは分かりません。

 

これをMCNBのファイルストアへアップロードします。

アップロードすると下記のように追加できたことが確認できます。

このファイル名を.csvの拡張子まで含めて、Unityのインスペクター上で入力します。

 

GameObjectとアタッチするScriptを作成する

新たに「ContentsDownloader.cs」というScriptと「ContentsManager」というGameObjectを作成しました。(名前は自由でいいです)

Script内には、冒頭にあるコードを記述します。

using System;
using System.Collections;
using System.Collections.Generic;
using NCMB;
using UnityEngine;

public class ContentsDownloader : MonoBehaviour
{
    [SerializeField] string sourceFileName;//~~~.csvのファイル名をインスペクターから指定する

    private void Start()
    {
        var file = new NCMBFile(sourceFileName);// NCMBFileを初期化

        // データを取得する (FetchAsync は NCMBAPI)
        file.FetchAsync((byte[] fileData, NCMBException error) =>
        {
            if (error != null) //失敗
            {
                Debug.Log(error);
            }
            else //成功
            {
                // 受け取った byte[] を string 化する
                var sourceText = System.Text.Encoding.UTF8.GetString(fileData);

                //11colums * 3rows = 0始まりで33個の値なので32
                var allQuestoins = new string[32];

                allQuestoins = sourceText.Split(',');
                for (int i = 0 ; i <allQuestoins.Length ; i++)
                {
                    
                    Debug.Log(allQuestoins[i]);
                }

            }
        });

    }

Inspecor上で先ほどアップロードしたcsvのファイルネームをコピペしてください。

このファイル名ですね

これだけでOKです。

 

シーンマネージャーでシーン遷移

今回、タイトル画面とは別のシーンで作成したので、過去記事で作成した「TitleManager.cs」の下記部分を修正します。

using UnityEngine.SceneManagement;

    //~~~~~以下省略

    //Scene移動(最後のHelloButton)
    public void ChangeScene()
    {
        SceneManager.LoadScene("MainMenuScene");
    }
}

最後に表示されるHelloButtonにこのメソッドを適用させます。

 

これで起動すれば、コンソールにcsvデータが値ごとに順番に出てくるはずです。

 

次回はちょっとしたバグとカスタムクラスへ落とし込む作業

このままでは、ちょっと問題があります。

最後のクイズの解説文と、次の問題のIDが一つの値にくっついてしまっています。

これは最後の文章の次が改行('\n')になっていて、カンマ( ' , ' )で区切られてる訳ではないからです。

Scriptの中に、以下の行があると思います。

allQuestoins = sourceText.Split(',');

Splitとは「割る」という意味です。テキストを一文字目から読み込んで、「 , 」が出てきたら、そこで一つの値として区切るということになっています。

 

なので、最後の文に「 , 」をつけてあげれば良いです。逆にcsvの値の中の数字で「10,000」などとカンマを打ってしまうと、10と000に値が分かれてしまいます。

 

次回記事で修正後、この羅列されてるだけの配列を、問題番号、問題文、選択肢、正解、、、というように種別化するためカスタムクラスを作成し、そのカスタムクラスを使用したList変数へ代入していきます。

 

小話

日本で初めて民の思想統一を図ろうとしたのはおそらく蘇我氏・聖徳太子でしょう。このあたりの学習をしていくと、後々の日本史学習も面白くなります。

まんが日本史を観るのもおすすめ。超分かりやすいです