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; } } }
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(); }