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); } }
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--; } }
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"); } }
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); }