Exemple #1
0
    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();
    }
Exemple #2
0
    public override void OnInspectorGUI()
    {
        DynamicBone db = (DynamicBone)target;

        showTools = EditorGUILayout.Foldout(showTools, "Khodrins Dynamic Bone Tools");

        if (showTools)
        {
            if (animator != null && animator.gameObject != db.gameObject && !db.transform.IsChildOf(animator.transform))
            {
                animator = null;
            }

            if (animator == null)
            {
                animator = db.gameObject.GetComponentInParent(typeof(Animator)) as Animator;
            }

            animator = (Animator)EditorGUILayout.ObjectField("Avatar Animator", animator, typeof(Animator), true);
            EditorGUILayout.LabelField("This is needed For errorchecking and the transfer functions.");
            EditorGUILayout.LabelField("Plase set to the correct value if not detected correctly.");

            if (!animator.isHuman)
            {
                EditorGUILayout.HelpBox("Your Avatar is not setup as Humanoid", MessageType.Error);
            }

            if (db.m_Colliders != null)
            {
                foreach (var collider in db.m_Colliders)
                {
                    if (collider == null)
                    {
                        continue;
                    }
                    var boneSettingsCollider = new KhodrinsDynamicBoneSettingsCollider();

                    if (collider.GetType().Name == "DynamicBonePlaneCollider")
                    {
                        boneSettingsCollider.getCollider((DynamicBoneCollider)collider, animator);
                    }
                    else
                    {
                        boneSettingsCollider.getCollider((DynamicBoneCollider)collider, animator);
                    }

                    if (boneSettingsCollider.bone.getTransform(animator) == null)
                    {
                        EditorGUILayout.HelpBox("One or more of your colliders seem not to be on a bone that is part of the humanoid rig. They may not be imported correctly.", MessageType.Warning);
                        break;
                    }
                }
            }

            if (db.m_Exclusions != null)
            {
                foreach (var exclusion in db.m_Exclusions)
                {
                    if (exclusion == null)
                    {
                        continue;
                    }
                    var boneType = KhodrinsDynamicBoneSettings.getBone(exclusion, animator);

                    if (boneType == HumanBodyBones.LastBone)
                    {
                        EditorGUILayout.HelpBox("One or more of your exclusions seem not to be on a bone that is part of the humanoid rig. They may not be imported correctly.", MessageType.Warning);
                        break;
                    }
                }
            }

            EditorGUILayout.BeginHorizontal();
            EditorGUILayout.BeginVertical();

            if (GUILayout.Button("Copy config"))
            {
                KhodrinsDynamicBoneSettings dbs = new KhodrinsDynamicBoneSettings();
                dbs.getSettings(db, animator);
                EditorGUIUtility.systemCopyBuffer = JsonUtility.ToJson(dbs);
            }

            EditorGUILayout.EndVertical();
            EditorGUILayout.BeginVertical();

            if (GUILayout.Button("Paste config"))
            {
                KhodrinsDynamicBoneSettings dbs = (KhodrinsDynamicBoneSettings)JsonUtility.FromJson(EditorGUIUtility.systemCopyBuffer, typeof(KhodrinsDynamicBoneSettings));
                dbs.setSettings(db, animator);
                EditorUtility.SetDirty(db.gameObject);
                EditorSceneManager.MarkSceneDirty(EditorSceneManager.GetActiveScene());
            }

            EditorGUILayout.EndVertical();
            EditorGUILayout.BeginVertical();

            if (GUILayout.Button("Save config"))
            {
                KhodrinsDynamicBoneSettings dbs = new KhodrinsDynamicBoneSettings();
                dbs.getSettings(db, animator);

                var path = EditorUtility.SaveFilePanel(
                    "Save Dynamic Bone Settings",
                    "",
                    animator.gameObject.name + "_" + db.m_Root.gameObject.name + ".dbs",
                    "dbs"
                    );
                if (path != "")
                {
                    File.WriteAllText(path, JsonUtility.ToJson(dbs));
                }
            }

            EditorGUILayout.EndVertical();
            EditorGUILayout.BeginVertical();

            if (GUILayout.Button("Load config"))
            {
                var path = EditorUtility.OpenFilePanel("Select Dynamic Bone Settings", "", "dbs");
                if (path != "")
                {
                    KhodrinsDynamicBoneSettings dbs = (KhodrinsDynamicBoneSettings)JsonUtility.FromJson(File.ReadAllText(path), typeof(KhodrinsDynamicBoneSettings));
                    dbs.setSettings(db, animator);
                    EditorUtility.SetDirty(db.gameObject);
                    EditorSceneManager.MarkSceneDirty(EditorSceneManager.GetActiveScene());
                }
            }

            EditorGUILayout.EndVertical();
            EditorGUILayout.EndHorizontal();
        }

        //Error Checking
        if (db.m_Root == null)
        {
            EditorGUILayout.HelpBox("No Root Transform selected!", MessageType.Error);
        }

        if (animator != null)
        {
            if (db.m_Colliders != null)
            {
                foreach (var collider in db.m_Colliders)
                {
                    if (collider != null && !collider.transform.IsChildOf(animator.transform))
                    {
                        EditorGUILayout.HelpBox("One or more of your colliders seem to be not part of your avatar!", MessageType.Warning);
                        break;
                    }
                }
            }

            if (db.m_Exclusions != null)
            {
                foreach (var exclusion in db.m_Exclusions)
                {
                    if (exclusion != null && db.m_Root != null && !exclusion.IsChildOf(db.m_Root))
                    {
                        EditorGUILayout.HelpBox("One or more of your exclusion seem to be not a child of your root Bone!", MessageType.Error);
                        break;
                    }
                }
            }
        }

        EditorGUILayout.Separator();

        DrawDefaultInspector();
    }