質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

2回答

836閲覧

Jsonファイル内にある数値を配列化して取り出したい

tuna-uniko

総合スコア10

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2020/03/19 15:20

##実現したいこと
現在音ゲーの制作をしているのですが、
下記のJsonファイル内から「num」をスクリプト内で配列化し、これと経過した時間が合致するたびにノーツを生成するスクリプトの作成
を目指しています。
(のちにblockとtypeも使用し、レーンとノーツタイプの判別も行う予定です)

Json

1{"name":"tes","maxBlock":4,"BPM":142,"offset":38300, 2"notes":[{"LPB":4,"num":64,"block":0,"type":1,"notes":[]}, 3{"LPB":4,"num":80,"block":0,"type":1,"notes":[]}, 4{"LPB":4,"num":96,"block":0,"type":1,"notes":[]}, 5{"LPB":4,"num":112,"block":0,"type":1,"notes":[]}]}

*一部分の抜粋です
*noteediotrというエディタにより別途先に作成しています
##現在起きていること
・Jsonファイル内にあるnumの各数値を配列化
・Update関数で配列化したnumと経過時間が一致するたびノーツを生成
という流れを組もうとしていますが、numの配列化に関して方法が全く見つからず悩んでいます。
できる限り私も調査しましたが、どこにもこれと似たケース(Jsonファイルを別途作成したうえでの進行)が見つかりませんでした。

##使用しているもの
Unity 2019.1.5f1
noteeditor(手打ちによるノーツ配置とJsonファイル化出力があるため)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gentaro

2020/03/19 16:48

> numの配列化に関して方法が全く見つからず悩んでいます。 ファイル読んでパースしてオブジェクトの集合から値を取り出して配列にするだけなんじゃ? 質問文からはどこで悩んでるのか検討がつかないですが。
guest

回答2

0

こういうことをなさりたいのでしょうか。

js

1let json = `{"name":"tes","maxBlock":4,"BPM":142,"offset":38300, 2"notes":[{"LPB":4,"num":64,"block":0,"type":1,"notes":[]}, 3{"LPB":4,"num":80,"block":0,"type":1,"notes":[]}, 4{"LPB":4,"num":96,"block":0,"type":1,"notes":[]}, 5{"LPB":4,"num":112,"block":0,"type":1,"notes":[]}]}`; 6 7let obj = JSON.parse(json); 8let numArray = []; 9obj.notes.forEach(note => { 10 numArray.push(note.num); 11}); 12console.log(numArray); // -> (4) [64, 80, 96, 112]

投稿2020/03/20 05:41

quadii.shii

総合スコア257

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tuna-uniko

2020/04/23 05:35

返信が大変遅れて申し訳ありませんでした。並びに情報ありがとうございます。 私が使用している言語の方はC#でして、C#での書き方はありますでしょうか?
guest

0

自己解決

自己解決に至りましたので報告です。
追記修正依頼の項よりパースなどについて調べて勉強していましたところ、Jsonファイルの読み込み方を発見しました。その結果、シリアライズとデシリアライズを使うことでJsonファイル内のkeyとvalueを読み込み、配列に落とし込むことができました。これにより各レーンにノーツを流す処理まで組めています。
以下Jsonファイルの読み込みからノーツ生成までのスクリプトです。

C#

1using UnityEngine; 2using System; 3 4[Serializable] 5public class date 6{ 7 public Note[] notes; 8} 9 10[Serializable] 11public class Note 12{ 13 public int num; 14 public int block; 15} 16 17public class notego : MonoBehaviour 18{ 19 //numとblockを入れる配列 20 int[] array=new int[50]; 21 int[] rean = new int[50]; 22 23 int x; 24 int y; 25 int i; 26 float de=0; 27 int g=0; 28 float z = 0.5f; 29 float tim; 30 float iti; 31 public GameObject note1; 32 public GameObject note2; 33 public GameObject note3; 34 public GameObject note4; 35 GameObject mi; 36 37  //ノーツ生成とリズム同期の確認用 38 public AudioClip tan; 39 private AudioSource tl; 40 // Start is called before the first frame update 41 void Start() 42 { 43 //Jsonファイルの読み込みと配列化処理 44 string inputstring =Resources.Load<TextAsset>("tes").ToString(); 45 date inp = JsonUtility.FromJson<date>(inputstring); 46 47 for (i = 0; i < 50; i++) 48 { 49 x=inp.notes[i].num; //i番目のnumを代入 50 array[i]= x; //配列arrayにxへ代入されたi番目のnumを追加 51 y = inp.notes[i].block; //i番目のblockを代入 52 rean[i] = y; //配列reanにyへ代入されたi番目のblockを追加 53 } 54 55 tl = gameObject.GetComponent<AudioSource>(); 56 tl.clip = tan; 57 } 58 59 // Update is called once per frame 60 void Update() 61 { 62 de +=0.45f; 63 z += 0.5f; 64 if (z == array[g]) { 65 GameObject nt; 66 if (rean[g] == 0) 67 { 68 iti = -3.78f; 69 mi = note1; 70 } 71 else if (rean[g] == 1) 72 { 73 iti = -1.26f; 74 mi = note2; 75 } 76 if (rean[g] == 2) //blockを参照 77 { 78 iti = 1.25f; 79 mi = note3; 80 } 81 else if (rean[g] == 3) 82 { 83 iti = 3.75f; 84 mi = note4; 85 } 86 nt = Instantiate(mi) as GameObject; 87 88 //ノーツを作成する位置の指定 89 nt.transform.position= new Vector3(iti, 5.7f, -0.03f); 90 tl.Play(); 91 Debug.Log(rean[g]); 92 g += 1; 93 } 94 } 95}

解決のため参考にさせていただいたサイト様
https://memonoana.hatenablog.com/entry/2019/05/22/005823 

gentaro様
追記・修正依頼を出してくださったおかげでパースや値の暗黙的な変換、シリアライズなどC#/Unityのプログラミングの知識を深めることができました。勉強・調査不足で返信もできず失礼しました。ありがとうございます。

quadii.shii様
JAVAscriptでの書き方を教えていただきありがとうございます。使用言語こそ違いましたが、JAVAscriptをUnity内で使用する機会がいずれ訪れるはずですので、その際参考にさせていただきたいと思います。

改めてお二方へ、ありがとうございました。

投稿2020/04/30 04:20

tuna-uniko

総合スコア10

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問