private void BakeRender_SkinnedMeshRender(List <SkinnedMeshRenderer> renderList, Water hostWater, MeshRenderer WaterRender, Collider WaterColliderBounds) { foreach (BoxCollider box in hostWater.WaterRefAeraList) { box.enabled = true; foreach (Renderer r in renderList) { if (r == WaterRender) { continue; } if (((1 << r.gameObject.layer) & hostWater.m_BakeCullMask.value) == 0 || r.gameObject.layer == 4 || !r.enabled || !r.gameObject.activeInHierarchy || r.gameObject.name.Contains("middle_terrain") /*不要中景*/) { continue; } BoxCollider bc = null; bc = r.GetComponent <BoxCollider>(); if (!bc) { bc = r.gameObject.AddComponent <BoxCollider>(); } if (bc.bounds.Intersects(box.bounds)) { //在水面之上 if (bc.bounds.max.y - WaterColliderBounds.bounds.min.y > hostWater.m_ClipPlaneOffset) { if (!renderCheck.Contains(r)) { Animator ana = r.GetComponentInParent <Animator>(); if (!ana) { Debug.LogWarning("SkinnedMeshRender上没有Animator,忽略:" + r.name); continue; } if (!ana.runtimeAnimatorController || !ana.avatar) { Debug.LogWarning("SkinnedMeshRender上的AnimatorController或者Avator为null,忽略:" + r.name); continue; } GameObject skinInstance = GameObject.Instantiate <GameObject>(ana.gameObject); if (!skinInstance) { continue; } Renderer [] smrs = skinInstance.GetComponentsInChildren <Renderer>(); if (smrs.Length > 1) { Debug.LogWarning(ana.gameObject.name + "有多个Render,水反射不支持多个Render"); GameObject.DestroyImmediate(skinInstance); continue; } Renderer InstanceRender = smrs[0]; if (InstanceRender) { skinInstance.gameObject.name = "WaterRefObj--" + r.gameObject.name; skinInstance.transform.SetParent(RefAreaRootObjTable[box].transform); skinInstance.transform.position = ana.transform.position; skinInstance.transform.rotation = ana.transform.rotation; skinInstance.transform.localScale = ana.transform.lossyScale; GameUtil.SetLayer(Water.WaterObjLayer, skinInstance, true); skinInstance.isStatic = false; InstanceRender.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off; InstanceRender.receiveShadows = false; InstanceRender.reflectionProbeUsage = UnityEngine.Rendering.ReflectionProbeUsage.Off; Collider col = InstanceRender.GetComponent <Collider>(); if (col) { GameObject.DestroyImmediate(col); } GameObject[] deleteArray = new GameObject[InstanceRender.transform.childCount]; for (int i = 0; i < InstanceRender.transform.childCount; i++) { deleteArray[i] = InstanceRender.transform.GetChild(i).gameObject; } for (int i = 0; i < deleteArray.Length; i++) { GameObject.DestroyImmediate(deleteArray[i]); } Water.WaterNode wn = new Water.WaterNode(); wn.render = r; wn.animator = skinInstance.GetComponent <Animator>(); wn.hostBoxCollider = box; hostWater.allWaterNode.Add(wn); hostWater.allVisibleRenderList.Add(InstanceRender); renderCheck.Add(r); } } } } GameObject.DestroyImmediate(bc); } box.enabled = false; } }
private void BakeRender_MeshRender(List <MeshRenderer> renderList, Water hostWater, MeshRenderer WaterRender, Collider WaterColliderBounds) { foreach (BoxCollider box in hostWater.WaterRefAeraList) { box.enabled = true; foreach (Renderer r in renderList) { if (r == WaterRender) { continue; } if (((1 << r.gameObject.layer) & hostWater.m_BakeCullMask.value) == 0 || r.gameObject.layer == 4 || !r.enabled || !r.gameObject.activeInHierarchy || r.gameObject.name.Contains("middle_terrain") /*不要中景*/) { continue; } BoxCollider bc = null; bc = r.GetComponent <BoxCollider>(); if (!bc) { bc = r.gameObject.AddComponent <BoxCollider>(); } if (bc.bounds.Intersects(box.bounds)) { //在水面之上 if (bc.bounds.max.y - WaterColliderBounds.bounds.min.y > hostWater.m_ClipPlaneOffset) { if (!renderCheck.Contains(r)) { Renderer InstanceRender = GameObject.Instantiate(r); if (InstanceRender) { InstanceRender.gameObject.name = "WaterRefObj--" + r.gameObject.name; InstanceRender.transform.SetParent(RefAreaRootObjTable[box].transform); InstanceRender.transform.position = r.transform.position; InstanceRender.transform.rotation = r.transform.rotation; InstanceRender.transform.localScale = r.transform.lossyScale; InstanceRender.gameObject.layer = Water.WaterObjLayer; InstanceRender.gameObject.isStatic = false; InstanceRender.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off; InstanceRender.receiveShadows = false; InstanceRender.reflectionProbeUsage = UnityEngine.Rendering.ReflectionProbeUsage.Off; Collider col = InstanceRender.GetComponent <Collider>(); if (col) { GameObject.DestroyImmediate(col); } GameObject[] deleteArray = new GameObject[InstanceRender.transform.childCount]; for (int i = 0; i < InstanceRender.transform.childCount; i++) { deleteArray[i] = InstanceRender.transform.GetChild(i).gameObject; } for (int i = 0; i < deleteArray.Length; i++) { GameObject.DestroyImmediate(deleteArray[i]); } Water.WaterNode wn = new Water.WaterNode(); wn.render = r; wn.animator = null; wn.hostBoxCollider = box; hostWater.allWaterNode.Add(wn); hostWater.allVisibleRenderList.Add(InstanceRender); renderCheck.Add(r); } } } } GameObject.DestroyImmediate(bc); } box.enabled = false; } }