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/

2016年11月27日日曜日

Unityのコルーチンについて

コルーチンとは? 自分は複数の処理をほぼ同時に処理してくれます。
ただスレッドはメインスレッドしか動いていないらしいため、疑似的な非同期になるでしょうか。
C#のasync/awaitは複数スレッドを使用しているみたいです。
以下のコードは1秒後にTest1のログを表示するプログラムです。

void Update() {
    // aキーを押したとき
    if (Input.GetKeyDown("a")) {
        // Test()のコルーチンを実行する
        StartCoroutine(Test1());
    }
}

 IEnumerator Test1()
    {
    // 1秒待機する
        yield return new WaitForSeconds(1.0f);

        Debug.Log("Test1");
    }
自分はアニメーションが終了する時まで待機するために使っていたりします。 便利です。


アプリ開発はもう少しできてきたら動画とろうと思います。
steamがセール中なので何か買わなくては


2016年11月20日日曜日

Unityでjson読み込み

Unityでxmlのデータを読み込もうと思ったが、面倒だったのでjsonを読み込むことにしました。
SimpleJSONを使いました。
今回やったことは適当(デザイン性皆無)なUIメニュー画面を作りました。
メニューを選択したときキャラがアニメーションするようにしました。

以下、Jsonデータ

{
    "attack_data":
    [
          {
              "Text":"こうげき",
              "Animation":"none"
          },
          {
              "Text":"斬撃",
              "Animation":"Swinging"
          },
          {
              "Text":"突き",
              "Animation":"Stabbing"
          }
    ],
    "magic_data":
    [
        {
          "Text":   "まほう",
          "Animation":"none"
        },
        {
          "Text":   "ファイアー",
          "Animation":"Magic"
        }
    ],
    "defense_data": 
    [
      {
        "Text":   "ぼうぎょ",
        "Animation":"Guard"
      }
    ],
    "item_data": 
    [
      {
          "Text":   "アイテム",
          "Animation":"none"
      },
      {
          "Text":   "回復薬",
          "Animation":"Item"
      }
    ]
}
 
 
画質悪すぎて文字が見えないw

うーんあまり進んでる感がない。
11月中に戦闘の基盤となる部分を作れるかな?

 

2016年11月12日土曜日

unityでanimatorをつかってみた



左右キーでモーションが変わります。
初めて動画とりましたが画質悪いですね。。。

以下キャラコントロールのソースコード

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

/// キャラコントロール
public class CharaCtrl : MonoBehaviour {

    /// モーションインデックス
   enum MotionIdx
   {
        Walk = 0,
        Run,
        Damage,
        Stabbing,
        ReadyPhysical,
        ReadyMagic,
        Guard,
        Evade,
        Swinging,
        Magic,
        Skill,
        Throw,
        Victory,
        Sick,
        Item,
        Escape,
        Charge,
        Down,
        Jump,
        EndMOtion,
    };


    /// モーションリスト
    string[] MotionList = 
    {
        "Walk",
        "Run",
        "Damage",
        "Stabbing",
        "ReadyPhysical",
        "ReadyMagic",
        "Guard",
        "Evade",
        "Swinging",
        "Magic",
        "Skill",
        "Throw",
        "Victory",
        "Sick",
        "Item",
        "Escape",
        "Charge",
        "Down",
        "Jump",
        "EndMOtion",
    };

    /// アニメ
    [SerializeField]
    private Animator anim;

    /// テキスト
    [SerializeField]
    private Text text;

    /// モーション番号
    private int motion;


 // Use this for initialization
 void Start ()
    {
        motion = 0;
    }
 
 // Update is called once per frame
 void Update ()
    {
        if (Input.GetKeyDown(KeyCode.LeftArrow))
        {
            text.text = MotionList[motion];
            anim.Play(MotionList[motion]);
            motion--;
            if (motion < 0)
            {
                motion = (int)MotionIdx.Jump;
            }
        }
        if (Input.GetKeyDown(KeyCode.RightArrow))
        {
            text.text = MotionList[motion];
            anim.Play(MotionList[motion]);
            motion++;
            if (motion > (int)MotionIdx.Jump)
            {
                motion = 0;
            }
        }
    }
}

以下適当に作ったAnimator
 Animatorってどうやって作ったら効率がいいのか分かんないですね。
 

素材はぴぽやさんから使わせてもらいました。
感謝感激雨あられ
ぴぽや http://piposozai.blog76.fc2.com/

2016年11月6日日曜日

最近の出来事

書くことないので 適当に書いてく

最近やってるゲームについて

・シャドウバース 

ヴァンパイアで
 A3まで行きました。
 数こなさないと上がらないから面倒だ。

 

・攻殻機動隊 S.A.C (オープンベータ)

 うーん普通のFPSゲームであった。
 すぐ飽きてしまうと思う。
 PS2の様な感じのがやりたかったですね。

最近ゲームでハマる事がなくなってきたので
VRに手を出すかもしれない。


アプリ開発について

Unityを使ってアプリを作っていこうと思う。
ただ忙しいのと寒いのでやる気があまり出ない。

・どういったアプリを作るか

Unityを使うが2Dにしようと思う。
規模のでかいゲームを作らないようにしたい
ひとつづつステージを進んでいくような。

・目標

目安を決めて3月までには完成させたい。

11月内に基盤となる部分を作る。
そろそろ本気出す。
仕事が面倒だああああああああ


2016年10月23日日曜日

広告配置するときのHTML編集メモ

blogger内で広告を配置するとき、テンプレートからHTMLから直接;配置する方法と、レイアウトから配置する方法があります。
 HTML変種するのはめんどくさいのでレイアウトに広告配置場所に広告のコードを打って配置するのが楽だと思います。

 HTMLの場合エラーが出る場合があります。
なので覚書程度で書いて置こうと思う。

・よく起きたエラー1

テンプレート プレビューを読み込めませんでした: XML の解析中にエラーが発生しました。行 1939、列 165: The element type "img" must be terminated by the matching end-tag "</img>"

これは終了タグを入力しろっていうことです。
1939の行数のimgタグの最期を 「>」 を 「/>」.に変更すればよいです。
それかimgタグの終了後に</img>を挿入すればよいです。

変更前
<img border="0" width="125" height="125" alt="" src="https://www">
変更後
<img border="0" width="125" height="125" alt="" src="https://www"/>
or
<img border="0" width="125" height="125" alt="" src="https://www"></img>

・よく起きたエラー2

テンプレート プレビューを読み込めませんでした: XML の解析中にエラーが発生しました。行 1939、列 100: The entity name must immediately follow the '&' in the entity reference

&を文字として使いたい場合は「&amp;」と入力する必要があります。
&を&amp;に帰ればエラーは消えます。


変更前
<img border="0" width="125" height="125" alt="" src="https://www&wid=001"/>
変更後
<img border="0" width="125" height="125" alt="" src="https://www&amp;wid=001"/>

文字フォントが分かりにくいですが&=です。大文字にしました。

2016年10月22日土曜日

Bluetoothイヤホン買いました!

amazonでBluetoothイヤホン買いました。




この二つを買いました。
有線だと煩わしくてワイヤレスのイヤホンを買いました。
もう一つのはBluetoothのついていない機器の無線化して音声を送信します。

・利便性としてはまあ便利です。 

動きながらいろいろできます。
スマホともペアリングできます。
延長コードじゃないので線がないので動き回っても邪魔にならないのが最高です。

・ 不便性としては 

音質としては微妙ですが、普通に聞ける程度だと思います。
音声案内の「電源をON・OFFにします」が少し大きいです。
長くつけていると耳がちょっと痛くなる。
充電がめんどくさいとかでしょうか。

・適当な使い方

・TaoTronicsのペアリング方法(Bluetoothで音声を送信する方法)

TaoTronics のほうはイヤホンを指すところにコードをつなげます。
電源ボタンを長押しして電源を入れます。
設定はスイッチをTxとAuxに切り替えます。
2度電源ボタンを押してペアリングモードに入ります。

 ・イヤホンのペアリング方法

イヤホンのほうの説明書が英語なので最初うまくできなかったので書いときます。
電源(真ん中の再生ボタン)を長押しします。
「電源をONにします」
と言われても長押しします。
長押し続けてたら、
「ペアリングモードにします」
と言われるので、うまくいけば音声が聞こえてくると思います。


TaoTronicsのほうが青に点灯すればペアリング完了です。
イヤホンだけならそこまで高くないので興味のある人は試しに買ってみるのもありです。
気に入ったのなら高いの買うのもありです!
個人的にはこれで十分です。
【早い者勝ち!】 あなたのお名前、残ってる?

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