/// <summary> /// 开启角色的边缘光效果 /// </summary> /// <param name="state">true开启,false关闭</param> /// <param name="col">边缘光颜色</param> /// <param name="width">边缘光宽度,0最宽,角色全亮,10以上很窄</param> public void SetEdgeLit(bool state, Color col, float width) { if (SMR == null || SMR.Length < 1) { return; } foreach (var smr in SMR) { int matCount = smr.sharedMaterials.Length; for (int i = 0; i < matCount; i++) { smr.GetPropertyBlock(MPB, i); if (state) { MPB.SetInt(edgeLightId, 1); MPB.SetFloat(edgeColorWidthId, width); MPB.SetColor(edgeColorId, col); } else { MPB.SetInt(edgeLightId, 0); } smr.SetPropertyBlock(MPB, i); } } }
private void SetPosClipValue(int isOn, float zPos, Color color) { if (SMR == null || SMR.Length < 1) { return; } Matrix4x4 localSpace = transform.worldToLocalMatrix; foreach (var r in SMR) { for (int i = 0; i < r.sharedMesh.subMeshCount; i++) { r.GetPropertyBlock(MPB, i); MPB.SetMatrix(localSpaceProp, localSpace); MPB.SetInt(_UsePosClipProp, isOn); MPB.SetFloat(_PosMaskZProp, zPos); MPB.SetColor(_PosMaskEdgeColorProp, color); r.SetPropertyBlock(MPB, i); } } }
public void SetAlpha(float alpha, bool trackValue = true) { if (!ShaderProperties) { return; } if (FadeMode == Modes.SeparateMaterials) { if (!OpaqueMaterial || !TransparentMaterial) { return; } //set opaque or transparent material Material m = Mathf.Approximately(alpha, 1) ? OpaqueMaterial : TransparentMaterial; if (CurrentMaterial != m) { SetMaterial(m); CurrentMaterial = m; } } for (int i = 0; i < Renderers.Length; i++) { //for each renderer: Renderer r = Renderers[i]; //just skip null/missing renderers for now - not sure how to keep the list up to date in every situation yet if (!r) { continue; } //turn renderer on or off if (Mathf.Approximately(alpha, 0f)) { if (r.enabled) { r.enabled = false; } } else if (!r.enabled) { r.enabled = true; } //initialize property block with default material values ShaderProperties.SetProperties(MPB, r.sharedMaterial, clear: true); //add per-renderer colors back in PerRendererColor prc = r.GetComponent <PerRendererColor>(); if (prc && prc.enabled) { MPB.SetColor(prc.ColorName, prc.Color); } //scale alpha based on min/max alpha float scaledAlpha = Mathf.Lerp(MinAlpha, MaxAlpha, alpha); //set alpha value of all colors ShaderProperties.SetAlpha(MPB, scaledAlpha); //apply property block r.SetPropertyBlock(MPB); } if (trackValue) { CurrentValue = alpha; } }