private DynamicTalentLinkUI CreateLinkBetweenNodes(DynamicTalentUI parent, DynamicTalentUI destination,
                                                           TalentLink link)
        {
            var parentPos      = parent.transform.position;
            var destinationPos = destination.transform.position;

            var linkClone = Instantiate(dynamicLinkUIPrefab, Vector3.zero, Quaternion.identity);

            var linkTransf = (RectTransform)linkClone.transform;

            linkTransf.SetParent(linksContainer);
            linkTransf.localPosition = Vector3.zero;

            createdLinkUIs.Add(linkClone);

            var linkPartsParent = linkTransf.GetChild(0);

            linkPartsParent.localPosition = Vector3.zero;

            var parts = CreateLinkParts(parent, destination, linkPartsParent);

            linkClone.Init(destination, link, parts);

            return(linkClone);
        }
        public void Init(DynamicTalentUI destination, TalentLink talentLink, List <DynamicTalentLinkPartUI> parts)
        {
            this.destination = destination;
            this.parts       = parts;

            weightRequiredInBase = talentLink.WeightRequiredInBase;

            InitLinkUIParts();
        }
        private List <DynamicTalentLinkUI> CreateSubtree(int index, Talent parentTalent, Talent nodeToCreate,
                                                         DynamicTalentUI parentUi, TalentLink linkToParent, int depth = 1)
        {
            var linkList = new List <DynamicTalentLinkUI>();

            if (nodeToCreate == null)
            {
                return(linkList);
            }

            var thisNodesLinks = new List <DynamicTalentLinkUI>();

            var parentPos = parentUi.transform.position;
            var signedInd = parentTalent.Links.Count / 2 - index;

            var thisNodeUi = CreateNodeUI(nodeToCreate, new Vector3(
                                              parentPos.x + signedInd * xDistanceFromNode
                                              , treeRootPosition.y - yDistanceFromNode * depth, 0f));

            createdTalentUIs.Add(thisNodeUi);

            var linkToParentUi = CreateLinkBetweenNodes(parentUi, thisNodeUi, linkToParent);

            linkList.Add(linkToParentUi);

            for (var i = 0; i < nodeToCreate.Links.Count; i++)
            {
                var link = nodeToCreate.Links[i];

                thisNodesLinks.AddRange(CreateSubtree(i, nodeToCreate, link.Destination,
                                                      thisNodeUi, link, depth + 1));
            }

            thisNodeUi.Init(nodeToCreate, thisNodesLinks);

            return(linkList);
        }