как преобразовать json в dictionary

Программирование на Юнити.

как преобразовать json в dictionary

Сообщение ВерховныйНоуНейм 06 авг 2019, 22:29

У меня есть система диалогов, которая просто достает с файлов JSON массивы string[] с каракулями. Собственно разговор идет через цикл и массив[id фразы]
Массивы с фразами у меня называются "SC(idБиблиотеки)_(idДиалога)"
Собственно чтобы мне не строить пирамиду из названий переменных, я начал рыться, чтобы найти, как это записать в пару строк

по стандарту я получаю фразу так:
Синтаксис:
Используется csharp
ChatActive.chatText.text = ChatActive.chatText.text + "\n" + LogsSystemBase.log.SC1_1[logId];
 


все, что я нашел и пытался настроить:
Синтаксис:
Используется csharp
ChatActive.chatText.text = ChatActive.chatText.text + "\n" + (string)LogsSystemBase.log.GetType ().GetField ("log.SC" + libraryId.ToString () + "_" + logId.ToString ()).GetValue(LogsSystemBase.log);
 


Выдает ошибку о ненахождении объекта...
Последний раз редактировалось ВерховныйНоуНейм 09 авг 2019, 16:23, всего редактировалось 1 раз.
Изображение
Аватара пользователя
ВерховныйНоуНейм
UNIт
 
Сообщения: 68
Зарегистрирован: 25 фев 2017, 19:56

Re: как преобразовать string в название массива

Сообщение ВерховныйНоуНейм 07 авг 2019, 12:07

Раз уж нет решения, то сделаю по стандарту.

Тогда у меня есть вопрос влияет ли большое количество массивов string[] = new string[100] на производительность(или оперативку)? Мне кажется беспокойство не стоит свеч.
Изображение
Аватара пользователя
ВерховныйНоуНейм
UNIт
 
Сообщения: 68
Зарегистрирован: 25 фев 2017, 19:56

Re: как преобразовать string в название массива

Сообщение Woland 07 авг 2019, 18:22

Большое это сколько?
Woland
Адепт
 
Сообщения: 1240
Зарегистрирован: 20 апр 2013, 18:09
  • Сайт

Re: как преобразовать string в название массива

Сообщение ВерховныйНоуНейм 07 авг 2019, 22:01

1 диалог = 1 массив
Во всей игре, я думаю, будет 500+

Правда массив при загрузке принимает длину массива из JSON. В среднем каждый массив будет содержать 30 элементов.
Изображение
Аватара пользователя
ВерховныйНоуНейм
UNIт
 
Сообщения: 68
Зарегистрирован: 25 фев 2017, 19:56

Re: как преобразовать string в название массива

Сообщение JohnDoe139 08 авг 2019, 16:25

clелай чтобы JSON загружался в Dictionary<string, string[]>, чтобы ты мог обращаться по-типу LogsSystemBase.log.YourDictionary[some_key][logId];, где some_key будет твой "SC_1_1". Если не получится сделать загрузку сразу в dictionary, сделай это уже после загрузки. То, что ты хочешь сделать это супер костыль, это можно сделать через reflection, но он супер медленный и в рантайме я бы тебе не советовал его использовать.
JohnDoe139
UNец
 
Сообщения: 2
Зарегистрирован: 05 май 2016, 17:33

Re: как преобразовать string в название массива

Сообщение ВерховныйНоуНейм 08 авг 2019, 18:26

JohnDoe139 писал(а):clелай чтобы JSON загружался в Dictionary<string, string[]>, чтобы ты мог обращаться по-типу LogsSystemBase.log.YourDictionary[some_key][logId];, где some_key будет твой "SC_1_1". Если не получится сделать загрузку сразу в dictionary, сделай это уже после загрузки. То, что ты хочешь сделать это супер костыль, это можно сделать через reflection, но он супер медленный и в рантайме я бы тебе не советовал его использовать.

Спасибо большое! Как реализую, закину сюда код для гостей.
Изображение
Аватара пользователя
ВерховныйНоуНейм
UNIт
 
Сообщения: 68
Зарегистрирован: 25 фев 2017, 19:56

Re: как преобразовать string в название массива

Сообщение ВерховныйНоуНейм 09 авг 2019, 15:09

И так спустя пару дней я откопал способ
Для того, чтобы прикол работал, качаем asset "JSON .NET For Unity" и устанавливаем
База, в которую все подгружается:
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using Newtonsoft.Json;

public class LogsSystemBase : MonoBehaviour {

        string json;
        public static Logs log = new Logs ();
        public int Vol = 1;

        void Awake () {
                LogsLoad ();
        }

        public void LogsLoad () {
                //я сделал разделение по языкам. Сам файл имеет имя VOL1_ru_RU.json.
                json = File.ReadAllText (Application.streamingAssetsPath + "/Logs/VOL" + Vol.ToString () + "_" + PlayerPrefs.GetString ("Language", "en_US") + ".json");
                LogsSystemBase.log.dict = JsonConvert.DeserializeObject<Dictionary<int, string[]>> (json);
        }
}
public class Logs {
        public Dictionary<int, string[]> dict = new Dictionary<int, string[]>();
}

Сам json:
Синтаксис:
Используется csharp
{
        "0":[
                        "Игрок: Давно ты тут стоишь?", "Прилично"],
        "1":[
                        "Мы прерываем передачу из-за срочных новостей", "В городе наблюдается вспышка болезни"]
}

Trigger для диалога:
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class ChatLog : MonoBehaviour {

        public int logId;
        string[] s;
        int i = 0;
        public bool onTriggerEnter;
        public bool blocked = true;
        bool block;

        void Update () {
               
        }
        void SetArrayLog() {
                s = LogsSystemBase.log.dict[logId];
        }
        void OnTriggerStay2D (Collider2D coll) {
                if (coll.tag == "Player") {
                        if ((Input.GetKeyDown (GameKeyManager.GKM.interaction) || onTriggerEnter) && (!block || !blocked)) {
                                SetArrayLog ();
                                StartCoroutine (chat ());
                                block = true;
                        }
                }
        }
        IEnumerator chat() {
                i = 0;
                while (i < s.Length) {
                        if (s [i].Remove (1) != "[") //если сообщение в квадратных скобках, например [игрок повесил трубку], то знак "►" перед началом сообщения не ставится
                                ChatActive.chatText.text = ChatActive.chatText.text + "\n" + "►" + s [i];
                        else
                                ChatActive.chatText.text = ChatActive.chatText.text + "\n" + s [i];
                        ChatActive.timer = 0.3f * s [i].Length;
                        yield return new WaitForSeconds (s [i].Length * 0.06f);
                        i++;
                }
        }
}

При желании можно подгружать и в List
Изображение
Аватара пользователя
ВерховныйНоуНейм
UNIт
 
Сообщения: 68
Зарегистрирован: 25 фев 2017, 19:56


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5