public CollectionNodeDynamic(CollectionNode node) { transform = node.transform; Name = node.Name; Offset = node.Offset; Radius = node.Radius; localPositionOnStartup = transform.localPosition; localEulerAnglesOnStartup = transform.localEulerAngles; }
/// <summary> /// Update the facing of a node given the nodes new position for facing orign with node and orientation type /// </summary> /// <param name="node"></param> /// <param name="orientType"></param> /// <param name="newPos"></param> private void UpdateNodeFacing(CollectionNode node, OrientTypeEnum orientType, Vector3 newPos = default(Vector3)) { Vector3 centerAxis; Vector3 pointOnAxisNearestNode; switch (OrientType) { case OrientTypeEnum.FaceOrigin: node.transform.rotation = Quaternion.LookRotation(node.transform.position - transform.position, transform.up); break; case OrientTypeEnum.FaceOriginReversed: node.transform.rotation = Quaternion.LookRotation(transform.position - node.transform.position, transform.up); break; case OrientTypeEnum.FaceCenterAxis: centerAxis = Vector3.Project(node.transform.position - transform.position, transform.up); pointOnAxisNearestNode = transform.position + centerAxis; node.transform.rotation = Quaternion.LookRotation(node.transform.position - pointOnAxisNearestNode, transform.up); break; case OrientTypeEnum.FaceCenterAxisReversed: centerAxis = Vector3.Project(node.transform.position - transform.position, transform.up); pointOnAxisNearestNode = transform.position + centerAxis; node.transform.rotation = Quaternion.LookRotation(pointOnAxisNearestNode - node.transform.position, transform.up); break; case OrientTypeEnum.FaceFoward: node.transform.forward = transform.rotation * Vector3.forward; break; case OrientTypeEnum.FaceForwardReversed: node.transform.forward = transform.rotation * Vector3.back; break; case OrientTypeEnum.FaceParentUp: node.transform.forward = transform.rotation * Vector3.up; break; case OrientTypeEnum.FaceParentDown: node.transform.forward = transform.rotation * Vector3.down; break; case OrientTypeEnum.None: break; default: throw new ArgumentOutOfRangeException(); } }
/// <summary> /// Update the facing of a node given the nodes new position for facing orign with node and orientation type /// </summary> /// <param name="node"></param> /// <param name="orientType"></param> /// <param name="newPos"></param> private void UpdateNodeFacing(CollectionNode node, Vector3 newPos = default(Vector3)) { node.transform.forward = transform.rotation * Vector3.forward; }
/// <summary> /// Update collection is called from the editor button on the inspector. /// This function rebuilds / updates the layout. /// </summary> public void UpdateCollection() { // Check for empty nodes and remove them List <CollectionNode> emptyNodes = new List <CollectionNode>(); for (int i = 0; i < NodeList.Count; i++) { if (NodeList[i].transform == null || (IgnoreInactiveTransforms && !NodeList[i].transform.gameObject.activeSelf) || NodeList[i].transform.parent == null || !(NodeList[i].transform.parent.gameObject == gameObject)) { emptyNodes.Add(NodeList[i]); } } // Now delete the empty nodes for (int i = 0; i < emptyNodes.Count; i++) { NodeList.Remove(emptyNodes[i]); } emptyNodes.Clear(); // Check when children change and adjust for (int i = 0; i < transform.childCount; i++) { Transform child = transform.GetChild(i); if (!ContainsNode(child) && (child.gameObject.activeSelf || !IgnoreInactiveTransforms)) { CollectionNode node = new CollectionNode(); node.Name = child.name; node.transform = child; NodeList.Add(node); } } switch (SortType) { case SortTypeEnum.None: break; case SortTypeEnum.Transform: NodeList.Sort(delegate(CollectionNode c1, CollectionNode c2) { return(c1.transform.GetSiblingIndex().CompareTo(c2.transform.GetSiblingIndex())); }); break; case SortTypeEnum.Alphabetical: NodeList.Sort(delegate(CollectionNode c1, CollectionNode c2) { return(c1.Name.CompareTo(c2.Name)); }); break; case SortTypeEnum.AlphabeticalReversed: NodeList.Sort(delegate(CollectionNode c1, CollectionNode c2) { return(c1.Name.CompareTo(c2.Name)); }); NodeList.Reverse(); break; case SortTypeEnum.TransformReversed: NodeList.Sort(delegate(CollectionNode c1, CollectionNode c2) { return(c1.transform.GetSiblingIndex().CompareTo(c2.transform.GetSiblingIndex())); }); NodeList.Reverse(); break; } _columns = Mathf.CeilToInt((float)NodeList.Count / Rows); Width = _columns * CellWidth; Height = Rows * CellHeight; _halfCell = new Vector2(CellWidth * 0.5f, CellHeight * 0.5f); _circumference = 2f * Mathf.PI * Radius; _radialCellAngle = RadialRange / _columns; LayoutChildren(); if (OnCollectionUpdated != null) { OnCollectionUpdated.Invoke(this); } }
/// <summary> /// Update collection is called from the editor button on the inspector. /// This function rebuilds / updates the layout. /// </summary> public void UpdateCollection() { // Check for empty nodes and remove them List <CollectionNode> emptyNodes = new List <CollectionNode>(); for (int i = 0; i < NodeList.Count; i++) { if (NodeList[i].transform == null || (IgnoreInactiveTransforms && !NodeList[i].transform.gameObject.activeSelf) || NodeList[i].transform.parent == null || !(NodeList[i].transform.parent.gameObject == this.gameObject)) { emptyNodes.Add(NodeList[i]); } } // Now delete the empty nodes for (int i = 0; i < emptyNodes.Count; i++) { //Debug.Log("+++++ We removed : " + emptyNodes[i].Name); Debug.Log("I will remove: " + emptyNodes[i].Name); NodeList.Remove(emptyNodes[i]); //Debug.Log("+++++ Kinder: " + this.transform.childCount); //Destroy(emptyNodes[i].transform.gameObject); } emptyNodes.Clear(); // Check when children change and adjust for (int i = 0; i < this.transform.childCount; i++) { Transform child = this.transform.GetChild(i); if (!ContainsNode(child) && (child.gameObject.activeSelf || !IgnoreInactiveTransforms)) { CollectionNode node = new CollectionNode(); node.Name = child.name; node.transform = child; NodeList.Add(node); } } switch (SortType) { case SortTypeEnum.None: break; case SortTypeEnum.Transform: NodeList.Sort(delegate(CollectionNode c1, CollectionNode c2) { return(c1.transform.GetSiblingIndex().CompareTo(c2.transform.GetSiblingIndex())); }); break; case SortTypeEnum.Alphabetical: NodeList.Sort(delegate(CollectionNode c1, CollectionNode c2) { return(c1.Name.CompareTo(c2.Name)); }); break; case SortTypeEnum.AlphabeticalReversed: NodeList.Sort(delegate(CollectionNode c1, CollectionNode c2) { return(c1.Name.CompareTo(c2.Name)); }); NodeList.Reverse(); break; case SortTypeEnum.TransformReversed: NodeList.Sort(delegate(CollectionNode c1, CollectionNode c2) { return(c1.transform.GetSiblingIndex().CompareTo(c2.transform.GetSiblingIndex())); }); NodeList.Reverse(); break; case SortTypeEnum.EmptyNodelast: NodeList.Sort(delegate(CollectionNode c1, CollectionNode c2) { //return c1.Name.CompareTo("emptyGameObjectNode"); if (c2.Name == "emptyNode") { return(-1); } else { return(1); } }); break; } _columns = Columns; _halfCell = new Vector2(CellWidth * 0.5f, CellHeight * 0.5f); _circumference = 2f * Mathf.PI * Radius; _radialCellAngle = RadialRange / _columns; //updateRowsColums(); /* * Debug.Log("Die Daten:"); * Debug.Log("--Width: " + Width); * Debug.Log("--Height: " + Height); * Debug.Log("--CellWidth: " + CellWidth); * Debug.Log("--CellHeight: " + CellHeight); * Debug.Log("--NodeTransform: " + NodeList[0].transform.localScale.ToString()); * Debug.Log("--NodeTransform: " + NodeList[0].transform.position.ToString()); */ generateNodeGrid(); LayoutChildren(); if (OnCollectionUpdated != null) { OnCollectionUpdated.Invoke(this); } }