/// <summary> /// Skinning mesh to new skinned mesh renderer with choosed weight markers settings /// </summary> public void SkinMesh(bool addTailAnimator, Vector3 newObjectOffset) { // Remembering data and preparing objects with components List <Color32> baseVertColors = new List <Color32>(); GetBaseMesh().GetColors(baseVertColors); // Doing skinning vertexDatas = FTail_Skinning.CalculateVertexWeightingData( GetBaseMesh(), ghostBones, SpreadOffset, LimitBoneWeightCount, SpreadValue, SpreadPower); SkinnedMeshRenderer newSkinnedMesh = FTail_Skinning.SkinMesh(baseMesh, transform, ghostBones, vertexDatas); if (newSkinnedMesh == null) { Debug.LogError("[Tail Animator Skinning] Creating skinned mesh failed!"); return; } // Skin renderer quality switch (LimitBoneWeightCount) { case 1: newSkinnedMesh.quality = SkinQuality.Bone1; break; case 2: newSkinnedMesh.quality = SkinQuality.Bone2; break; case 4: newSkinnedMesh.quality = SkinQuality.Bone4; break; default: newSkinnedMesh.quality = SkinQuality.Auto; break; } // Filling new mesh with materials MeshRenderer meshRend = GetComponent <MeshRenderer>(); if (meshRend) { newSkinnedMesh.materials = meshRend.sharedMaterials; newSkinnedMesh.sharedMaterials = meshRend.sharedMaterials; } // Adding tail animator if (addTailAnimator) { TailAnimator2 t = newSkinnedMesh.bones[0].gameObject.AddComponent <TailAnimator2>(); t.StartBone = newSkinnedMesh.bones[0]; t.EndBone = newSkinnedMesh.bones[newSkinnedMesh.bones.Length - 1]; } // Setting new object position to be next to current model newSkinnedMesh.transform.position = transform.position + new Vector3(1f, 1f, 1f); // Create asset for new model so it not disappear when we create prefab from this gameObject string newMeshPath = System.IO.Path.GetDirectoryName(AssetDatabase.GetAssetPath(baseMesh)); AssetDatabase.CreateAsset(newSkinnedMesh.sharedMesh, newMeshPath + "/" + newSkinnedMesh.name + ".mesh"); AssetDatabase.SaveAssets(); Debug.Log("New skinned mesh '" + newSkinnedMesh.name + ".mesh" + "' saved under path: '" + newMeshPath + "'"); }
/// <summary> /// When something changes in inspector, let's recalculate parameters /// </summary> private void OnValidate() { if (!initValues) { MeshRenderer m = GetComponent <MeshRenderer>(); if (m) { DistanceValue = m.bounds.extents.magnitude / 7f; } initValues = true; } if (AutoMarkersCount < 2) { AutoMarkersCount = 2; } if (!GetBaseMesh()) { return; } if (CustomBoneMarkers == null) { CustomBoneMarkers = new Transform[0]; // Prevent error log when adding component } // Use only custom markers if they're assigned if (CustomBoneMarkers.Length > 0) { ghostBones = CustomBoneMarkers; } else // Use auto markers { CalculateAutoMarkers(); ghostBones = autoMarkers; } if (RealtimeUpdate) { vertexDatas = FTail_Skinning.CalculateVertexWeightingData( GetBaseMesh(), ghostBones, SpreadOffset, LimitBoneWeightCount, SpreadValue, SpreadPower); UpdatePreviewMesh(); } }