using UnityEngine; using UnityEditor; using System.Collections.Generic; public class RenameHumanoidBones : EditorWindow { private Animator selectedAnimator; private Dictionary humanoidBones = new Dictionary(); private Dictionary newBoneNames = new Dictionary(); [MenuItem("Tools/Humanoid Bone Renamer")] public static void ShowWindow() { GetWindow("Humanoid Bone Renamer"); } private Vector2 scrollPosition; private void OnGUI() { GUILayout.Label("Humanoid Bone Renamer", EditorStyles.boldLabel); if (GUILayout.Button("Find Humanoid Bones")) { FindHumanoidBones(); } if (selectedAnimator == null) { GUILayout.Label("No valid Humanoid Animator selected.", EditorStyles.helpBox); return; } GUILayout.Label("Selected GameObject: " + selectedAnimator.gameObject.name, EditorStyles.boldLabel); if (humanoidBones.Count > 0) { scrollPosition = EditorGUILayout.BeginScrollView(scrollPosition, GUILayout.Height(400)); EditorGUILayout.BeginVertical("box"); GUILayout.Label("Humanoid Bones", EditorStyles.boldLabel); foreach (var bone in humanoidBones) { EditorGUILayout.BeginHorizontal(); // First column: Unity's Humanoid bone name GUILayout.Label(bone.Key.ToString(), GUILayout.Width(150)); // Second column: Current bone name GUILayout.Label(bone.Value != null ? bone.Value.name : "None", GUILayout.Width(150)); // Third column: Input field for new name (defaulting to the first column's name) if (!newBoneNames.ContainsKey(bone.Key)) { newBoneNames[bone.Key] = bone.Key.ToString(); } newBoneNames[bone.Key] = EditorGUILayout.TextField(newBoneNames[bone.Key], GUILayout.Width(150)); EditorGUILayout.EndHorizontal(); } EditorGUILayout.EndVertical(); EditorGUILayout.EndScrollView(); } if (GUILayout.Button("Change Humanoid Bones Name")) { ChangeHumanoidBoneNames(); } } private void FindHumanoidBones() { selectedAnimator = null; humanoidBones.Clear(); newBoneNames.Clear(); if (Selection.activeGameObject == null) { Debug.LogError("No GameObject selected. Please select a GameObject with an Animator component."); return; } selectedAnimator = Selection.activeGameObject.GetComponent(); if (selectedAnimator == null || selectedAnimator.avatar == null || !selectedAnimator.avatar.isValid || !selectedAnimator.avatar.isHuman) { Debug.LogError("Selected GameObject does not have a valid Humanoid Avatar."); return; } for (int i = 0; i < HumanTrait.BoneCount; i++) { HumanBodyBones bone = (HumanBodyBones)i; Transform boneTransform = selectedAnimator.GetBoneTransform(bone); if (boneTransform != null) { humanoidBones[bone] = boneTransform; } } Debug.Log("Humanoid bones found and ready for renaming."); } private void ChangeHumanoidBoneNames() { if (selectedAnimator == null) { Debug.LogError("No valid Humanoid Animator selected."); return; } foreach (var bone in humanoidBones) { if (bone.Value != null && !string.IsNullOrWhiteSpace(newBoneNames[bone.Key])) { string newName = newBoneNames[bone.Key]; Debug.Log($"Renaming {bone.Value.name} to {newName}"); bone.Value.name = newName; } } Debug.Log("Bone renaming completed."); } }