// @Bug this is being called twice for lower levels, // because GetChildren(), etc. don't just look one level deep. // change to an array or another method of getting the children // to prevent this. public void SpawnBordersAndSymbols(int depth = 0) { if (Argument is Expression || depth < 2) { gameObject.layer = LayerMask.NameToLayer("Default"); if (Argument is Expression) { GameObject symbol = Instantiate(Resources.Load <GameObject>("Prefabs/Symbol"), gameObject.transform.position + new Vector3(0, 0.5f * (Height - 1), 0), gameObject.transform.rotation); symbol.transform.localScale = Vector3.Scale(symbol.transform.localScale, new Vector3(1 - (2 * BorderRatio), 1 - (2 * BorderRatio), 1)); symbol.transform.parent = gameObject.transform; symbol.layer = LayerMask.NameToLayer("Pre-render Expression"); var head = ((Expression)Argument).Head; var nameString = head is Name ? ((Name)head).ID : ""; Texture2D symbolTexture = Resources.Load <Texture2D>("Textures/Symbols/" + nameString); symbol.GetComponent <Renderer>().material.SetTexture("_MainTex", symbolTexture); } var fillType = Argument.Type; GameObject borderPrefab = Resources.Load("Prefabs/Border") as GameObject; GameObject westBorder = Instantiate(borderPrefab, gameObject.transform.position, gameObject.transform.rotation); GameObject eastBorder = Instantiate(borderPrefab, gameObject.transform.position, gameObject.transform.rotation); GameObject northBorder = Instantiate(borderPrefab, gameObject.transform.position, gameObject.transform.rotation); GameObject southBorder = Instantiate(borderPrefab, gameObject.transform.position, gameObject.transform.rotation); westBorder.transform.localScale = Vector3.Scale(westBorder.transform.localScale, new Vector3(BorderRatio, Height, 1)); eastBorder.transform.localScale = Vector3.Scale(eastBorder.transform.localScale, new Vector3(BorderRatio, Height, 1)); northBorder.transform.localScale = Vector3.Scale(northBorder.transform.localScale, new Vector3(Width, BorderRatio, 1)); southBorder.transform.localScale = Vector3.Scale(southBorder.transform.localScale, new Vector3(Width, BorderRatio, 1)); westBorder.transform.position += new Vector3(0.5f * (-Width + BorderRatio), 0, 0); eastBorder.transform.position += new Vector3(0.5f * (Width - BorderRatio), 0, 0); northBorder.transform.position += new Vector3(0, 0.5f * (Height - BorderRatio), 0); southBorder.transform.position += new Vector3(0, 0.5f * (-Height + BorderRatio), 0); westBorder.transform.SetParent(this.gameObject.transform); eastBorder.transform.SetParent(this.gameObject.transform); northBorder.transform.SetParent(this.gameObject.transform); southBorder.transform.SetParent(this.gameObject.transform); westBorder.layer = LayerMask.NameToLayer("Pre-render Expression"); eastBorder.layer = LayerMask.NameToLayer("Pre-render Expression"); northBorder.layer = LayerMask.NameToLayer("Pre-render Expression"); southBorder.layer = LayerMask.NameToLayer("Pre-render Expression"); westBorder.GetComponent <Renderer>().material.SetColor("_Color", ColorsByType[fillType]); eastBorder.GetComponent <Renderer>().material.SetColor("_Color", ColorsByType[fillType]); northBorder.GetComponent <Renderer>().material.SetColor("_Color", ColorsByType[fillType]); southBorder.GetComponent <Renderer>().material.SetColor("_Color", ColorsByType[fillType]); foreach (Transform childArgumentContainer in gameObject.transform) { ArgumentContainer childArgumentContainerScript = childArgumentContainer.gameObject.GetComponent <ArgumentContainer>(); if (childArgumentContainerScript != null) { childArgumentContainerScript.SpawnBordersAndSymbols(depth + 1); } } } }