void UpdateMesh(MeshData data) { var trans = UpdateTransform(data.transform); if (trans == null) { return; } var data_trans = data.transform; var data_id = data_trans.id; var path = data_trans.path; Record rec = null; if (!m_clientObjects.TryGetValue(path, out rec)) { m_hostObjects.TryGetValue(data_id, out rec); } if (rec == null) { Debug.LogError("Something wrong"); return; } var target = rec.go.GetComponent <Transform>(); var go = target.gameObject; bool activeInHierarchy = go.activeInHierarchy; if (!activeInHierarchy && !data.flags.hasPoints) { return; } // allocate material list bool materialsUpdated = rec.BuildMaterialData(data); var flags = data.flags; bool skinned = data.numBones > 0; // update mesh for (int si = 0; si < data.numSplits; ++si) { var t = target; if (si > 0) { bool created = false; t = FindOrCreateObjectByPath(path + "/[" + si + "]", true, ref created); t.gameObject.SetActive(true); } var split = data.GetSplit(si); if (split.numPoints == 0 || split.numIndices == 0) { rec.editMesh = null; } else { rec.editMesh = CreateEditedMesh(data, split); rec.editMesh.name = si == 0 ? target.name : target.name + "[" + si + "]"; } var smr = GetOrAddSkinnedMeshRenderer(t.gameObject, si > 0); if (smr != null) { var old = smr.sharedMesh; smr.sharedMesh = rec.editMesh; DestroyIfNotAsset(old); if (skinned) { // create bones var paths = data.GetBonePaths(); var bones = new Transform[data.numBones]; for (int bi = 0; bi < bones.Length; ++bi) { bool created = false; bones[bi] = FindOrCreateObjectByPath(paths[bi], true, ref created); if (created) { var newrec = new Record { go = bones[bi].gameObject, recved = true, }; if (m_clientObjects.ContainsKey(paths[bi])) { m_clientObjects[paths[bi]] = newrec; } else { m_clientObjects.Add(paths[bi], newrec); } } } if (bones.Length > 0) { bool created = false; var root = FindOrCreateObjectByPath(data.rootBonePath, true, ref created); if (root == null) { root = bones[0]; } smr.rootBone = root; smr.bones = bones; } } else { if (smr.rootBone != null) { smr.bones = null; smr.rootBone = null; } } } } int num_splits = Math.Max(1, data.numSplits); for (int si = num_splits; ; ++si) { bool created = false; var t = FindOrCreateObjectByPath(path + "/[" + si + "]", false, ref created); if (t == null) { break; } DestroyImmediate(t.gameObject); } if (activeInHierarchy) { rec.go.SetActive(false); // rec.go.SetActive(true); // force recalculate skinned mesh on editor. I couldn't find better way... } // assign materials if needed if (materialsUpdated) { AssignMaterials(rec); } }