private void DBSGInspectorGUI() { EditorGUILayout.HelpBox("To import press the open button.", MessageType.Info); KhodrinsDynamicBoneSettingsGroup settingsGroup = (KhodrinsDynamicBoneSettingsGroup)JsonUtility.FromJson(File.ReadAllText(assetPath), typeof(KhodrinsDynamicBoneSettingsGroup)); EditorGUILayout.LabelField("Name: " + settingsGroup.name); EditorGUILayout.LabelField("Description:"); GUILayout.Label(settingsGroup.description); EditorGUILayout.LabelField("DynamicBones included in file: " + settingsGroup.list.Count); for (int i = 0; i < settingsGroup.list.Count; i++) { EditorGUILayout.LabelField("DynamicBones #" + (i + 1) + ":"); EditorGUILayout.LabelField(" Placement:" + settingsGroup.list[i].placement.name); EditorGUILayout.LabelField(" Root:" + settingsGroup.list[i].m_Root.name); EditorGUILayout.LabelField(" Colliders:" + settingsGroup.list[i].m_Colliders.Count); for (int j = 0; j < settingsGroup.list[i].m_Colliders.Count; j++) { EditorGUILayout.LabelField(" Collider #" + (j + 1) + ":" + settingsGroup.list[i].m_Colliders[j].bone.name); } EditorGUILayout.LabelField(" Exclusions:" + settingsGroup.list[i].m_Colliders.Count); for (int j = 0; j < settingsGroup.list[i].m_Exclusions.Count; j++) { EditorGUILayout.LabelField(" Exclusion #" + (j + 1) + ":" + settingsGroup.list[i].m_Exclusions[j].name); } EditorGUILayout.LabelField(" Reference:" + settingsGroup.list[i].m_ReferenceObject.name); } }
public void SetSettings(KhodrinsDynamicBoneSettingsGroup settings) { settingsGroup = settings; }
void OnGUI() { scrollPos = EditorGUILayout.BeginScrollView(scrollPos); Texture2D logo = (Texture2D)AssetDatabase.LoadAssetAtPath("Assets" + EDITORFOLDER + "Logo-Khodrin-dynamicbone-tools.png", typeof(Texture2D)); GUI.DrawTexture(GUILayoutUtility.GetRect(300, 100), logo, ScaleMode.ScaleToFit); animator = (Animator)EditorGUILayout.ObjectField("Avatar Animator", animator, typeof(Animator), true); if (settingsGroup != null && settingsGroup.list.Count > 0 && animator == null) { EditorGUILayout.HelpBox("Settings file loaded please select Avatar Animator to continue.", MessageType.Info); } if (animator != null) { if (GUILayout.Button("Open Settings File")) { var path = EditorUtility.OpenFilePanel("Select Dynamic Bone Settings Group", "", "dbsg"); if (path != "") { LoadFromFile(path); } } DynamicBone[] dynamicBones = animator.gameObject.GetComponentsInChildren <DynamicBone>(); if (settingsGroup != null && settingsGroup.list.Count > 0) { EditorGUILayout.LabelField("Settings loaded for inport:"); EditorGUILayout.LabelField(settingsGroup.name); GUILayout.Label(settingsGroup.description); EditorGUILayout.LabelField("DynamicBones included in file: " + settingsGroup.list.Count); for (int i = 0; i < settingsGroup.list.Count; i++) { EditorGUILayout.LabelField("DynamicBones #" + (i + 1) + ":"); settingsGroup.list[i].placement.transformOverride = (Transform)EditorGUILayout.ObjectField(" Placement:", settingsGroup.list[i].placement.getTransform(animator), typeof(Transform), true); if (settingsGroup.list[i].placement.getTransform(animator) == null && settingsGroup.list[i].placement.name != "") { EditorGUILayout.HelpBox("Placement gameobject could not be relocated. Expected was a gameobject with name \"" + settingsGroup.list[i].placement.name + "\". If left blank the component will be placed on the root gameobject.", MessageType.Warning); } settingsGroup.list[i].m_Root.transformOverride = (Transform)EditorGUILayout.ObjectField(" Root:", settingsGroup.list[i].m_Root.getTransform(animator), typeof(Transform), true); if (settingsGroup.list[i].m_Root.getTransform(animator) == null && settingsGroup.list[i].m_Root.name != "") { EditorGUILayout.HelpBox("Root gameobject could not be relocated. Expected was a gameobject with name \"" + settingsGroup.list[i].m_Root.name + "\". If left blank the component will not work correctly.", MessageType.Error); } EditorGUILayout.LabelField(" Colliders:" + settingsGroup.list[i].m_Colliders.Count); for (int j = 0; j < settingsGroup.list[i].m_Colliders.Count; j++) { settingsGroup.list[i].m_Colliders[j].bone.transformOverride = (Transform)EditorGUILayout.ObjectField(" Collider #" + (j + 1) + ":", settingsGroup.list[i].m_Colliders[j].bone.getTransform(animator), typeof(Transform), true); if (settingsGroup.list[i].m_Colliders[j].bone.getTransform(animator) == null && settingsGroup.list[i].m_Colliders[j].bone.name != "") { EditorGUILayout.HelpBox("Collider gameobject could not be relocated. Expected was a gameobject with name \"" + settingsGroup.list[i].m_Colliders[j].bone.name + "\". If left blank the Collider will not be imported.", MessageType.Error); } } EditorGUILayout.LabelField(" Exclusions:" + settingsGroup.list[i].m_Colliders.Count); for (int j = 0; j < settingsGroup.list[i].m_Exclusions.Count; j++) { settingsGroup.list[i].m_Exclusions[j].transformOverride = (Transform)EditorGUILayout.ObjectField(" Exclusion #" + (j + 1) + ":", settingsGroup.list[i].m_Exclusions[j].getTransform(animator), typeof(Transform), true); if (settingsGroup.list[i].m_Exclusions[j].getTransform(animator) == null && settingsGroup.list[i].m_Exclusions[j].name != "") { EditorGUILayout.HelpBox("Exclusion gameobject could not be relocated. Expected was a gameobject with name \"" + settingsGroup.list[i].m_Exclusions[j].name + "\". If left blank the Collider will not be imported.", MessageType.Error); } } settingsGroup.list[i].m_ReferenceObject.transformOverride = (Transform)EditorGUILayout.ObjectField(" Reference:", settingsGroup.list[i].m_ReferenceObject.getTransform(animator), typeof(Transform), true); if (settingsGroup.list[i].m_ReferenceObject.getTransform(animator) == null && settingsGroup.list[i].m_ReferenceObject.name != "") { EditorGUILayout.HelpBox("Reference gameobject could not be relocated. Expected was a gameobject with name \"" + settingsGroup.list[i].m_ReferenceObject.name + "\". If left blank the Reference will not be imported.", MessageType.Error); } } importScale = EditorGUILayout.Vector3Field("Import Scale: ", importScale); EditorGUILayout.HelpBox("This Option can be used To fix inconsistent Avatar Scaligns. It will scale radii and offsets of bones and collider", MessageType.Info); if (GUILayout.Button("Cancel Import")) { settingsGroup = null; } if (GUILayout.Button("Apply Settings")) { foreach (var setting in settingsGroup.list) { var transform = setting.placement.getTransform(animator); if (transform != null) { var db = transform.gameObject.AddComponent <DynamicBone>(); setting.setSettings(db, animator, importScale); } } settingsGroup = null; } } else if (dynamicBones.Length > 0) { EditorGUILayout.LabelField("DynamicBones found an avatar: " + dynamicBones.Length); int i = 1; foreach (var dynamicBone in dynamicBones) { EditorGUILayout.LabelField("DynamicBones #" + i + " found component on: " + dynamicBone.gameObject.name); i++; if (dynamicBone.m_Root == null) { EditorGUILayout.LabelField(" Root: None"); } else { EditorGUILayout.LabelField(" Root: " + dynamicBone.m_Root.gameObject.name); } EditorGUILayout.LabelField(" Found colliders: " + dynamicBone.m_Colliders.Count); foreach (var collider in dynamicBone.m_Colliders) { if (collider == null) { EditorGUILayout.LabelField(" None"); } else { EditorGUILayout.LabelField(" " + collider.gameObject.name); } } EditorGUILayout.LabelField(" Found exclusions: " + dynamicBone.m_Exclusions.Count); foreach (var exclusion in dynamicBone.m_Exclusions) { if (exclusion == null) { EditorGUILayout.LabelField(" None"); } else { EditorGUILayout.LabelField(" " + exclusion.gameObject.name); } } if (dynamicBone.m_ReferenceObject == null) { EditorGUILayout.LabelField(" Reference Object: None"); } else { EditorGUILayout.LabelField(" Reference Object: " + dynamicBone.m_ReferenceObject.gameObject.name); } } EditorGUILayout.LabelField("Export settings:"); saveName = EditorGUILayout.TextField("Name:", saveName); EditorGUILayout.LabelField("Description:"); saveDescription = EditorGUILayout.TextArea(saveDescription); if (GUILayout.Button("Export DynamicBone settings")) { var settingsGroup = new KhodrinsDynamicBoneSettingsGroup(); settingsGroup.name = saveName; settingsGroup.description = saveDescription; foreach (var dynamicBone in dynamicBones) { var settings = new KhodrinsDynamicBoneSettings(); settings.getSettings(dynamicBone, animator); settingsGroup.list.Add(settings); } var path = EditorUtility.SaveFilePanel( "Save Dynamic Bone Settings Group", "", settingsGroup.name + ".dbsg", "dbsg" ); if (path != "") { File.WriteAllText(path, JsonUtility.ToJson(settingsGroup)); } } if (GUILayout.Button("Remove all DynamicBone Components")) { bool confirm = EditorUtility.DisplayDialog("Confirm delete", "Are you sure you want to delete all DaynamicBone components from the avatar \"" + animator.transform.name + "\"?", "Yes", "No"); if (confirm) { for (i = 0; i < dynamicBones.Length; i++) { DestroyImmediate(dynamicBones[i]); } DynamicBoneCollider[] dynamicBonesCollider = animator.gameObject.GetComponentsInChildren <DynamicBoneCollider>(); DynamicBonePlaneCollider[] dynamicBonePlaneCollider = animator.gameObject.GetComponentsInChildren <DynamicBonePlaneCollider>(); for (i = 0; i < dynamicBonesCollider.Length; i++) { DestroyImmediate(dynamicBonesCollider[i]); } for (i = 0; i < dynamicBonePlaneCollider.Length; i++) { DestroyImmediate(dynamicBonePlaneCollider[i]); } } } } } EditorGUILayout.EndScrollView(); }
public void LoadFromFile(string filePath) { settingsGroup = (KhodrinsDynamicBoneSettingsGroup)JsonUtility.FromJson(File.ReadAllText(filePath), typeof(KhodrinsDynamicBoneSettingsGroup)); importScale = Vector3.one; }