private void SetupTower(Tower tower)
 {
     if (shadow)
     {
         Destroy(shadow.gameObject);
     }
     shadow = Instantiate(tower);
     shadow.GetComponentsInChildren <Behaviour>().ForEach(b => b.enabled = false);
     shadow.GetComponentsInChildren <Collider>().ForEach(Destroy);
     shadow.GetComponentsInChildren <Renderer>()
     .SelectMany(r => r.materials)
     .ForEach(m =>
     {
         m.SetupMaterialWithBlendMode(MaterialExtensions.Mode.Transparent);
     });
     shadow.transform.SetParent(transform);
     shadow.transform.localPosition = Vector3.zero;
 }
        private void Update()
        {
            var placementRay = Camera.main.ScreenPointToRay(Input.mousePosition);

            var point = placementRay.Intersect();

            if (point.HasValue == false)
            {
                return;
            }

            transform.position = point.Value.Snap(.5f, offset: .25f);

            var groundRay  = new Ray(transform.position + Vector3.up, Vector3.down);
            var raycastHit = groundRay.RaycastHit();

            if (raycastHit.HasValue == false)
            {
                return;
            }

            var hitObject = raycastHit.Value.transform.gameObject;

            transform.position = transform.position.SetY(raycastHit.Value.point.y);

            Valid = hitObject.layer == LayerMask.NameToLayer("Ground");

            shadow.GetComponentsInChildren <Renderer>()
            .SelectMany(r => r.materials)
            .ForEach(m =>
            {
                var color = m.color;
                if (wasValid != null)
                {
                    color = wasValid.Value
                            ? new Color(color.r, color.g - .5f, color.b, .3f)
                            : new Color(color.r - .5f, color.g, color.b, .3f);
                }
                m.color = Valid
                        ? new Color(color.r, color.g + .5f, color.b, .3f)
                        : new Color(color.r + .5f, color.g, color.b, .3f);
            });

            wasValid = Valid;
        }