예제 #1
0
    // @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);
                }
            }
        }
    }