Exemple #1
0
        private BoneTreeView CreateBoneTreeView(List <BoneInfo> rootBoneInfos, TreeViewState treeViewState)
        {
            var treeView  = new BoneTreeView(treeViewState);
            var currentId = 0;
            var root      = new BoneTreeElement {
                Id = ++currentId, Name = "Bones"
            };

            for (int i = 0; i < rootBoneInfos.Count(); i++)
            {
                root.AddChild(BoneInfoToBoneTreeView(rootBoneInfos[i], ref currentId));
            }
            treeView.Setup(new List <BoneTreeElement> {
                root
            }.ToArray());

            return(treeView);
        }
Exemple #2
0
        private void OnGUI()
        {
            using (var check = new EditorGUI.ChangeCheckScope())
            {
                avatar = EditorGUILayout.ObjectField(
                    "avatar",
                    avatar,
                    typeof(GameObject),
                    true
                    ) as GameObject;


                if (check.changed && avatar != null)
                {
                    rootBoneList = GetRootBoneInfos(avatar);
                    boneCount    = GetAvatarBoneCount(avatar, true);
                    treeView     = CreateBoneTreeView(rootBoneList, treeViewState);
                    saveFolder   = GetAvatarFbxPath(avatar);
                }
            }

            if (avatar != null && rootBoneList != null)
            {
                using (new EditorGUILayout.VerticalScope(GUI.skin.box))
                {
                    if (treeView != null)
                    {
                        treeView.OnGUI(EditorGUILayout.GetControlRect(false, position.height - 120));
                    }
                }
            }

            EditorGUILayout.LabelField("BoneCount", boneCount.ToString());

            using (new EditorGUILayout.HorizontalScope())
            {
                EditorGUILayout.LabelField("Mesh SaveFolder", saveFolder);

                if (GUILayout.Button("Select Folder", GUILayout.Width(100)))
                {
                    saveFolder = EditorUtility.OpenFolderPanel("Select saved folder", saveFolder, "");
                    var match = Regex.Match(saveFolder, @"Assets/.*");
                    saveFolder = match.Value + "/";
                    if (saveFolder == "/")
                    {
                        saveFolder = "Assets/";
                    }
                }
            }

            duplicateAvatar = EditorGUILayout.ToggleLeft("Copy Avatar", duplicateAvatar);

            EditorGUILayout.Space();

            using (new EditorGUI.DisabledScope(avatar == null))
            {
                if (GUILayout.Button("Delete Bones"))
                {
                    var boneList = ConvertBoneTreeToBoneList(rootBoneList);

                    if (duplicateAvatar)
                    {
                        var name = avatar.name + "_deleteBones";
                        avatar      = Instantiate(avatar);
                        avatar.name = name;
                        var copyBoneList = ConvertBoneTreeToBoneList(GetRootBoneInfos(avatar));

                        // copyBoneListにboneListのdeletedの選択状態をコピーする
                        for (int index = 0; index < boneList.Count(); index++)
                        {
                            if (boneList[index].deleted)
                            {
                                copyBoneList[index].deleted = true;
                            }
                        }
                        boneList = copyBoneList;
                    }

                    var deleteBoneList = boneList.Where(x => x.deleted).ToList();
                    DeleteAvatarBones(ref avatar, ref deleteBoneList);

                    // 削除後のボーンをGUIに反映
                    rootBoneList = GetRootBoneInfos(avatar);
                    boneCount    = GetAvatarBoneCount(avatar, true);
                    treeView     = CreateBoneTreeView(rootBoneList, treeViewState);
                }
            }
        }