【Unity初心者】Unityでネットゲームを作りたい【1】色々悩む～ExcelでJsonの配列を作る

https://qiita.com/ysyss5500/items/4aeb23639a8cf3d67376


昔Perlで作ったCGIゲームを元に、androidでゲームアプリ作れないかな？と色々調べてたら、Unityってのがいいらしいということで早速ダウンロードしていじってみましたが、わからないことが多すぎる。。。
まず、「C＃」がわからんし、オブジェクト指向も理解できてない。

そんな私が、メモ代わりに記載していこうと思います。

#### Unityの使い方に悩む
インストールするとUnityHubが立ち上がり英語表記
英語できない（致命傷）なので、ググって日本語化
とりあえずプロジェクトを作るのか～ってなったが、ググった先はver3ぐらいだったかな
ダウンロードして起動したのはVer6
表示がちょいと違うが、何とか解読して（間違ってる）プロジェクト起動
何をすればいいかわからんので、再度ググる
んで見つけたのが[ちくわ](https://nn-hokuson.hatenablog.com/entry/2016/07/04/213231)さんのブログ
説明通りやってみる（スクリプト全部コピペ
おおー動く。なるほど、VBAでボタンとかにプログラムするのとかわらんねと理解（間違ってる）
なんとなくやり方覚えたつもりで次へ進む



#### プレイヤー登録処理に悩む

まずは、レイアウトーって思ったのですが、プレイヤーのログインって？となった。
androidとかiPhoneってIDとパスってあんま使わないよねーと。
調べてみたら、「PlayFab」って色々出来る無料のがあると。
<a href="https://anogame.net/playfab-tutorial-simplelogin/">あのゲームの作り方</a>ってサイトのブログを参考にして、やってみる

**おおお!**

できたｗ
ちなみにこっちでないと新しいPlayFabのログイン方法（winアカウント対応）にならんみたい
他のでやるとPlayFabにログインできん

#### ログイン時のデータ記入に悩む

書いてある通りやると、ログイン処理はできてる
でもログインと同時に初期データを書き込みたい
どうも、プレイヤーデータに直接書き込めるらしいが、全てに自分で書き込むのは無理だから、初期ログイン時に自動で書き込みたい

調べたら書き込めるらしいが、最大１０まで？（無料の場合（たぶん））
json形式ならリストとして保存できるらしい。。。。何ぞや   **json**

調べました
JavaScriptで使われる配列の形みたいですねー（それすら知らん）
いじってみると、PlayFabではjson形式でデータは保存読み込みできるみたい
json調べました
```rd
{
  "aaa":"111"
  "bbb":"222"
}
```
みたいなデータを扱うらしいです
aaaの値が111みたいな
でもこれだとデータ書くのめんどいし、読み込むのもだるい
調べると
```rd
{
    "item":[
      "aaa":"111"
      "bbb":"222"
    ]
}
```
この形もあると
なるほど！
配列名あって、そのマッチした配列のaaaを読み込める
これは便利！ってことで採用
### これって、対戦モンスターとかアイテムで使えるんでは？
と思って調べてみると（毎回ググってます）使えそうだ
PlayFabでは、ゲーム自体の固有データとして保存できる機能がある（タイトルデータ）
ここに保存しておけば、いつでも呼び出して対応できるはずと、思った
アプリ内に○○.jsonで保存しておけば、いつでも読み込めるし、PlayFabで変更すれば、変更も楽にできるかなーっと

じゃ、まずデータ作るか

めんどい。。。。

簡単に100以上とかの配列データ作れるソフトとかないの？見つからない作るか
#### Excelでjsonの配列を作る
作りました。Excelのマクロ使って（いろいろなサイトを参考に作りました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3979014/6793b3c9-3d48-deff-5354-3a4dd363e043.png)

こんな感じです
赤枠に使用する配列名、青枠にステータスを入力すると、どんどんリストに追加されていきます
削除はnameの所だけの一致で削除します
モンスターとかアイテムだとRankがあるとｲｲﾅｰってことで、あとから付け足し
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3979014/cb1b866c-497c-4c9c-78a7-41261998ac0c.png)
設定用シート作成

入力ボタン押したときの処理
```rd
Sub 入力()
    
    '初期処理
    '名前がなかったら
    If Range("B2") = "" Then
        MsgBox "B2セルに入力してください"
        Exit Sub
    End If
    '空白に”0"を記入
    If Range("C2") = "" Then
        Range("C2") = "0"
    End If
     If Range("D2") = "" Then
        Range("D2") = "0"
    End If
   
    If Range("E2") = "" Then
        Range("E2") = "0"
    End If
    If Range("F2") = "" Then
        Range("F2") = "0"
    End If

    Dim xlLastRow As Long       'Excel自体の最終行
    Dim LastRow As Long         '最終行
 
    xlLastRow = Cells(Rows.Count, 1).Row  'Excelの最終行
    LastRow = Cells(xlLastRow, 2).End(xlUp).Row   'D列の最終行を取得
    
    '重複確認
    If WorksheetFunction.CountIf(Range(Cells(7, 2), Cells(LastRow + 1, 2)), Range("B2")) <= 0 Then
    Range("G2").Value = "追加OK"
    'いきなり書き込むのでなくメッセージを追加したい場合は'をはずす
    'MsgBox "追加入力しました"
    Else
    Range("G2").Value = "重複"
    msg = "同じものを発見しました！上書きしますか？"
    If MsgBox(msg, vbYesNo) = vbNo Then
    Range("B2").Select
    Exit Sub
    End If
    
    Dim i As Long
    With Range("B6")
        Do While .Offset(i, 0) <> ""
            If .Offset(i, 0) = Range("B2") Then .Offset(i, 0).EntireRow.Delete
            i = i + 1
        Loop
    End With
    
    xlLastRow = Cells(Rows.Count, 1).Row  'Excelの最終行
    LastRow = Cells(xlLastRow, 2).End(xlUp).Row   'D列の最終行を取得

    End If
    
    'ランク作成
    gou = Range("c2") + Range("d2") + Range("e2") + Range("f2")
        
    If gou >= Worksheets("Rank設定").Range("E4").Value And gou < Worksheets("Rank設定").Range("E5").Value Then
        Rank = Worksheets("Rank設定").Range("B5").Value
    ElseIf gou >= Worksheets("Rank設定").Range("E5").Value And gou < Worksheets("Rank設定").Range("E6").Value Then
        Rank = Worksheets("Rank設定").Range("B6").Value
    ElseIf gou >= Worksheets("Rank設定").Range("E6").Value And gou < Worksheets("Rank設定").Range("E7").Value Then
        Rank = Worksheets("Rank設定").Range("B7").Value
    ElseIf gou >= Worksheets("Rank設定").Range("E7").Value Then
        Rank = Worksheets("Rank設定").Range("B8").Value
    Else
        Rank = Worksheets("Rank設定").Range("B4").Value
    End If
    
    '書き込み
    
    '番号処理
    j = LastRow + 1
    Cells(7, 1) = "0"
    For i = 8 To j
        Cells(i, 1) = Cells(i - 1, 1) + 1
    Next
    
    '一覧表に書き込み
    Cells(LastRow + 1, 2).Value = Range("B2")
    Cells(LastRow + 1, 3).Value = Range("C2")
    Cells(LastRow + 1, 4).Value = Range("D2")
    Cells(LastRow + 1, 5).Value = Range("E2")
    Cells(LastRow + 1, 6).Value = Range("F2")
    Cells(LastRow + 1, 7).Value = Rank
    Cells(LastRow + 1, 8).Value = Range("C4") & Range("B1") & Range("D4") & Range("B2") & Range("E4") & Range("c1") & Range("d4") & Range("C2") & Range("E4") & Range("d1") & Range("d4") & Range("d2") & Range("e4") & Range("e1") & Range("d4") & Range("e2") & Range("e4") & Range("f1") & Range("d4") & Range("f2") & Range("e4") & Range("g6") & Range("d4") & Rank & Range("f4")
    
    'コピー用Jsonをrange("I2")に作成
    
    Range("I2").MergeArea.ClearContents
    Range("I2") = "{" & vbLf & Range("i2") & Range("R4") & Range("A2") & Range("R4") + ":["
    
    j = LastRow + 1
    
    For i = 7 To j
        Range("I2").Value = Cells(2, 9).Value & vbLf & Cells(i, 8).Value
    Next
    
    Range("I2").Value = Left(Range("I2"), Len(Range("I2")) - 1)
    Range("I2").Value = Range("I2") & vbLf & "]" & vbLf & "}"
    
    'ターゲットをnameに、各数字を空白に
    Range("B2").Select
    Range("C2") = ""
    Range("D2") = ""
    Range("E2") = ""
    Range("F2") = ""
    Range("G2") = ""

End Sub
```
削除ボタンの処理
```rd
Sub 削除()
    Dim xlLastRow As Long       'Excel自体の最終行
    Dim LastRow As Long         '最終行
 
    xlLastRow = Cells(Rows.Count, 1).Row  'Excelの最終行
    LastRow = Cells(xlLastRow, 2).End(xlUp).Row   'D列の最終行を取得

    '重複確認
    If WorksheetFunction.CountIf(Range(Cells(7, 2), Cells(LastRow + 1, 2)), Range("B2")) >= 1 Then
    Range("G2").Value = "削除OK"
    'MsgBox "削除しました"
    
    Dim i As Long
    With Range("B6")
        Do While .Offset(i, 0) <> ""
            If .Offset(i, 0) = Range("B2") Then .Offset(i, 0).EntireRow.Delete
            i = i + 1
        Loop
    End With
  
    Else
    Range("G2").Value = "なし"
    MsgBox "同じ物を発見できませんでした"
    Range("B2").Select
    Range("G2") = ""
    Exit Sub
    End If

    '番号処理
    j = LastRow - 1
    Cells(7, 1) = "0"
    
    For i = 8 To j
        Cells(i, 1) = Cells(i - 1, 1) + 1
    Next

    'コピー用Jsonをrange("I2")に作成
    
    Range("I2").MergeArea.ClearContents
    Range("I2") = "{" & vbLf & Range("i2") & Range("R4") & Range("A2") & Range("R4") + ":["
    
    j = LastRow + 1
    
    For i = 7 To j
        Range("I2").Value = Cells(2, 9).Value & vbLf & Cells(i, 8).Value
    Next
    
    Range("I2").Value = Left(Range("I2"), Len(Range("I2")) - 3)
    Range("I2").Value = Range("I2") & vbLf & "]" & vbLf & "}"

    Range("B2").Select
    Range("G2") = ""
End Sub
```
全て削除ボタンの処理
```rd
Sub 全て削除()

    msg = "全てのデータを削除しますがよろしいですか？"
    If MsgBox(msg, vbYesNo) = vbNo Then Exit Sub
    
    Dim xlLastRow As Long       'Excel自体の最終行
    Dim LastRow As Long         '最終行
 
    xlLastRow = Cells(Rows.Count, 1).Row  'Excelの最終行
    LastRow = Cells(xlLastRow, 2).End(xlUp).Row   'D列の最終行を取得

    Range("I2") = ""
    Range(Cells(7, 1), Cells(LastRow + 1, 8)).ClearContents
    Range("B2").Select
    Range("C2") = ""
    Range("D2") = ""
    Range("E2") = ""
    Range("F2") = ""
    Range("G2") = ""

End Sub
```
jsonファイル作成ボタン処理（UTF-8で出力
```rd
Sub 作成()

    Dim FileName As Variant
    FileName = Application.GetSaveAsFilename(InitialFileName:=Range("A2"), FileFilter:="Jsonファイル,*.json*")
    If FileName = False Then
        Exit Sub
    End If
    'MsgBox FileName
    Dim Target As String
    Target = FileName

    If InStr(Target, ".json") > 0 Then
        Target = FileName
        'MsgBox Target
    Else
        Target = FileName & "json"
        'MsgBox Target
    End If

    If Dir(Target) <> "" Then
        msg = "同じ名前のファイルが存在します。上書きしますか？"
        If MsgBox(msg, vbYesNo) = vbNo Then Exit Sub
    End If
   
    With CreateObject("ADODB.Stream")
        .Charset = "UTF-8"
        .Open
        .WriteText Cells(2, 9), 1
        .SaveToFile Target, 2
        .Close
    End With
    '終わったのが分かるようにメッセージを出す
    'MsgBox "出力完了"

    Range("B2").Select
    Range("G2") = ""

End Sub
```

で、せっかく作ったので、誰でも使えるように公開

[Json作成](http://www.vector.co.jp/soft/data/game/se527243.html)　（Excel・Vector）

まぁ...これからいじって使い勝手良くしていくつもり
でもこれで、jsonファイルの作成は便利になったはず

Unityに戻って読み込んで表示、使用出来るようにしなくては！！


←前  [目次](https://qiita.com/ysyss5500/items/4aeb23639a8cf3d67376)
[【Unity初心者】Unityでネットゲームを作りたい【2】Json取入](https://qiita.com/ysyss5500/items/7078965fc5ea6e203d55)　次→

https://qiita.com/ysyss5500/items/4aeb23639a8cf3d67376