//格式:name:值0 value1 value2,持续时间,恢复时间 public void ShaderParam(AnimationEvent animEvent) { List <ShaderParamNameAndValue> shaderParamsCall = new List <ShaderParamNameAndValue>(); try { float loopTime = 0; float gobackTime = 0; Renderer[] renders = gameObject.GetComponentsInChildren <Renderer>(); if (renders.Length == 0) { return; } string[] shaderParams = animEvent.stringParameter.Split(new char[1] { ',' }); int startParamIndex = shaderParamsCall.Count; int segmentIndex = 0; foreach (string p in shaderParams) { string[] nameAndValue = p.Split(new char[1] { ':' }); if (nameAndValue.Length == 1) {//这个字段是持续时间 if (segmentIndex == 0) { loopTime = float.Parse(p); } else { gobackTime = float.Parse(p); segmentIndex = 0; } segmentIndex += 1; continue; } ShaderParamNameAndValue param = new ShaderParamNameAndValue(); param.m_name = nameAndValue[0]; string[] values = nameAndValue[1].Split(new char[1] { ' ' }); if (values.Length == 1) { param.m_valueFloat = float.Parse(values[0]); param.m_type = ENParamType.enFloat; foreach (Renderer r in renders) { if (r.sharedMaterial.HasProperty(param.m_name)) { Material sharedMaterial = BackupSharedMaterial(r); param.m_valueStartFloat = sharedMaterial.GetFloat(param.m_name); break; } } } else if (values.Length == 3) { Color c = Color.white; c.r = int.Parse(values[0]) / 255.0f; c.g = int.Parse(values[1]) / 255.0f; c.b = int.Parse(values[2]) / 255.0f; c.a = 1.0f; param.m_valueColor = c; param.m_type = ENParamType.enColor; foreach (Renderer r in renders) { if (r.sharedMaterial.HasProperty(param.m_name)) { Material sharedMaterial = BackupSharedMaterial(r); param.m_valueStartColor = sharedMaterial.GetColor(param.m_name); break; } } } else if (values.Length == 4) { Vector4 c; c.x = float.Parse(values[0]); c.y = float.Parse(values[1]); c.z = float.Parse(values[2]); c.w = float.Parse(values[3]); param.m_valueVec4 = c; param.m_type = ENParamType.enVector; foreach (Renderer r in renders) { if (r.sharedMaterial.HasProperty(param.m_name)) { Material sharedMaterial = BackupSharedMaterial(r); param.m_valueStartVec4 = sharedMaterial.GetVector(param.m_name); break; } } } shaderParamsCall.Add(param); } for (int i = startParamIndex; i < shaderParamsCall.Count; i++) { ShaderParamNameAndValue param = shaderParamsCall[i]; param.m_loopTime = loopTime; param.m_goTime = 0.0f; param.m_backTime = gobackTime; } StartCoroutine(Cor_ShaderParam(shaderParamsCall, m_testID++)); } catch (System.Exception) { Debug.LogError("ShaderParam error:" + animEvent.stringParameter); } }
IEnumerator Cor_ShaderParam(List <ShaderParamNameAndValue> shaderParams, int id) { List <Material> mats = new List <Material>(); Renderer[] renders = gameObject.GetComponentsInChildren <Renderer>(); foreach (Renderer r in renders) { mats.Add(r.material); } //float t = gotime; while (shaderParams.Count > 0) { for (int i = 0; i < shaderParams.Count;) { ShaderParamNameAndValue param = shaderParams[i]; param.m_goTime += Time.deltaTime; float s = param.m_goTime / param.m_loopTime; if (s > 1.0f || param.m_loopTime <= 0.000001f) { s = 1; if (param.m_isgoback) { shaderParams.RemoveAt(i); } else { //go back value param.m_isgoback = true; param.m_goTime = 0; param.m_loopTime = param.m_backTime; switch (param.m_type) { case ENParamType.enFloat: { float vbackup = param.m_valueStartFloat; param.m_valueStartFloat = param.m_valueFloat; param.m_valueFloat = vbackup; } break; case ENParamType.enColor: { Color vbackup = param.m_valueStartColor; param.m_valueStartColor = param.m_valueColor; param.m_valueColor = vbackup; } break; case ENParamType.enVector: { Vector4 vbackup = param.m_valueStartVec4; param.m_valueStartVec4 = param.m_valueVec4; param.m_valueVec4 = vbackup; } break; } } } else { i++; } float vfloat = 0; switch (param.m_type) { case ENParamType.enFloat: vfloat = param.m_valueStartFloat + s * (param.m_valueFloat - param.m_valueStartFloat); foreach (Material r in mats) { if (r.HasProperty(param.m_name)) { r.SetFloat(param.m_name, vfloat); } } break; case ENParamType.enColor: { Color v = param.m_valueStartColor + s * (param.m_valueColor - param.m_valueStartColor); foreach (Material r in mats) { if (r.HasProperty(param.m_name)) { r.SetColor(param.m_name, v); } } } break; case ENParamType.enVector: { Vector4 v = param.m_valueStartVec4 + s * (param.m_valueVec4 - param.m_valueStartVec4); foreach (Material r in mats) { if (r.HasProperty(param.m_name)) { r.SetVector(param.m_name, v); } } } break; } } yield return(1); } // foreach (Material r in mats) // { //DestroyImmediate(r); // } // foreach (Renderer r in renders) // { //r.material.CopyPropertiesFromMaterial(r.sharedMaterial); // } }