public void Setup()
    {
        if (_ins != null)
        {
            Debug.LogError($"Multiple {this.GetType()} were instantiated");
            return;
        }
        _ins = this;

        this.datas = new List <GameMetadata>();
        // read file
        string content = File.ReadAllText($"Assets/{this.filename}");

        // iterate array of metadata
        foreach (JObject item in JArray.Parse(content).ToArray())
        {
            GameMetadata newData = new GameMetadata();
            newData.id     = Convert.ToInt32(item["ID"].Value <string>());
            newData.name   = item["Name"].Value <string>();
            newData.type   = Convert.ToInt32(item["Type"].Value <string>());
            newData.values = new List <string>();
            for (int i = 1; i <= 5; i++)
            {
                newData.values.Add(item[$"Value{i}"].Value <string>());
            }
            this.datas.Add(newData);
        }
    }
    void Start()
    {
        // get components
        this.notificationCenter = GetComponent <NotificationCenter>();
        this.gameMetadataParser = GetComponent <GameMetadataParser>();
        this.spawner            = GetComponent <Spawner>();

        // setup
        this.notificationCenter.SetupClient();
        this.gameMetadataParser.Setup();
        this.spawner.Setup();

        DontDestroyOnLoad(gameObject);
    }