Пример #1
0
 public void SetSpriteMaterial()
 {
     //Get reference to global ProtoShape2DSettings object if it's not set yet
     if (globals == null)
     {
         globals = (ProtoShape2DGlobals)Resources.Load("ProtoShape2DGlobals");
     }
     //Based on selected mask option, assign correct sprite material using reference to material from globals object
     //If it doesn't exist, we create it
     if (selectedMaskOption == 0)
     {
         if (globals.colorMaterialNoStencil == null)
         {
             //Debug.Log("Creating new "+globals.colorMaterialNoStencil.name);
             globals.colorMaterialNoStencil = new Material(Shader.Find("ProtoShape2D/Color"));
             globals.colorMaterialNoStencil.SetFloat("_StencilComp", (int)UnityEngine.Rendering.CompareFunction.Disabled);
             globals.colorMaterialNoStencil.name = "PS2DColor";
         }
         if (mr.sharedMaterial == null || !mr.sharedMaterial.Equals(globals.colorMaterialNoStencil))
         {
             //Debug.Log("Setting material "+globals.colorMaterialNoStencil.name);
             mr.sharedMaterial = globals.colorMaterialNoStencil;
         }
     }
     else if (selectedMaskOption == 1)
     {
         if (globals.colorMaterialStencilEqual == null)
         {
             //Debug.Log("Creating new "+globals.colorMaterialStencilEqual.name);
             globals.colorMaterialStencilEqual = new Material(Shader.Find("ProtoShape2D/Color"));
             globals.colorMaterialStencilEqual.SetFloat("_StencilComp", (int)UnityEngine.Rendering.CompareFunction.Equal);
             globals.colorMaterialStencilEqual.name = "PS2DColorMaskInside";
         }
         if (mr.sharedMaterial == null || !mr.sharedMaterial.Equals(globals.colorMaterialStencilEqual))
         {
             //Debug.Log("Setting material "+globals.colorMaterialStencilEqual.name);
             mr.sharedMaterial = globals.colorMaterialStencilEqual;
         }
     }
     else if (selectedMaskOption == 2)
     {
         if (globals.colorMaterialStencilNotEqual == null)
         {
             //Debug.Log("Creating new "+globals.colorMaterialStencilNotEqual.name);
             globals.colorMaterialStencilNotEqual = new Material(Shader.Find("ProtoShape2D/Color"));
             globals.colorMaterialStencilNotEqual.SetFloat("_StencilComp", (int)UnityEngine.Rendering.CompareFunction.NotEqual);
             globals.colorMaterialStencilNotEqual.name = "PS2DColorMaskOutside";
         }
         if (mr.sharedMaterial == null || !mr.sharedMaterial.Equals(globals.colorMaterialStencilNotEqual))
         {
             //Debug.Log("Setting material "+globals.colorMaterialStencilNotEqual.name);
             mr.sharedMaterial = globals.colorMaterialStencilNotEqual;
         }
     }
 }
Пример #2
0
    private void Awake()
    {
        //Get all components if needed
        if (mr == null)
        {
            mr = GetComponent <MeshRenderer>();
        }
        if (mf == null)
        {
            mf = GetComponent <MeshFilter>();
        }
        if (col == null)
        {
            col = GetComponent <Collider2D>();
        }
        if (mcol == null)
        {
            mcol = GetComponent <MeshCollider>();
        }
        //Get reference to global ProtoShape2DSettings object if it's not set yet
        if (globals == null)
        {
            globals = (ProtoShape2DGlobals)Resources.Load("ProtoShape2DGlobals");
        }
        //If it's a new object, we define a unique name and set up renderer settings and material
        if (uniqueName == "")
        {
            uniqueName              = Random.Range(1000, 999999).ToString();
            mr.shadowCastingMode    = UnityEngine.Rendering.ShadowCastingMode.Off;
            mr.receiveShadows       = false;
            mr.lightProbeUsage      = UnityEngine.Rendering.LightProbeUsage.Off;
            mr.reflectionProbeUsage = UnityEngine.Rendering.ReflectionProbeUsage.Off;
            SetSpriteMaterial();
            //It already has unique name, but is it really unique?
            //Happens when you clone an object or instantiate a prefab
        }
        else
        {
            ProtoShape2D[] arr = GameObject.FindObjectsOfType <ProtoShape2D>();
            for (int i = 0; i < arr.Length; i++)
            {
                if (arr[i].uniqueName == uniqueName)
                {
                    uniqueName = Random.Range(1000, 999999).ToString();
                    if (fillType == PS2DFillType.Color || fillType == PS2DFillType.None)
                    {
                        SetSpriteMaterial();
                    }
                    else if (fillType == PS2DFillType.CustomMaterial)
                    {
                        SetCustomMaterial();
                    }
                    else
                    {
                        //Since it's a copy of an object, we unset the references to original object's materials
                        this.defaultMaterial = null;
                        mr.sharedMaterial    = null;
                        //This will create the new default material instead of using material of the original object
                        SetDefaultMaterial();
                    }
                }
            }
        }
        Mesh mesh = new Mesh {
            name = uniqueName
        };

        mf.sharedMesh = mesh;
        lastPos       = transform.position;
        UpdateMaterialSettings();
        UpdateMesh();
    }