70 lines
2.5 KiB
C#
70 lines
2.5 KiB
C#
using System.Collections;
|
||
using System.Collections.Generic;
|
||
using UnityEngine;
|
||
|
||
public class RenameBones : MonoBehaviour
|
||
{
|
||
public Transform boneToRemove;
|
||
[ContextMenu("Remove Bone and Reassign Weights")]
|
||
void RemoveBone()
|
||
{
|
||
if (boneToRemove == null)
|
||
{
|
||
Debug.LogError("Кістка для видалення не задана!");
|
||
return;
|
||
}
|
||
|
||
SkinnedMeshRenderer skinnedMesh = GetComponent<SkinnedMeshRenderer>();
|
||
if (skinnedMesh == null)
|
||
{
|
||
Debug.LogError("SkinnedMeshRenderer не знайдено!");
|
||
return;
|
||
}
|
||
|
||
Transform parentBone = boneToRemove.parent;
|
||
if (parentBone == null)
|
||
{
|
||
Debug.LogError("Неможливо видалити кореневу кістку без оновлення rootBone.");
|
||
return;
|
||
}
|
||
|
||
List<Transform> bonesList = new List<Transform>(skinnedMesh.bones);
|
||
int removeBoneIndex = bonesList.IndexOf(boneToRemove);
|
||
if (removeBoneIndex == -1)
|
||
{
|
||
Debug.LogError("Кістка не знайдена у списку bones.");
|
||
return;
|
||
}
|
||
|
||
foreach (Transform child in boneToRemove)
|
||
{
|
||
child.SetParent(parentBone);
|
||
}
|
||
|
||
bonesList[removeBoneIndex] = parentBone;
|
||
skinnedMesh.bones = bonesList.ToArray();
|
||
|
||
// Оновлюємо rootBone, якщо потрібно
|
||
if (skinnedMesh.rootBone == boneToRemove)
|
||
{
|
||
skinnedMesh.rootBone = parentBone;
|
||
}
|
||
|
||
// Оновлення ваги вертексів
|
||
Mesh mesh = skinnedMesh.sharedMesh;
|
||
BoneWeight[] boneWeights = mesh.boneWeights;
|
||
for (int i = 0; i < boneWeights.Length; i++)
|
||
{
|
||
if (boneWeights[i].boneIndex0 == removeBoneIndex) boneWeights[i].boneIndex0 = bonesList.IndexOf(parentBone);
|
||
if (boneWeights[i].boneIndex1 == removeBoneIndex) boneWeights[i].boneIndex1 = bonesList.IndexOf(parentBone);
|
||
if (boneWeights[i].boneIndex2 == removeBoneIndex) boneWeights[i].boneIndex2 = bonesList.IndexOf(parentBone);
|
||
if (boneWeights[i].boneIndex3 == removeBoneIndex) boneWeights[i].boneIndex3 = bonesList.IndexOf(parentBone);
|
||
}
|
||
mesh.boneWeights = boneWeights;
|
||
|
||
// Видаляємо кістку
|
||
DestroyImmediate(boneToRemove.gameObject);
|
||
Debug.Log($"Кістка {boneToRemove.name} видалена, вага перенесена на {parentBone.name}.");
|
||
}
|
||
}
|