【Unity】かわいい2Dパズルゲームを作ったよ！

【開発環境】
Unity Version 2018.3.13f1
VisualStudio2017 Version 15.9.10
言語：C#

##目次
1. はじめに
1. 使いまわしを意識したコーディング
1. ステージデータをScriptableObjectで作成
1. セーブデータ周りで躓いた事
1. あとがき

## はじめに
初めてUnityを使ってゲームを作りました。
制作を通して気づいた点、躓いた点をお伝え出来たらと思います。
Unityを使えば簡単にゲームが作れる！と聞いていましたが、
初めて故に躓くことも多く、とても良い学びになりました。

下記URLよりダウンロードできます。
よければ遊んでいただけると嬉しいです。
https://www.freem.ne.jp/win/game/20652
![qiita1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465744/e146014d-d896-8b8b-c655-5ca371d76318.png)

## 使いまわしを意識したコーディング

・ボタンを押したら、オブジェクトを有効/無効
・ボタンを押したら、ゲームフロー(ステータス)変更
等々、1つのスクリプトをアタッチするだけで動作するように意識しました。
使いまわせるように作ると実装が楽になりますね！

以下は、
__・ボタンを押したら、オブジェクトを有効/無効__
の例です。　　　　　　　　
変更したいオブジェクトを入れてチェックボックスで有効/無効を決めます。
![qiita2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465744/b17deccd-f5e9-fa94-c7b5-ccc2b2d27093.png)

```C#
public class SetActiveButton : MonoBehaviour
{
 
    //=========================
    // SerializeField.
    //=========================
    [SerializeField] SetActiveObject[] m_setactiveObjects = null;
   
    //=========================
    // Public.
    //=========================
    [System.Serializable]
    class SetActiveObject 
    {
        public GameObject m_gameObject;
        public bool m_enabled;
    }

    //=========================
    // Public Method.
    //=========================
    public void OnClick()
    {
        if (m_setactiveObjects.Length > 0)
        {
            foreach(var setactiveObject in m_setactiveObjects)
            {
                setactiveObject.m_gameObject.SetActive(setactiveObject.m_enabled);
            }
        }
        else
        {
            Debug.LogError("m_setactiveObjects is empty!");
        }
    }
}
```

##ステージデータをScriptableObjectで作成
ステージデータはデータ作成用のSceneを用意して、ステージの幅、高さ、ピースの種類変更など変更して作成しました。
ScriptableObjectを使用するメリットとしては、Inspector上で値を確認や編集が出来ること。
JSONでも可能だとは思いますが、ScriptableObjectの方が圧倒的に見やすいと思います。
![qiita4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465744/552ecedb-970e-d08e-e812-fb96f501d8e8.png)
![qiita3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/465744/c16abbb9-df72-5e54-7377-2730019f7adc.png)


参考記事：
http://kan-kikuchi.hatenablog.com/entry/What%27s_Scriptableobject
https://anchan828.github.io/editor-manual/web/scriptableobject.html
https://techblog.kayac.com/unity_advent_calendar_2016_6

##セーブデータ周りで躓いた事
セーブデータ管理は当初PlayerPrefsを使おうと思っていましたが、
__Windowsでは保存場所がレジストリ__になるため諦めました。
そのため、JSONを使ってセーブデータを作ることにしました。
JsonUtilityを使って簡単に操作できるので使いやすいです！

しかし、セーブデータを作れたはいいものの暗号化していないので、
簡単にデータを見られてしまいます。
なので、以下の方法で暗号化を考えました。


__・セーブ時にjsonUtilityから取得したstringをbyteに変換してからセーブする__
結論から言うと断念しました。
byteに変換するところまでは確認できましたが、いざセーブしようとするとできませんでした……。
System.Text.Encoding.UTF8.GetBytes()周りを調べましたが原因は掴めませんでした。
そのため以下の方法に方針を変えました。


__・セーブ時にjsonUtilityから取得したstringを1文字ずつ文字コードをずらす__
とても単純ですが、これでセーブデータを見られてもすぐには分からなくなりました。

```C#
        string json = JsonUtility.ToJson(m_saveData);
        char[] data = json.ToCharArray();

        // 暗号化.
        for (int index = 0; index < data.Length; index++)
        {
            data[index] += (char)CONVERT_KEY;
        }
```

参考記事：
PlayerPrefs
http://sat-box.hatenablog.jp/entry/2017/06/19/194308
string→byte
https://www.ipentec.com/document/csharp-string-to-bytearray
jsonUtility
https://creive.me/archives/14311/

##あとがき
やっぱりゲーム作りは楽しいです。
今後はもっと爆速で開発できるよう腕をあげていきたいですね。
至らないところもありますが、ここまで読んでいただきありがとうございました。
少しでもお役に立てれば幸いです。

Twitter：
@tofu_doon 
ブログ：
https://tofu-doon.hatenablog.com/