protected void EnsureUMADataSetup(UMAData umaData) { if (umaData.umaRecipe != null) { umaData.umaRecipe.UpdateMeshHideMasks(); } if (umaData.umaRoot != null) { umaData.CleanMesh(false); if (umaData.rendererCount == umaData.generatedMaterials.rendererAssets.Count && umaData.AreRenderersEqual(umaData.generatedMaterials.rendererAssets)) { renderers = umaData.GetRenderers(); } else { var oldRenderers = umaData.GetRenderers(); var globalTransform = umaData.GetGlobalTransform(); renderers = new SkinnedMeshRenderer[umaData.generatedMaterials.rendererAssets.Count]; for (int i = 0; i < umaData.generatedMaterials.rendererAssets.Count; i++) { if (oldRenderers != null && oldRenderers.Length > i) { renderers[i] = oldRenderers[i]; if (umaData.generatedMaterials.rendererAssets[i] != null) { umaData.generatedMaterials.rendererAssets[i].ApplySettingsToRenderer(renderers[i]); } else { umaData.ResetRendererSettings(i); } continue; } UMARendererAsset rendererAsset = umaData.generatedMaterials.rendererAssets[i]; if (rendererAsset == null) { rendererAsset = umaData.defaultRendererAsset; } renderers[i] = MakeRenderer(i, globalTransform, rendererAsset); } if (oldRenderers != null) { for (int i = umaData.generatedMaterials.rendererAssets.Count; i < oldRenderers.Length; i++) { DestroyImmediate(oldRenderers[i].gameObject); //For cloth, be aware of issue: 845868 //https://issuetracker.unity3d.com/issues/cloth-repeatedly-destroying-objects-with-cloth-components-causes-a-crash-in-unity-cloth-updatenormals } } umaData.SetRenderers(renderers); umaData.SetRendererAssets(umaData.generatedMaterials.rendererAssets.ToArray()); } return; } if (umaData.umaRoot == null) { Transform rootTransform = umaData.gameObject.transform.Find("Root"); if (rootTransform) { umaData.umaRoot = rootTransform.gameObject; } else { GameObject newRoot = new GameObject("Root"); //make root of the UMAAvatar respect the layer setting of the UMAAvatar so cameras can just target this layer newRoot.layer = umaData.gameObject.layer; newRoot.transform.parent = umaData.transform; newRoot.transform.localPosition = Vector3.zero; newRoot.transform.localRotation = Quaternion.Euler(270f, 0, 0f); newRoot.transform.localScale = Vector3.one; umaData.umaRoot = newRoot; } Transform globalTransform = umaData.umaRoot.transform.Find("Global"); if (!globalTransform) { GameObject newGlobal = new GameObject("Global"); newGlobal.transform.parent = umaData.umaRoot.transform; newGlobal.transform.localPosition = Vector3.zero; newGlobal.transform.localRotation = Quaternion.Euler(90f, 90f, 0f); globalTransform = newGlobal.transform; } umaData.skeleton = new UMASkeleton(globalTransform); renderers = new SkinnedMeshRenderer[umaData.generatedMaterials.rendererAssets.Count]; for (int i = 0; i < umaData.generatedMaterials.rendererAssets.Count; i++) { UMARendererAsset rendererAsset = umaData.generatedMaterials.rendererAssets[i]; if (rendererAsset == null) { rendererAsset = umaData.defaultRendererAsset; } renderers[i] = MakeRenderer(i, globalTransform, rendererAsset); } umaData.SetRenderers(renderers); umaData.SetRendererAssets(umaData.generatedMaterials.rendererAssets.ToArray()); } //Clear out old cloth components for (int i = 0; i < umaData.rendererCount; i++) { Cloth cloth = renderers[i].GetComponent <Cloth>(); if (cloth != null) { DestroyImmediate(cloth, false); //Crashes if trying to use Destroy() } } }
protected void EnsureUMADataSetup(UMAData umaData) { if (umaData.umaRoot == null) { GameObject newRoot = new GameObject("Root"); //make root of the UMAAvatar respect the layer setting of the UMAAvatar so cameras can just target this layer newRoot.layer = umaData.gameObject.layer; newRoot.transform.parent = umaData.transform; newRoot.transform.localPosition = Vector3.zero; newRoot.transform.localRotation = Quaternion.Euler(270f, 0, 0f); newRoot.transform.localScale = Vector3.one; umaData.umaRoot = newRoot; GameObject newGlobal = new GameObject("Global"); newGlobal.transform.parent = newRoot.transform; newGlobal.transform.localPosition = Vector3.zero; newGlobal.transform.localRotation = Quaternion.Euler(90f, 90f, 0f); umaData.skeleton = new UMASkeleton(newGlobal.transform); renderers = new SkinnedMeshRenderer[umaData.generatedMaterials.rendererCount]; for (int i = 0; i < umaData.generatedMaterials.rendererCount; i++) { renderers[i] = MakeRenderer(i, newGlobal.transform); } umaData.SetRenderers(renderers); } else { umaData.CleanMesh(false); if (umaData.rendererCount == umaData.generatedMaterials.rendererCount) { renderers = umaData.GetRenderers(); } else { var oldRenderers = umaData.GetRenderers(); var globalTransform = umaData.GetGlobalTransform(); renderers = new SkinnedMeshRenderer[umaData.generatedMaterials.rendererCount]; for (int i = 0; i < umaData.generatedMaterials.rendererCount; i++) { if (oldRenderers != null && oldRenderers.Length > i) { renderers[i] = oldRenderers[i]; continue; } renderers[i] = MakeRenderer(i, globalTransform); } if (oldRenderers != null) { for (int i = umaData.generatedMaterials.rendererCount; i < oldRenderers.Length; i++) { Destroy(oldRenderers[i].gameObject); //For cloth, be aware of issue: 845868 //https://issuetracker.unity3d.com/issues/cloth-repeatedly-destroying-objects-with-cloth-components-causes-a-crash-in-unity-cloth-updatenormals } } umaData.SetRenderers(renderers); } } }
protected void EnsureUMADataSetup(UMAData umaData) { if (umaData.umaRecipe != null) { umaData.umaRecipe.UpdateMeshHideMasks(); } #region SetupSkeleton // First, ensure that the skeleton is setup, and if not, // then generate the root, global and set it up. if (umaData.umaRoot == null) { umaData.SetupSkeleton(); } #endregion if (umaData.umaRoot != null) { umaData.CleanMesh(false); if (umaData.rendererCount == umaData.generatedMaterials.rendererAssets.Count && umaData.AreRenderersEqual(umaData.generatedMaterials.rendererAssets)) { renderers = umaData.GetRenderers(); } else { var oldRenderers = umaData.GetRenderers(); var globalTransform = umaData.GetGlobalTransform(); renderers = new SkinnedMeshRenderer[umaData.generatedMaterials.rendererAssets.Count]; for (int i = 0; i < umaData.generatedMaterials.rendererAssets.Count; i++) { if (oldRenderers != null && oldRenderers.Length > i) { renderers[i] = oldRenderers[i]; if (umaData.generatedMaterials.rendererAssets[i] != null) { umaData.generatedMaterials.rendererAssets[i].ApplySettingsToRenderer(renderers[i]); } else { umaData.ResetRendererSettings(i); } continue; } UMARendererAsset rendererAsset = umaData.generatedMaterials.rendererAssets[i]; if (rendererAsset == null) { rendererAsset = umaData.defaultRendererAsset; } renderers[i] = MakeRenderer(i, globalTransform, rendererAsset); } if (oldRenderers != null) { for (int i = umaData.generatedMaterials.rendererAssets.Count; i < oldRenderers.Length; i++) { DestroyImmediate(oldRenderers[i].gameObject); //For cloth, be aware of issue: 845868 //https://issuetracker.unity3d.com/issues/cloth-repeatedly-destroying-objects-with-cloth-components-causes-a-crash-in-unity-cloth-updatenormals } } umaData.SetRenderers(renderers); umaData.SetRendererAssets(umaData.generatedMaterials.rendererAssets.ToArray()); } return; } //Clear out old cloth components for (int i = 0; i < umaData.rendererCount; i++) { Cloth cloth = renderers[i].GetComponent <Cloth>(); if (cloth != null) { DestroyImmediate(cloth, false); //Crashes if trying to use Destroy() } } }