/// <summary> /// Generates the unity tree according to the given data structure of the node /// </summary> /// <param name="node"></param> /// <param name="position"></param> public GameObject GenerateTree(UiNode node, Vector2 position) { var treeHeight = node.GetHeight() + 1; var trunkHeight = manipulator.DefaultEdgeHeight * GetYScalingFactor(treeHeight); var trunkYScale = manipulator.DefaultEdgeScale.y * GetYScalingFactor(treeHeight); var trunkThickness = manipulator.DefaultEdgeScale.x * GetXScalingFactor(treeHeight); var nodePosition = new Vector3(0, trunkHeight, 0); var treeObject = manipulator.AddTreeObject(position); var trunkObject = manipulator.AddEmptyBranchObject(treeObject.transform); var edgeObject = manipulator.AddEdgeObject(trunkObject.transform, trunkYScale, 0, 0, trunkThickness); var nodeObject = manipulator.AddEmptyNodeObject(node, trunkObject.transform, nodePosition, edgeObject); GenerateBranches(node, nodeObject.transform); var disposable = node.Circle.Position.Subscribe(v => { treeObject.transform.localPosition = new Vector3(v.x, 0, v.y); }); treeObject.OnDestroyAsObservable().Subscribe(_ => disposable.Dispose()); return(treeObject); }