Beispiel #1
0
        private void ApplyMask()
        {
            //Set predefined maskee mats for UI and sprites (Shaders 2D sprite)
            //Set cloned maskee mats for mesh renderer (Shaders 3D)

            Mask maskTarget = (Mask)target;

            maskTarget.ScheduleFullMaskRefresh();

            if ((MaskedSpriteShader == null) || (MaskedUnlitShader == null))
            {
                Debug.Log("Shaders necessary for masking don't seem to be present in the project.");
                return;
            }



            List <Renderer> maskeeRenderers = new List <Renderer>();

            maskTarget.transform.parent.gameObject.GetComponentsInChildren(true, maskeeRenderers);
            Renderer excludedRenderer = maskTarget.transform.parent.GetComponent <Renderer>();

            if (excludedRenderer != null)
            {
                maskeeRenderers.Remove(excludedRenderer);
            }

            List <Graphic> maskeeGraphics = new List <Graphic>();

            maskTarget.transform.parent.gameObject.GetComponentsInChildren(true, maskeeGraphics);
            Graphic excludedGraphic = maskTarget.transform.parent.GetComponent <Graphic>();

            if (excludedGraphic != null)
            {
                maskeeGraphics.Remove(excludedGraphic);
            }


            //Mask materials that already exist within this masks hierarchy
            List <Material> reusableMaterials = GetAllReusableMaterials(maskeeRenderers);

            //Twin lists
            List <Material> originalMaterials = new List <Material>();
            List <Material> newMaterials      = new List <Material>();

            //Non-ui material loop
            foreach (Renderer mRenderer in maskeeRenderers)
            {
                //Don't mask the mask itself
                if (mRenderer.gameObject == maskTarget.gameObject)
                {
                    continue;
                }

                if (mRenderer is SpriteRenderer)
                {
                    ApplyMaskToSpriteRenderer((SpriteRenderer)mRenderer, maskTarget);
                }
                else
                {
                    ApplyMaskToGenericRenderer(mRenderer, maskTarget, originalMaterials, newMaterials, reusableMaterials);
                }
            }

            //UI material loop
            foreach (Graphic mGraphic in maskeeGraphics)
            {
                //Don't mask the mask itself
                if (mGraphic.gameObject == maskTarget.gameObject)
                {
                    continue;
                }

                ApplyMaskToUIElement(mGraphic, maskTarget);
            }
            Debug.Log("Mask applied." + (maskTarget.IsMaskingEnabled ? "" : " Have in mind that masking is disabled, so you will not see the effect, until you enable masking!"));
        }