private void PopulateGraph() { var loadFromCache = _nodePositionCache.ValidateCache(_target.GetAllBehaviourNodes() .Select(behaviour => behaviour.Guid)); ClearGraph(); var actionBehaviourNodes = _target.GetActionBehaviourNodes().ToArray(); var stepX = Mathf.Max(100, position.width / actionBehaviourNodes.Length); var nodePosition = new Vector2(stepX / 2, position.height - 100); foreach (var actionBehaviourNode in actionBehaviourNodes) { if (loadFromCache) { nodePosition = _nodePositionCache.GetCachedPosition(actionBehaviourNode.Guid); } CreateNode(nodePosition, actionBehaviourNode); nodePosition.x += stepX; } var compoundBehaviourNodes = _target.GetCompoundBehaviourNodes().ToArray(); stepX = Mathf.Max(100, position.width / compoundBehaviourNodes.Length); nodePosition = new Vector2(stepX / 2, nodePosition.y - 100); foreach (var compoundBehaviourNode in compoundBehaviourNodes) { if (loadFromCache) { nodePosition = _nodePositionCache.GetCachedPosition(compoundBehaviourNode.Guid); } CreateCompoundNode(nodePosition, compoundBehaviourNode); nodePosition.x += stepX; } foreach (var compoundBehaviourNode in compoundBehaviourNodes) { var topNode = (CompoundNode)_nodes[compoundBehaviourNode.Guid]; foreach (var childNodeGuid in compoundBehaviourNode.GetChildNodes()) { topNode.AddOutConnectionPoint(); if (!loadFromCache) { var bottomNode = _nodes[childNodeGuid]; if (bottomNode is CompoundNode) { topNode.Rect.y = Mathf.Min(bottomNode.Rect.y - 100, topNode.Rect.y); UpdateCacheNodePosition(topNode); } } } } Repaint(); }