/// <summary>
    /// Create image object
    /// </summary>
    /// <param name="treeNode"></param>
    /// <param name="parent"></param>
    /// <param name="canvas"></param>
    /// <returns></returns>
    private bool CreateImage(GTTreeNode treeNode, GTUIWidget parent, GTUICanvas canvas)
    {
        if (treeNode == null || parent == null || null == canvas)
            return false;

        string name = (treeNode.AsString() != string.Empty) ? treeNode.AsString() : "_UIImageNoName";
        GTTreeNode nodePosition = treeNode.GetChild(TagPosition);
        GTTreeNode nodeSize = treeNode.GetChild(TagSize);
        GTTreeNode nodePieceEnabled = treeNode.GetChild(TagPieceEnabled);
        GTTreeNode nodeEventType = treeNode.GetChild(TagEventType);
        GTTreeNode nodeVisible = treeNode.GetChild(TagVisible);
        GTTreeNode nodeAnchorPoint = treeNode.GetChild(TagAnchorPoint);
        GTTreeNode nodeColor = treeNode.GetChild(TagColor);
        GTTreeNode nodeChildren = treeNode.GetChild(TagChildren);

        Vector3 position = (nodePosition != null) ? nodePosition.AsVector3() : new Vector3(0.0f, 0.0f, 0.0f);
        Vector2 size = (nodeSize != null) ? nodeSize.AsVector2() : new Vector2(0.0f, 0.0f);
        string pieceName = (nodePieceEnabled != null) ? nodePieceEnabled.AsString() : "_noPieceName";
        Vector2 anchor = (nodeAnchorPoint != null) ? nodeAnchorPoint.AsVector2() : new Vector2(0.0f, 0.0f);
        Vector3 vColor = (nodeColor != null) ? nodeColor.AsVector3() : new Vector3(255.0f, 255.0f, 255.0f);
        Color color = new Color(vColor.x / 255.0f, vColor.y / 255.0f, vColor.z / 255.0f);

        GTUIImage image = GTUIImage.Create(name, position, size, parent.mGameObject);
        if (image == null)
        {
            Debug.LogError("CreateImage: Failed to create an image object: " + name);
            return false;
        }
        image.color = color;
        // Sprite
        Sprite sprite = canvas.mSkin.mFrameSet[pieceName];
        if (sprite != null)
            image.sprite = canvas.mSkin.mFrameSet[pieceName];
        else
            Debug.LogWarning("CreateImage: No piece sprite found: " + pieceName);

        // Children
        CreateChildren(nodeChildren, image, canvas);

        return true;
    }
    /// <summary>
    /// Create button object
    /// </summary>
    /// <param name="treeNode"></param>
    /// <param name="parent"></param>
    /// <param name="canvas"></param>
    /// <returns></returns>
    private bool CreateButton(GTTreeNode treeNode, GTUIWidget parent, GTUICanvas canvas)
    {
        if (treeNode == null || parent == null || null == canvas)
            return false;

        string name = (treeNode.AsString() != string.Empty) ? treeNode.AsString() : "_UIButtonNoName";
        GTTreeNode nodePosition = treeNode.GetChild(TagPosition);
        GTTreeNode nodeSize = treeNode.GetChild(TagSize);
        GTTreeNode nodePieceEnabled = treeNode.GetChild(TagPieceEnabled);
        GTTreeNode nodeEventType = treeNode.GetChild(TagEventType);
        GTTreeNode nodeVisible = treeNode.GetChild(TagVisible);
        GTTreeNode nodeAnchorPoint = treeNode.GetChild(TagAnchorPoint);
        GTTreeNode nodeColor = treeNode.GetChild(TagColor);
        GTTreeNode nodeChildren = treeNode.GetChild(TagChildren);
        GTTreeNode nodeText = treeNode.GetChild(TagText);
        GTTreeNode nodeFont = treeNode.GetChild(TagFont);
        GTTreeNode nodeFontSize = treeNode.GetChild(TagFontSize);

        Vector3 position = (nodePosition != null) ? nodePosition.AsVector3() : new Vector3(0.0f, 0.0f, 0.0f);
        Vector2 size = (nodeSize != null) ? nodeSize.AsVector2() : new Vector2(0.0f, 0.0f);
        string pieceName = (nodePieceEnabled != null) ? nodePieceEnabled.AsString() : "_noPieceName";
        Vector2 anchor = (nodeAnchorPoint != null) ? nodeAnchorPoint.AsVector2() : new Vector2(0.0f, 0.0f);
        Vector3 vColor = (nodeColor != null) ? nodeColor.AsVector3() : new Vector3(255.0f, 255.0f, 255.0f);
        Color color = new Color(vColor.x / 255.0f, vColor.y / 255.0f, vColor.z / 255.0f);
        string text = (nodeText != null) ? nodeText.AsString() : "Button";
        string fontName = (nodeFont != null) ? nodeFont.AsString() : "BabelSans";
        int fontSize = (nodeFontSize != null) ? nodeFontSize.AsInt() : 16;
                
        GTUIButton button = GTUIButton.Create(name, position, size, parent.mGameObject);
        if (button == null)
        {
            Debug.LogError("CreateButton: Failed to create a button object: " + name);
            return false;
        }
        button.color = color;
        button.text = text;
        button.mText.textFont = GTUIManager.Instance.GetFont(fontName);
        button.mText.fontSize = fontSize;
        // Sprite
        Sprite sprite = canvas.mSkin.mFrameSet[pieceName];
        if (sprite != null)
            button.sprite = canvas.mSkin.mFrameSet[pieceName];
        else
            Debug.LogWarning("CreateButton: No piece sprite found: " + pieceName);
        //btn1.clickEvent.AddListener(OnBtnClick);

        // Children
        CreateChildren(nodeChildren, button, canvas);

        return true;
    }
    private bool CreateChildren(GTTreeNode treeNode, GTUIWidget parent, GTUICanvas canvas)
    {
        if (treeNode == null)
            return false;

        for (int child = 0; child < treeNode.childCount; child++)
        {
            GTTreeNode childNode = treeNode.GetChild(child);
            if (childNode == null)
                continue;

            switch (childNode.tag)
            {
                case TagUIImage:
                    CreateImage(childNode, parent, canvas);
                    break;

                case TagUIButton:
                    CreateButton(childNode, parent, canvas);
                    break;
            }
        }

        return true;
    }