private bool PrepareAsset(PsdNode node)
    {
        TextureImporter importer = AssetImporter.GetAtPath(node.AssetPath(baseAssetPath)) as TextureImporter;

        if (!importer)
        {
            EditorUtility.DisplayDialog(
                "Error",
                "Failed loading asset at \n" + node.AssetPath(baseAssetPath) + "\n"
                + "Make sure you selected the right \"Assets Folder\" generated by " + Psd2Unity.NAME + ".",
                "OK"
                );
            return(false);
        }

        importer.textureType         = TextureImporterType.Sprite;
        importer.spritePixelsToUnits = (float)setting["pixelsToUnits"];

        TextureImporterSettings settings = new TextureImporterSettings();

        importer.ReadTextureSettings(settings);
        settings.spriteAlignment = (int)setting["pivot"];
        importer.SetTextureSettings(settings);

        AssetDatabase.ImportAsset(node.AssetPath(baseAssetPath));

        return(true);
    }
    private int ProcessNodeRecursively(PsdNode node, int sort, GameObject parentObject)
    {
        if (node.fileName != null)
        {
            if (!PrepareAsset(node))
            {
                return(sort);
            }

            GameObject childObject = CreateGameObject(node, sort);
            childObject.transform.parent = parentObject.transform;

            sort++;
        }

        else if (node.children.Count > 0)
        {
            if (sort != 0 && (bool)setting["nestLayers"])
            {
                GameObject childObject = new GameObject();
                childObject.name             = node.name;
                childObject.transform.parent = parentObject.transform;

                parentObject = childObject;
            }

            while (node.children.Count > 0)
            {
                sort = ProcessNodeRecursively(node.children.Pop(), sort, parentObject);
            }
        }

        return(sort);
    }
Exemple #3
0
    static void Compose()
    {
        if (!structureObject)
        {
            EditorUtility.DisplayDialog(
                "Warning",
                "Please select a structure file generated by " + NAME + " to continue.",
                "OK"
                );
            return;
        }
        if (!baseAssetObject)
        {
            EditorUtility.DisplayDialog(
                "Warning",
                "Please select assets folder generated by " + NAME + " to continue.",
                "OK"
                );
            return;
        }

        baseAssetPath = AssetDatabase.GetAssetPath(baseAssetObject);

        string  dataPath          = Application.dataPath;
        string  structurePath     = AssetDatabase.GetAssetPath(structureObject);
        string  structureFilePath = dataPath.Substring(0, dataPath.Length - 6) + structurePath;
        PsdNode structure         = ReadStructure(structureFilePath);

        string rootName = Regex.Replace(structurePath, "^.*?([^/]+?)" + structureSuffix + "$", "$1");

        Unity2DProcessor processor = new Unity2DProcessor(baseAssetPath, setting);

        processor.process(structure, rootName);
    }
    public void process(PsdNode structure, string rootName)
    {
        GameObject root = new GameObject();

        root.name = rootName;

        ProcessNodeRecursively(structure, 0, root);
    }
    private GameObject CreateGameObject(PsdNode ele, int sort)
    {
        Sprite sprite = AssetDatabase.LoadAssetAtPath(ele.AssetPath(baseAssetPath), typeof(Sprite)) as Sprite;

        GameObject gameObject = new GameObject();

        gameObject.name = ele.name;

        SpriteRenderer renderer = gameObject.AddComponent <SpriteRenderer>();

        renderer.sprite = sprite;

        if ((bool)setting["useOrderInLayer"])
        {
            renderer.sortingOrder = sort;
        }
        renderer.sortingLayerName = (string)setting["sortingLayerName"];

        Vector2 position = new Vector2(ele.left, ele.top);

        switch ((int)setting["pivotIndex"])
        {
        case 0:
            position.x += ele.width / 2;
            position.y += ele.height / 2;
            break;

        case 1:
            break;

        case 2:
            position.x += ele.width / 2;
            break;

        case 3:
            position.x += ele.width;
            break;

        case 4:
            position.y += ele.height / 2;
            break;

        case 5:
            position.x += ele.width;
            position.y += ele.height / 2;
            break;

        case 6:
            position.y += ele.height;
            break;

        case 7:
            position.x += ele.width / 2;
            position.y += ele.height;
            break;

        case 8:
            position.x += ele.width;
            position.y += ele.height;
            break;
        }

        gameObject.transform.localPosition = new Vector3(
            position.x / (float)setting["pixelsToUnits"] * (float)setting["scale"],
            -position.y / (float)setting["pixelsToUnits"] * (float)setting["scale"],
            -sort * (float)setting["zMultiplier"]
            );

        gameObject.transform.localScale = new Vector3(
            (float)setting["scale"], (float)setting["scale"], (float)setting["scale"]
            );

        return(gameObject);
    }
Exemple #6
0
    private static PsdNode ReadStructure(string filePath)
    {
        PsdNode ret = new PsdNode();

        StreamReader fs = new StreamReader(filePath);
        string       line;

        List <PsdNode> parents = new List <PsdNode>();
        PsdNode        ele     = new PsdNode();

        while ((line = fs.ReadLine()) != null)
        {
            line = line.Trim();

            try {
                if (line == "{")
                {
                    parents.Add(ele);
                }
                else if (line == "}")
                {
                    parents.RemoveAt(parents.Count - 1);
                }
                else
                {
                    ele = new PsdNode();

                    string[] parts = line.Split('|');

                    ele.name = parts[0];

                    if (parts.Length > 1)
                    {
                        ele.fileName = parts[1];

                        string[] offset = parts[2].Split(',');
                        string[] size   = parts[3].Split(',');

                        ele.left   = float.Parse(offset[0]);
                        ele.top    = float.Parse(offset[1]);
                        ele.width  = float.Parse(size[0]);
                        ele.height = float.Parse(size[1]);
                    }

                    if (parents.Count > 0)
                    {
                        PsdNode parent = parents[parents.Count - 1];
                        parent.children.Push(ele);
                    }
                    else
                    {
                        ret.children.Push(ele);
                    }
                }
            }
            catch {
                EditorUtility.DisplayDialog(
                    "Error",
                    "Failed loading structure at \n" + filePath + "\n"
                    + "Make sure this is the right file generated by " + NAME + ".",
                    "OK"
                    );
                return(new PsdNode());
            }
        }

        fs.Close();

        return(ret);
    }