Пример #1
0
        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;
            }
        }
Пример #2
0
        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;
            }
        }