Beispiel #1
0
    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);
            }
        }
    }
Beispiel #2
0
    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);
        }
    }