protected void OnSuccess(GameObject res, object param) { int index = (int)param; res.transform.position = assetsPos[index].pos; res.transform.eulerAngles = assetsPos[index].rotate; res.transform.localScale = assetsPos[index].scaler; MeshRenderer[] mrs = res.GetComponentsInChildren <MeshRenderer>(); if (mrs == null || mrs.Length == 0) { Debug.Assert(assetsPos[index].lightIndex < 0, "wtfffk"); GameObject go = GameObject.Instantiate(res); go.SetActive(true); return; } for (int i = 0; i < mrs.Length; ++i) { MeshRenderer meshRenderer = mrs[i]; Material[] mts = meshRenderer.sharedMaterials; for (int j = 0; j < mts.Length; ++j) { Material t = mts[j]; MeshCombianData data = null; batchObj.TryGetValue(t.name + assetsPos[index].lightIndex.ToString(), out data); if (data == null) { data = new MeshCombianData(); data.go = new GameObject(res.name + i.ToString()); data.mr = data.go.AddComponent <MeshRenderer>(); data.mr.reflectionProbeUsage = UnityEngine.Rendering.ReflectionProbeUsage.Off; data.mr.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off; data.mr.receiveShadows = false; data.mr.motionVectorGenerationMode = MotionVectorGenerationMode.ForceNoMotion; data.mr.sharedMaterial = t; data.mr.lightmapIndex = assetsPos[index].lightIndex; data.mf = data.go.AddComponent <MeshFilter>(); data.mf.mesh = new Mesh(); batchObj.Add(t.name + assetsPos[index].lightIndex.ToString(), data); } Combine(data, data.mr, meshRenderer, assetsPos[index].lightMap, j); } } }
public void Combine(MeshCombianData data, MeshRenderer newMeshRender, MeshRenderer needCombines, Vector4 lightmapScaleOffset, int subMeshIndex) { Matrix4x4 matrix = newMeshRender.transform.worldToLocalMatrix; MeshFilter mf = needCombines.gameObject.GetComponent <MeshFilter>(); CombineInstance ci = new CombineInstance(); ci.mesh = mf.sharedMesh; ci.subMeshIndex = subMeshIndex; ci.lightmapScaleOffset = lightmapScaleOffset; ci.transform = matrix * mf.gameObject.transform.localToWorldMatrix; data.combineInstances.Add(ci); //data.mf.mesh.CombineMeshes(data.combineInstances.ToArray(), true, true, true); if (waitCombianData.Contains(data) == false) { waitCombianData.Add(data); } }