示例#1
0
        private bool CreatePart(AvatarPartCreatorData data)
        {
            var partData = AvatarCreatorUtil.CreatePart(currentCreatorData.skeletonPartData.outputFolder, data);

            if (partData == null)
            {
                EditorUtility.DisplayDialog("Error", "Create Failed.\n Please view the details from the console!!!", "OK");
                return(false);
            }
            else
            {
                SelectionUtility.PingObject(partData);
                return(true);
            }
        }
示例#2
0
        protected override void OnDrawProperty(string label)
        {
            if (drawerObject == null)
            {
                drawerObject = new DrawerObject(Property.Value);
            }
            if (Property.IsArrayElement)
            {
                AvatarPartCreatorData partCreatorData = (AvatarPartCreatorData)Property.Value;
                EditorGUILayout.BeginHorizontal();
                {
                    EditorGUILayout.LabelField(label, UnityEngine.GUILayout.Width(25));
                    EditorGUILayout.BeginVertical();
                    {
                        drawerObject.OnGUILayout();
                    }
                    EditorGUILayout.EndVertical();
                }
                EditorGUILayout.EndHorizontal();

                EditorGUILayout.Space();

                EGUI.BeginGUIBackgroundColor(Color.cyan);
                {
                    if (GUILayout.Button("Create Part"))
                    {
                        CreatePartBtnClick?.Invoke(partCreatorData);
                    }
                    if (GUILayout.Button("Preview Part"))
                    {
                        PreviewPartBtnClick?.Invoke(partCreatorData);
                    }
                }
                EGUI.EndGUIBackgroundColor();
            }
            else
            {
                EditorGUILayout.LabelField(label);
                EditorGUI.indentLevel++;
                {
                    drawerObject.OnGUILayout();
                }
                EditorGUI.indentLevel--;
            }
        }
示例#3
0
        private void PreviewPart(AvatarPartCreatorData data)
        {
            if (!previewer.HasSkeleton())
            {
                EditorUtility.DisplayDialog("Error", $"Please preview the skeleton at first", "OK");
                return;
            }

            string assetPath = data.GetPartAssetPath(currentCreatorData.skeletonPartData.outputFolder);

            if (AssetDatabaseUtility.IsAssetAtPath <AvatarPartData>(assetPath))
            {
                previewer.AddPart(assetPath);
            }
            else
            {
                EditorUtility.DisplayDialog("Error", $"The asset is not found in \"{assetPath}\"", "OK");
            }
        }
示例#4
0
        public static AvatarPartData CreatePart(string outputFolder, AvatarPartCreatorData data)
        {
            if (data == null)
            {
                Debug.LogError("AvatarCreatorUtil::CreatePart->the data is null");
                return(null);
            }

            if (string.IsNullOrEmpty(outputFolder))
            {
                Debug.LogError("AvatarCreatorUtil::CreatePart->The outputFolder is empty");
                return(null);
            }

            if (string.IsNullOrEmpty(data.name))
            {
                Debug.LogError("AvatarCreatorUtil::CreatePart->The name is empty");
                return(null);
            }

            string partAssetPath = data.GetPartAssetPath(outputFolder);

            AvatarPartData partData = ScriptableObject.CreateInstance <AvatarPartData>();

            partData.name     = data.name;
            partData.partName = data.partName;

            List <PrefabPartData> prefabPartDatas = new List <PrefabPartData>();

            foreach (var prefabCreatorData in data.prefabDatas)
            {
                if (string.IsNullOrEmpty(prefabCreatorData.bindNodeName))
                {
                    Debug.LogError("AvatarCreatorUtil::CreatePart->The bindNodeName is empty");
                    return(null);
                }

                if (prefabCreatorData.bindPrefab == null)
                {
                    Debug.LogError("AvatarCreatorUtil::CreatePart->The bindPrefab is null");
                    return(null);
                }

                PrefabAssetType assetType = UnityEditor.PrefabUtility.GetPrefabAssetType(prefabCreatorData.bindPrefab);
                if (assetType != PrefabAssetType.Regular)
                {
                    Debug.LogError($"AvatarCreatorUtil::CreatePart->The bindPrefab is not a Prefab.type = {assetType}");
                    return(null);
                }

                PrefabPartData prefabPartData = new PrefabPartData();
                prefabPartData.bindName = prefabCreatorData.bindNodeName;
                prefabPartData.prefabGO = prefabCreatorData.bindPrefab;
                prefabPartDatas.Add(prefabPartData);
            }
            partData.prefabParts = prefabPartDatas.ToArray();

            List <RendererPartData> rendererPartDatas = new List <RendererPartData>();

            foreach (var rendererCreatorData in data.rendererDatas)
            {
                if (rendererCreatorData.fbx == null)
                {
                    Debug.LogError("AvatarCreatorUtil::CreatePart->The fbx is null");
                    return(null);
                }

                PrefabAssetType assetType = UnityEditor.PrefabUtility.GetPrefabAssetType(rendererCreatorData.fbx);
                if (assetType != PrefabAssetType.Model)
                {
                    Debug.LogError($"AvatarCreatorUtil::CreatePart->The fbx is not a model.type = {assetType}");
                    return(null);
                }

                SkinnedMeshRenderer[] renderers = rendererCreatorData.fbx.GetComponentsInChildren <SkinnedMeshRenderer>(true);
                foreach (var renderer in renderers)
                {
                    RendererPartData rendererPartData = new RendererPartData();
                    rendererPartData.rendererName = renderer.name;
                    rendererPartData.rootBoneName = renderer.rootBone.name;
                    rendererPartData.boneNames    = (from bone in renderer.bones select bone.name).ToArray();
                    rendererPartData.materials    = renderer.sharedMaterials;

                    Mesh   mesh          = renderer.sharedMesh;
                    string meshAssetPath = $"{outputFolder}/{mesh.name}_mesh.asset";
                    if (rendererCreatorData.IsCopyMesh)
                    {
                        mesh = Utilities.MeshUtility.CopyMeshTo(mesh, meshAssetPath);
                    }
                    else
                    {
                        if (AssetDatabase.LoadAssetAtPath <UnityObject>(meshAssetPath) != null)
                        {
                            AssetDatabase.DeleteAsset(meshAssetPath);
                        }
                    }
                    rendererPartData.mesh = mesh;

                    rendererPartDatas.Add(rendererPartData);
                }
            }
            partData.rendererParts = rendererPartDatas.ToArray();


            AssetDatabase.CreateAsset(partData, partAssetPath);
            AssetDatabase.ImportAsset(partAssetPath);

            return(partData);
        }