public static void LoadPrefabsFromJSON()
    {
        // GameObject parentObject = Selection.gameObjects[0];
        string    prefabRelativePath = @"Assets/Prefabs/MapComponents";
        TextAsset text    = Resources.Load <TextAsset>("Haru");
        JSONNode  mapTest = JSONNode.Parse(text.text);
        JSONNode  mapInfo = mapTest["MapInfo"];

        foreach (JSONNode node in mapInfo.Childs)
        {
            GameObject mapPiece = AssetDatabase.LoadAssetAtPath <GameObject>(prefabRelativePath + "/" + node["FileName"] + ".prefab");
            mapPiece = Instantiate(mapPiece);
            mapPiece.GetComponent <MapObject>().index    = node["Index"].AsInt;
            mapPiece.GetComponent <MapObject>().position = new Vector2(node["Position"][0].AsFloat, node["Position"][1].AsFloat);
            mapPiece.GetComponent <MapObject>().rotation = node["Rotation"].AsFloat;
            mapPiece.GetComponent <MapObject>().scale    = new Vector2(node["Scale"][0].AsFloat, node["Scale"][1].AsFloat);

            List <int> childrens = new List <int>();
            foreach (JSONNode child in node["Children"].AsArray)
            {
                childrens.Add(child.AsInt);
            }
            mapPiece.GetComponent <MapObject>().childrenIndex = childrens;

            List <MapObject.KeyTrigger> keyTriggers = new List <MapObject.KeyTrigger>();

            List <int> indexList = new List <int>();
            foreach (JSONNode trigger in node["KeyTrigger"].Childs)
            {
                MapObject.KeyTrigger currentKey = new MapObject.KeyTrigger();
                indexList = new List <int>();
                foreach (JSONNode index in trigger["Index"].AsArray)
                {
                    indexList.Add(index.AsInt);
                }
                currentKey.index     = indexList;
                currentKey.dPosition = new Vector2(trigger["dPosition"][0].AsFloat / 100.0f,
                                                   trigger["dPosition"][1].AsFloat / 100.0f);
                currentKey.dRotation   = trigger["dRotation"].AsFloat;
                currentKey.dScale      = new Vector2(trigger["dScale"].AsFloat, trigger["dScale"].AsFloat);
                currentKey.duration    = trigger["Duration"].AsFloat;
                currentKey.visible     = trigger["Visible"].AsBool;
                currentKey.triggerable = trigger["Triggerable"].AsBool;
                currentKey.load        = trigger["Load"].AsBool;
                currentKey.objects     = new List <MapObject>();
                keyTriggers.Add(currentKey);
            }

            mapPiece.GetComponent <MapObject>().keyTriggers            = keyTriggers;
            mapPiece.GetComponent <MapObject>().transferCrystalTrigger = node["TransferCrystalTrigger"].AsInt;

            MapObject.ShiftCrystalTrigger shiftTrigger = new MapObject.ShiftCrystalTrigger();
            indexList = new List <int>();
            foreach (JSONNode index in node["ShiftCrystalTrigger"]["Index"].AsArray)
            {
                indexList.Add(index.AsInt);
            }

            shiftTrigger.index     = indexList;
            shiftTrigger.objects   = new List <MapObject>();
            shiftTrigger.direction = node["ShiftCrystalTrigger"]["Direction"].AsBool;
            mapPiece.GetComponent <MapObject>().shiftCrystalTrigger = shiftTrigger;

            mapPiece.GetComponent <MapObject>().type = (MapPiece.MapType)node["Type"].AsInt;
            mapPiece.transform.position    = new Vector3(node["Position"][0].AsFloat / 100.0f, node["Position"][1].AsFloat / 100.0f, 0.0f);
            mapPiece.transform.eulerAngles = new Vector3(0, 0, -node["Rotation"].AsFloat);
            mapPiece.transform.localScale  = new Vector3(node["Scale"][0].AsFloat, node["Scale"][1].AsFloat, 1.0f);
            mapPiece.GetComponent <MapObject>().visible = node["Visible"].AsBool;
            mapPiece.GetComponent <MapObject>().load    = node["Load"].AsBool;
            mapPiece.GetComponent <MapObject>().transferCrystalTriggerObject = new MapObject();
            mapPiece = PrefabUtility.InstantiatePrefab(mapPiece) as GameObject;
            // mapPiece.transform.parent = parentObject.transform;
        }
        GameObject[] objects = (GameObject[])Resources.FindObjectsOfTypeAll(typeof(GameObject));
        foreach (var obj in objects)
        {
            if (SceneManager.GetActiveScene() == obj.scene)
            {
                if (obj.GetComponent <MapObject>() != null)
                {
                    MapObject o = obj.GetComponent <MapObject>();
                    foreach (var keyTrigger in o.keyTriggers)
                    {
                        foreach (int idx in keyTrigger.index)
                        {
                            MapObject targetMapObject = new MapObject();
                            foreach (var obj2 in objects)
                            {
                                if (obj2.GetComponent <MapObject>() != null && obj2.GetComponent <MapObject>().index == idx)
                                {
                                    targetMapObject = obj2.GetComponent <MapObject>();
                                }
                            }
                            keyTrigger.objects.Add(targetMapObject);
                        }
                    }

                    foreach (int idx in o.shiftCrystalTrigger.index)
                    {
                        MapObject targetMapObject = new MapObject();
                        foreach (var obj2 in objects)
                        {
                            if (obj2.GetComponent <MapObject>() != null && obj2.GetComponent <MapObject>().index == idx)
                            {
                                targetMapObject = obj2.GetComponent <MapObject>();
                            }
                        }
                        o.shiftCrystalTrigger.objects.Add(targetMapObject);
                    }

                    if (o.transferCrystalTrigger != 0)
                    {
                        MapObject targetMapObject = new MapObject();
                        foreach (var obj2 in objects)
                        {
                            if (obj2.GetComponent <MapObject>() != null && obj2.GetComponent <MapObject>().index == o.transferCrystalTrigger)
                            {
                                targetMapObject = obj2.GetComponent <MapObject>();
                            }
                        }

                        o.transferCrystalTriggerObject = targetMapObject;
                    }
                }
            }
        }
    }
    public static JSONClass SaveNode(int type, int index, string fileName, float positionX, float positionY, float rotation, float scaleX, float scaleY,
                                     List <int> children, bool visible, bool load, List <MapObject.KeyTrigger> keyTriggers,
                                     MapObject transferTrigger, MapObject.ShiftCrystalTrigger shiftTrigger)
    {
        JSONClass result = new JSONClass();

        result.Add("Type", new JSONData(type));
        result.Add("Index", new JSONData(index));
        result.Add("FileName", new JSONData(fileName));
        result.Add("Position", new JSONArray
        {
            new JSONData(positionX),
            new JSONData(positionY)
        });
        result.Add("Rotation", new JSONData(rotation));
        result.Add("Scale", new JSONArray
        {
            new JSONData(scaleX),
            new JSONData(scaleY)
        });
        JSONArray childrenJSON = new JSONArray();

        foreach (int child in children)
        {
            childrenJSON.Add(new JSONData(child));
        }
        result.Add("Children", childrenJSON);
        result.Add("Visible", new JSONData(visible));
        result.Add("Load", new JSONData(load));
        JSONArray keyTrigger = new JSONArray();

        foreach (MapObject.KeyTrigger trigger in keyTriggers)
        {
            JSONClass triggerClass = new JSONClass();
            JSONArray indexArray   = new JSONArray();
            Debug.Log(trigger.dPosition.x);
            foreach (MapObject obj in trigger.objects)
            {
                indexArray.Add(new JSONData(obj.index));
            }

            triggerClass.Add("Index", indexArray);
            triggerClass.Add("dPosition", new JSONArray()
            {
                new JSONData(trigger.dPosition.x * 100.0f),
                new JSONData(trigger.dPosition.y * 100.0f)
            });
            triggerClass.Add("dRotation", new JSONData(trigger.dRotation));
            triggerClass.Add("dScale", new JSONArray()
            {
                new JSONData(trigger.dScale.x),
                new JSONData(trigger.dScale.y)
            });
            triggerClass.Add("Duration", new JSONData(trigger.duration));;
            triggerClass.Add("Visible", new JSONData(trigger.visible));
            triggerClass.Add("Triggerable", new JSONData(trigger.triggerable));
            triggerClass.Add("Load", new JSONData(trigger.load));
            keyTrigger.Add(triggerClass);
        }
        result.Add("KeyTrigger", keyTrigger);
        result.Add("TransferCrystalTrigger", new JSONData(transferTrigger.index));
        JSONClass shiftTriggerNode = new JSONClass();
        JSONArray shiftIndex       = new JSONArray();

        foreach (MapObject obj in shiftTrigger.objects)
        {
            shiftIndex.Add(new JSONData(obj.index));
        }
        shiftTriggerNode.Add("Index", shiftIndex);
        shiftTriggerNode.Add("Direction", new JSONData(shiftTrigger.direction));
        result.Add("ShiftCrystalTrigger", shiftTriggerNode);
        return(result);
    }