2016年12月25日日曜日

Unityでファイルの読み書きについて2

json形式のデータを読み書きする。
暗号化はしていないので生データを扱いたくない場合は暗号化する必要があります。
暗号化については今後書くかもです。
今回はsimplejsonではなくLitJsonの方を使用しました。

以下のurlから
http://lbv.github.io/litjson/

Latest release: vX.X.X · source code · dll
のdllのクリックしてダウンロードします。

ダウンロードしたdllをUnityのprojectへドラッグアンドロップするだけで使えるようになります。

デフォルトのjsonデータ、以下のデータをAssets\Dataフォルダに入れました。UTF-8 BOMなし で作成しました。
test_data.json
{
  "id": 0,
  "name":"名前"
}

jsonを変換するクラスの作成
TestData.cs
public class TestData
{
    public int id;
    public string name;
}

ファイルの管理をするクラス
機能としてはWriteTextメソッドを実行するとStreamingAssetへ保存する。
ReadFileTextメソッドを実行すると、StreamingAssetにファイルがある場合そこから読み込み、ない場合 _folda_path のフォルダ(今回はDataフォルダのパスにする)から読み込みます。
FIleManager.cs
using UnityEngine;
using System.IO;
using System.Text;

public class FIleManager
{

// StreamingAssetのパス
#if UNITY_EDITOR
    public static string path = Application.dataPath + "/StreamingAssets";
#elif UNITY_ANDROID
    // パス(Android)
    public static string path = "jar:file://" + Application.dataPath + "!/assets/";
#elif UNITY_IPHONE
    // パス(iOS)
    public static string path = path = Application.dataPath + "/Raw";
#else
    public static string path = Application.dataPath + "/StreamingAssets";
#endif

    // テキスト読み込み関数
    public static string ReadFileText (string _folda_path, string _file_name)
    {
        string result = string.Empty;

        FileInfo file;

        // ファイルがある場合
        if (File.Exists(path + _file_name))
        {
            file = new FileInfo(path + _file_name);
        }
        // ファイルがない場合
        else
        {
            file = new FileInfo(Application.dataPath + _folda_path + _file_name);
        }
        
        using (StreamReader sr = new StreamReader(file.OpenRead(), Encoding.UTF8))
        {
            result = sr.ReadToEnd();
        }

        return result;
    }

    // jsonファイルを上書きする
    public static void WriteText (string _file_name, string _contents)
    {
        StreamWriter sw;
        FileInfo fi;
        
        fi = new FileInfo(path +  _file_name);

        // ファイルがある場合
        if (File.Exists(path + _file_name))
        {
            // 削除
            fi.Delete();
        }

        sw = fi.AppendText();        // StreamWriter を作成
        sw.WriteLine(_contents);     // 書き込み
        sw.Flush();                  // バッファ書き込み
        sw.Close();                  // 閉じる
    }
}
以下、test_data.jsonのデータを読み込んで
id = 1, name = "名前1"
でStreamingAssetsへ保存する。
JsonTest.cs
using UnityEngine;

public class JsonTest : MonoBehaviour
{
    // フォルダ
    const string folda_path = "/Data";

    // ファイル名
    const string file_name = "/test_data.json";


    void Start ()
    {
        // jsonの文字列の取得
        string json_text = FIleManager.ReadFileText(folda_path, file_name);

        // TestDataクラスに変換して読み込む
        TestData data = LitJson.JsonMapper.ToObject(json_text);

        data.id = 1;
        data.name = "名前1";

        // dataを文字列として取得する。
        json_text = LitJson.JsonMapper.ToJson(data);

        // jsonテキストファイルを書き込む
        FIleManager.WriteText(file_name, json_text);
    }
}


Unityでファイルの読み書き3 に続く

2016年12月24日土曜日

Unityでファイルの読み書きについて1

Unityでファイルの読み書きをするために
StreamingAssetsフォルダを使用する。

プラットフォームごとのファイルパス
https://docs.unity3d.com/ja/current/Manual/StreamingAssets.html

プラットフォームごとの#define
https://docs.unity3d.com/ja/current/Manual/PlatformDependentCompilation.html

Unityでファイルの読み書きについて2に続く

AndroidではStreamingAssetにファイルの書き込みができません。
書き込む場合はpersistentDataPathを使用します。

ファイルの読み書きだけなら
Unityでファイルの読み書きについて3を見た方が速いと思います。

2016年12月18日日曜日

デリゲートについて C#

C#のデリゲートのActionとFuncについて、デリゲートとは簡単に言えば委譲らしいです。
委譲とは? A.他にゆだね、ゆずること。。。
自分もあまりよくわかってないのですが、関数が変数のように扱えるようなものだと思っています。
関数を変数で扱える、つまり関数が入った変数を実行すると入れた関数が実行されるということです。

ActionとFuncの違いについて。
Actionは返り値がない
Funcは返り値がある
だけの違いですかね?

使用する場合は
using System;
が必要です


以下テストコード

using UnityEngine;
using System;

public class DelegateTest : MonoBehaviour
{
    // デリゲート
    Action testActionDelegate;

    // デリゲート(返り値)
    Func<int> testFuncDelegate;

    // デリゲート(引数あり)
    Action<string> testStrActionDelegate;

    // Use this for initialization
    void Start ()
    {
        // 実行したい関数を入れる
        testActionDelegate = testAction;
        testFuncDelegate = testFunc;
        testStrActionDelegate = testStrAction;


        // Nullチェック
        if (testActionDelegate != null)
        {
            // デリゲートを実行する
            testActionDelegate();
        }

        // Nullチェック
        if (testFuncDelegate != null)
        {
            // デリゲートを実行する
            testFuncDelegate();
        }

        // Nullチェック
        if (testStrActionDelegate != null)
        {
            // デリゲートを実行する
            testStrActionDelegate("testStrAction");
        }

    }

    public void testAction ()
    {
        Debug.Log("testAction");
    }

    public int testFunc ()
    {
        Debug.Log("testFunc");
        return 0;
    }

    public void testStrAction (string str)
    {
        Debug.Log(str);
    }
}
  実行すると以下のログが出れば成功です。(Unityで実行してます)

2016年12月12日月曜日

Unity覚書

今回は
・プレハブの読み込み
・オブジェクトのコピー
・親オブジェクトの設定
についての覚書

自分はプレハブは同じようなものを複数使い回したいときに使用しています。

・プレハブの読み込み

// ゲームオブジェクトとしてプレファブ(object)を読み込みます。
 var obj = Instantiate(Resources.Load("Prefabs/object")) as GameObject;
※Resources.Loadする場合、Resourcesフォルダー内にprefab化したデータを配置していく必要があります。Unity上のフォルダ構成的には Resources/Prefabs/object となっています。

・プレハブの読み込み2
※プレハブに接続したままインスタンス化される、(Clone)の文字がつかない。

// ゲームオブジェクトとしてプレファブ(object)を読み込みます。
GameObject instance = PrefabUtility.InstantiatePrefab(Resources.Load("Prefabs/object")) as GameObject; 

・オブジェクトのコピー

// objをGameObjectとしてcopy_objに複製する。
var copy_obj = UnityEngine.Object.Instantiate(obj) as GameObject;

・親オブジェクトの設定

// copy_objをobjの子オブジェクトとして配置する。
copy_obj.transform.parent = obj.transform;

2016年12月4日日曜日

アプリ制作で現状考えてる事


・現在作ってるアプリをどういうゲームにするか
ステージクリア制にする。
戦闘はターン制のRPGのようなもの。
敵は現状最大3体まで。
プレイヤーは一人。
レベル制度はある。

 ・敵のクラス設計
jsonデータからステージごとの敵を作成する。
jsonデータの中身
{
"corps": 
  [
    {
      "image":   "mon_002",
      "pos_x":  -38,
      "pos_y":  58,
      "atk":   10,
      "def":   10,
      "dex":   10,
      "int":   10,
      "hp":    10
    },
    {
      "image":   "mon_002",
      "pos_x":  -33,
      "pos_y":  36,
      "atk":   10,
      "def":   10,
      "dex":   10,
      "int":   10,
      "hp":    10
    },
    {
    "image":   "mon_002",
    "pos_x":  -42,
    "pos_y":  80,
    "atk":   10,
    "def":   10,
    "dex":   10,
    "int":   10,
    "hp":    10
    }
  ]
}
上のデータを読み込んだ時の敵の表示
画面的にあまり進んでないように見える!
規模をあまりでかくしないようにしたいですね。。。


素材提供
「Rド」 http://www.geocities.co.jp/Milano-Cat/3319/
ぴぽや http://piposozai.blog76.fc2.com/
【早い者勝ち!】 あなたのお名前、残ってる?

シャドウバースにPC版が誕生