// Init //------------------------------------------------------------------ public void Init(apEditor editor) { _editor = editor; _img_Info = AssetDatabase.LoadAssetAtPath <Texture2D>(apEditorUtil.ResourcePath_Icon + "AmbientInfo.png"); _str_Info = _editor.GetText(TEXT.AmbientCorrection_Info); _str_Convert = _editor.GetText(TEXT.AmbientCorrection_Convert); _str_Close = _editor.GetText(TEXT.Close); _str_DoNotShow = _editor.GetText(TEXT.AmbientCorrection_Ignore); }
// GUI //------------------------------------------------------------------ void OnGUI() { int width = (int)position.width; int height = (int)position.height; if (_editor == null || _targetPortrait == null || _funcResult == null) { CloseDialog(); return; } //만약 Portriat가 바뀌었거나 Editor가 리셋되면 닫자 if (_editor != apEditor.CurrentEditor || _targetPortrait != apEditor.CurrentEditor._portrait) { CloseDialog(); return; } //Bake 설정 EditorGUILayout.LabelField(_editor.GetText(TEXT.DLG_SetSuctomFFDGridSize)); //"Set Custom FFD Grid Size" //X, Y 개수를 표시 int width_Label = 30; int width_Value = (width - 10) - 34; GUILayout.Space(10); EditorGUILayout.BeginHorizontal(GUILayout.Width(width)); GUILayout.Space(5); EditorGUILayout.LabelField("X", GUILayout.Width(width_Label)); _nX = EditorGUILayout.IntSlider(_nX, 2, 8, GUILayout.Width(width_Value)); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(GUILayout.Width(width)); GUILayout.Space(5); EditorGUILayout.LabelField("Y", GUILayout.Width(width_Label)); _nY = EditorGUILayout.IntSlider(_nY, 2, 8, GUILayout.Width(width_Value)); EditorGUILayout.EndHorizontal(); GUILayout.Space(20); EditorGUILayout.BeginHorizontal(GUILayout.Width(width)); int width_Btn = ((width - 10) / 2) - 4; if (GUILayout.Button(_editor.GetText(TEXT.DLG_StartEdit), GUILayout.Width(width_Btn), GUILayout.Height(30))) //"Start Edit" { _funcResult(true, _loadKey, _nX, _nY); CloseDialog(); } if (GUILayout.Button(_editor.GetText(TEXT.DLG_Close), GUILayout.Width(width_Btn), GUILayout.Height(30))) //"Close" { _funcResult(false, _loadKey, _nX, _nY); CloseDialog(); } EditorGUILayout.EndHorizontal(); }
// GUI //------------------------------------------------------------------ void OnGUI() { int width = (int)position.width; int height = (int)position.height; if (_editor == null || _funcResult == null) { CloseDialog(); return; } //만약 Portriat가 바뀌었거나 Editor가 리셋되면 닫자 if (_editor != apEditor.CurrentEditor) { CloseDialog(); return; } width -= 10; //Bake 설정 EditorGUILayout.LabelField(_editor.GetText(TEXT.DLG_NewPortraitName), GUILayout.Width(width)); //"New Portrait Name" //X, Y 개수를 표시 GUILayout.Space(10); _newPortraitName = EditorGUILayout.TextField(_newPortraitName, GUILayout.Width(width)); GUILayout.Space(20); EditorGUILayout.BeginHorizontal(GUILayout.Width(width)); int width_Btn = ((width - 10) / 2) - 4; if (GUILayout.Button(_editor.GetText(TEXT.DLG_MakePortrait), GUILayout.Width(width_Btn), GUILayout.Height(30))) //"Make Portrait" { _funcResult(true, _loadKey, _newPortraitName); CloseDialog(); } if (GUILayout.Button(_editor.GetText(TEXT.DLG_Cancel), GUILayout.Width(width_Btn), GUILayout.Height(30))) //"Cancel" { _funcResult(false, _loadKey, ""); CloseDialog(); } EditorGUILayout.EndHorizontal(); }
// GUI //------------------------------------------------------------------------ void OnGUI() { int width = (int)position.width; int height = (int)position.height; if (_editor == null || _targetMeshGroup == null) { CloseDialog(); return; } try { Color prevColor = GUI.backgroundColor; //레이아웃 구조 //1. Save // - 저장 버튼 //2. Load // - 로드 버튼 // - 본 정보 리스트 // - <색상> 인덱스, 이름 -> 적용 여부 + IK + 색상 로드 // - 전체 선택 / 해제 // - 전체 IK 포함 여부, // - 옵션 : 크기 width -= 10; //1. 다이얼로그 타이틀 GUIStyle guiStyleBox = new GUIStyle(GUI.skin.box); guiStyleBox.alignment = TextAnchor.MiddleCenter; guiStyleBox.normal.textColor = apEditorUtil.BoxTextColor; GUIStyle guiStyleBox_Left = new GUIStyle(GUI.skin.textField); guiStyleBox_Left.alignment = TextAnchor.MiddleLeft; //" Export Pose" GUILayout.Box(new GUIContent(" " + _editor.GetText(TEXT.DLG_ExportPose), _editor.ImageSet.Get(apImageSet.PRESET.Rig_SaveLoad)), guiStyleBox, GUILayout.Width(width), GUILayout.Height(35)); GUILayout.Space(5); //2. 기본 정보 int widthLabel = 120; int widthValue = width - (widthLabel + 10 + 5); EditorGUILayout.LabelField(_retarget.SinglePoseFile._portraitName + " - " + _retarget.SinglePoseFile._meshGroupName); GUILayout.Space(10); EditorGUILayout.BeginHorizontal(GUILayout.Width(width)); GUILayout.Space(5); //"Pose Name.. EditorGUILayout.LabelField(_editor.GetText(TEXT.DLG_PoseName) + " : ", GUILayout.Width(widthLabel)); _retarget.SinglePoseFile._poseName = EditorGUILayout.TextField(_retarget.SinglePoseFile._poseName, GUILayout.Width(widthValue)); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(GUILayout.Width(width)); GUILayout.Space(5); //"Description EditorGUILayout.LabelField(_editor.GetText(TEXT.DLG_Description) + " : ", GUILayout.Width(widthLabel)); _retarget.SinglePoseFile._description = EditorGUILayout.TextField(_retarget.SinglePoseFile._description, GUILayout.Width(widthValue)); EditorGUILayout.EndHorizontal(); GUILayout.Space(5); //3. Export할 Bone 선택 int listHeight = height - 240; Rect lastRect = GUILayoutUtility.GetLastRect(); GUI.backgroundColor = new Color(0.9f, 0.9f, 0.9f); GUI.Box(new Rect(0, lastRect.y + 5, width + 10, listHeight), ""); List <apRetargetBonePoseUnit> bonePoseUnits = _retarget.SinglePoseFile._bones; int itemWidth = width - 20; int itemHeight = 20; GUIStyle guiStyle_ItemLabel = new GUIStyle(GUI.skin.label); guiStyle_ItemLabel.alignment = TextAnchor.MiddleLeft; _scrollList = EditorGUILayout.BeginScrollView(_scrollList, false, true, GUILayout.Width(width + 10), GUILayout.Height(listHeight)); EditorGUILayout.BeginVertical(GUILayout.Width(width - 10)); for (int i = 0; i < bonePoseUnits.Count; i++) { apRetargetBonePoseUnit boneUnit = bonePoseUnits[i]; EditorGUILayout.BeginHorizontal(GUILayout.Width(itemWidth), GUILayout.Height(itemHeight)); GUILayout.Space(5); EditorGUILayout.LabelField(new GUIContent("", _imgIcon_Bone), GUILayout.Width(itemHeight), GUILayout.Height(itemHeight)); EditorGUILayout.LabelField(boneUnit._name, guiStyle_ItemLabel, GUILayout.Width(200), GUILayout.Height(itemHeight)); GUILayout.Space(10); //"Export", "Export" if (apEditorUtil.ToggledButton_2Side(_editor.GetText(TEXT.DLG_Export), _editor.GetText(TEXT.DLG_Export), boneUnit._isExported, true, 120, itemHeight)) { boneUnit._isExported = !boneUnit._isExported; } EditorGUILayout.EndHorizontal(); } EditorGUILayout.EndVertical(); GUILayout.Space(listHeight + 100); EditorGUILayout.EndScrollView(); GUILayout.Space(10); // Select All / Deselect All EditorGUILayout.BeginHorizontal(GUILayout.Width(width + 10), GUILayout.Height(25)); GUILayout.Space(5); //"Select All" if (GUILayout.Button(_editor.GetText(TEXT.DLG_SelectAll), GUILayout.Width((width - 6) / 2), GUILayout.Height(25))) { for (int i = 0; i < bonePoseUnits.Count; i++) { apRetargetBonePoseUnit boneUnit = bonePoseUnits[i]; boneUnit._isExported = true; } } //"Deselect All" if (GUILayout.Button(_editor.GetText(TEXT.DLG_DeselectAll), GUILayout.Width((width - 6) / 2), GUILayout.Height(25))) { for (int i = 0; i < bonePoseUnits.Count; i++) { apRetargetBonePoseUnit boneUnit = bonePoseUnits[i]; boneUnit._isExported = false; } } GUILayout.Space(10); EditorGUILayout.EndHorizontal(); string strExportBtn = " " + _editor.GetText(TEXT.DLG_ExportPose); if (apEditorUtil.ToggledButton_2Side(_editor.ImageSet.Get(apImageSet.PRESET.Rig_SaveLoad), strExportBtn, strExportBtn, false, !string.IsNullOrEmpty(_retarget.SinglePoseFile._poseName), width, 30)) { //TODO. string fileFolderPath = Application.dataPath + "/../" + _editor._bonePose_BaseFolderName; string savedFileName = _retarget.SaveSinglePose(fileFolderPath); if (string.IsNullOrEmpty(savedFileName)) { _editor.Notification("Pose Save Failed", false, true); } else { _editor.Notification("Pose Saved [" + savedFileName + "]", false, false); } CloseDialog(); } if (GUILayout.Button(_editor.GetText(TEXT.DLG_Close), GUILayout.Width(width), GUILayout.Height(25))) //"Close" { CloseDialog(); } } catch (Exception ex) { Debug.LogError("Exception : " + ex); } }
// GUI //------------------------------------------------------------------------ void OnGUI() { int width = (int)position.width; int height = (int)position.height; if (_editor == null || _funcResult == null) { return; } Color prevColor = GUI.backgroundColor; GUI.backgroundColor = new Color(0.9f, 0.9f, 0.9f); GUI.Box(new Rect(0, 35, width, height - (90)), ""); GUI.backgroundColor = prevColor; EditorGUILayout.BeginVertical(); Texture2D iconImageCategory = _editor.ImageSet.Get(apImageSet.PRESET.Hierarchy_FoldDown); Texture2D iconMeshGroup = _editor.ImageSet.Get(apImageSet.PRESET.Hierarchy_MeshGroup); GUIStyle guiStyle_None = new GUIStyle(GUIStyle.none); guiStyle_None.normal.textColor = GUI.skin.label.normal.textColor; GUIStyle guiStyle_Selected = new GUIStyle(GUIStyle.none); if (EditorGUIUtility.isProSkin) { guiStyle_Selected.normal.textColor = Color.cyan; } else { guiStyle_Selected.normal.textColor = Color.white; } GUIStyle guiStyle_Center = new GUIStyle(GUIStyle.none); guiStyle_Center.normal.textColor = GUI.skin.label.normal.textColor; guiStyle_Center.alignment = TextAnchor.MiddleCenter; GUILayout.Space(10); GUILayout.Button(_editor.GetText(TEXT.DLG_SelectMeshGroupToLink), guiStyle_Center, GUILayout.Width(width), GUILayout.Height(15)); //<투명 버튼//"Select Mesh Group to Link" GUILayout.Space(10); _scrollList = EditorGUILayout.BeginScrollView(_scrollList, GUILayout.Width(width), GUILayout.Height(height - (90))); GUILayout.Button(new GUIContent(_editor.GetText(TEXT.DLG_MeshGroups), iconImageCategory), guiStyle_None, GUILayout.Height(20)); //<투명 버튼//"Mesh Groups" //GUILayout.Space(10); for (int i = 0; i < _selectableMeshGroups.Count; i++) { GUIStyle curGUIStyle = guiStyle_None; if (_selectableMeshGroups[i] == _selectedMeshGroup) { Rect lastRect = GUILayoutUtility.GetLastRect(); prevColor = GUI.backgroundColor; if (EditorGUIUtility.isProSkin) { GUI.backgroundColor = new Color(0.0f, 1.0f, 1.0f, 1.0f); } else { GUI.backgroundColor = new Color(0.4f, 0.8f, 1.0f, 1.0f); } GUI.Box(new Rect(lastRect.x, lastRect.y + 20, width, 20), ""); GUI.backgroundColor = prevColor; curGUIStyle = guiStyle_Selected; } EditorGUILayout.BeginHorizontal(GUILayout.Width(width - 50)); GUILayout.Space(15); if (GUILayout.Button(new GUIContent(" " + _selectableMeshGroups[i]._name, iconMeshGroup), curGUIStyle, GUILayout.Width(width - 35), GUILayout.Height(20))) { _selectedMeshGroup = _selectableMeshGroups[i]; } EditorGUILayout.EndHorizontal(); } EditorGUILayout.EndScrollView(); EditorGUILayout.EndVertical(); GUILayout.Space(10); EditorGUILayout.BeginHorizontal(); bool isClose = false; if (GUILayout.Button(_editor.GetText(TEXT.DLG_Select), GUILayout.Height(30))) //"Select" { if (_selectedMeshGroup != null) { _funcResult(true, _loadKey, _selectedMeshGroup, _targetAnimClip); } else { _funcResult(false, _loadKey, null, null); } isClose = true; } if (GUILayout.Button(_editor.GetText(TEXT.DLG_Close), GUILayout.Height(30))) //"Close" { _funcResult(false, _loadKey, null, null); isClose = true; } EditorGUILayout.EndHorizontal(); if (isClose) { CloseDialog(); } }
// GUI //------------------------------------------------------------------------ void OnGUI() { int width = (int)position.width; int height = (int)position.height; if (_editor == null || _funcResult == null) { return; } Color prevColor = GUI.backgroundColor; GUI.backgroundColor = new Color(0.9f, 0.9f, 0.9f); GUI.Box(new Rect(0, 35, width, height - (90)), ""); GUI.backgroundColor = prevColor; EditorGUILayout.BeginVertical(); Texture2D iconImageCategory = _editor.ImageSet.Get(apImageSet.PRESET.Hierarchy_FoldDown); GUIStyle guiStyle_None = new GUIStyle(GUIStyle.none); guiStyle_None.normal.textColor = GUI.skin.label.normal.textColor; GUIStyle guiStyle_Selected = new GUIStyle(GUIStyle.none); if (EditorGUIUtility.isProSkin) { guiStyle_Selected.normal.textColor = Color.cyan; } else { guiStyle_Selected.normal.textColor = Color.white; } GUIStyle guiStyle_Center = new GUIStyle(GUIStyle.none); guiStyle_Center.normal.textColor = GUI.skin.label.normal.textColor; guiStyle_Center.alignment = TextAnchor.MiddleCenter; GUILayout.Space(10); //"Select Timeline Type to Add" GUILayout.Button(_editor.GetText(TEXT.DLG_SelectTimelineTypeToAdd), guiStyle_Center, GUILayout.Width(width), GUILayout.Height(15)); //<투명 버튼 GUILayout.Space(10); _scrollList = EditorGUILayout.BeginScrollView(_scrollList, GUILayout.Width(width), GUILayout.Height(height - (90))); //"Timeline Types" if (_guiContent_TimelineTypes == null) { _guiContent_TimelineTypes = apGUIContentWrapper.Make(_editor.GetText(TEXT.DLG_TimelineTypes), false, iconImageCategory); } GUILayout.Button(_guiContent_TimelineTypes.Content, guiStyle_None, GUILayout.Height(20)); //<투명 버튼 //항목의 이름 if (_guiContent_LinkDataNameAndIcon == null) { _guiContent_LinkDataNameAndIcon = new apGUIContentWrapper(false); } //GUILayout.Space(10); for (int i = 0; i < _linkDataList.Count; i++) { GUIStyle curGUIStyle = guiStyle_None; if (_linkDataList[i] == _selectedLinkData) { Rect lastRect = GUILayoutUtility.GetLastRect(); prevColor = GUI.backgroundColor; if (EditorGUIUtility.isProSkin) { GUI.backgroundColor = new Color(0.0f, 1.0f, 1.0f, 1.0f); } else { GUI.backgroundColor = new Color(0.4f, 0.8f, 1.0f, 1.0f); } GUI.Box(new Rect(lastRect.x, lastRect.y + 20, width, 20), ""); GUI.backgroundColor = prevColor; curGUIStyle = guiStyle_Selected; } EditorGUILayout.BeginHorizontal(GUILayout.Width(width - 50)); GUILayout.Space(15); //이전 //if (GUILayout.Button(new GUIContent(" " + _linkDataList[i]._name, _linkDataList[i]._icon), curGUIStyle, GUILayout.Width(width - 35), GUILayout.Height(20))) //변경 _guiContent_LinkDataNameAndIcon.ClearText(false); _guiContent_LinkDataNameAndIcon.AppendSpaceText(1, false); _guiContent_LinkDataNameAndIcon.AppendText(_linkDataList[i]._name, true); _guiContent_LinkDataNameAndIcon.SetImage(_linkDataList[i]._icon); if (GUILayout.Button(_guiContent_LinkDataNameAndIcon.Content, curGUIStyle, GUILayout.Width(width - 35), GUILayout.Height(20))) { _selectedLinkData = _linkDataList[i]; } EditorGUILayout.EndHorizontal(); } EditorGUILayout.EndScrollView(); EditorGUILayout.EndVertical(); GUILayout.Space(10); EditorGUILayout.BeginHorizontal(); bool isClose = false; if (GUILayout.Button(_editor.GetText(TEXT.DLG_Select), GUILayout.Height(30))) //"Select" { if (_selectedLinkData != null) { _funcResult(true, _loadKey, _selectedLinkData._linkType, _selectedLinkData._modifierID, _targetAnimClip); } else { _funcResult(false, _loadKey, apAnimClip.LINK_TYPE.AnimatedModifier, -1, null); } isClose = true; } if (GUILayout.Button(_editor.GetText(TEXT.DLG_Close), GUILayout.Height(30))) //"Close" { _funcResult(false, _loadKey, apAnimClip.LINK_TYPE.AnimatedModifier, -1, null); isClose = true; } EditorGUILayout.EndHorizontal(); if (isClose) { CloseDialog(); } }
// GUI //------------------------------------------------------------------ void OnGUI() { int width = (int)position.width; int height = (int)position.height; if (_editor == null || _targetPortrait == null) { CloseDialog(); return; } //만약 Portriat가 바뀌었거나 Editor가 리셋되면 닫자 if (_editor != apEditor.CurrentEditor || _targetPortrait != apEditor.CurrentEditor._portrait) { CloseDialog(); return; } //Sorting Layer를 추가하자 if (_sortingLayerNames == null || _sortingLayerIDs == null) { _sortingLayerNames = new string[SortingLayer.layers.Length]; _sortingLayerIDs = new int[SortingLayer.layers.Length]; } else if (_sortingLayerNames.Length != SortingLayer.layers.Length || _sortingLayerIDs.Length != SortingLayer.layers.Length) { _sortingLayerNames = new string[SortingLayer.layers.Length]; _sortingLayerIDs = new int[SortingLayer.layers.Length]; } for (int i = 0; i < SortingLayer.layers.Length; i++) { _sortingLayerNames[i] = SortingLayer.layers[i].name; _sortingLayerIDs[i] = SortingLayer.layers[i].id; } int width_2Btn = (width - 14) / 2; EditorGUILayout.BeginHorizontal(GUILayout.Width(width), GUILayout.Height(25)); GUILayout.Space(5); if (apEditorUtil.ToggledButton(_editor.GetText(TEXT.DLG_Bake), _tab == TAB.Bake, width_2Btn, 25)) { _tab = TAB.Bake; } if (apEditorUtil.ToggledButton(_editor.GetText(TEXT.DLG_Setting), _tab == TAB.Options, width_2Btn, 25)) { _tab = TAB.Options; } EditorGUILayout.EndHorizontal(); if (_tab == TAB.Bake) { GUILayout.Space(5); // 1. Bake에 대한 UI //Bake 설정 //EditorGUILayout.LabelField(_editor.GetText(TEXT.DLG_BakeSetting));//"Bake Setting" //GUILayout.Space(5); EditorGUILayout.ObjectField(_editor.GetText(TEXT.DLG_Portrait), _targetPortrait, typeof(apPortrait), true); //"Portait" GUILayout.Space(5); //"Bake Scale" float prevBakeScale = _targetPortrait._bakeScale; _targetPortrait._bakeScale = EditorGUILayout.FloatField(_editor.GetText(TEXT.DLG_BakeScale), _targetPortrait._bakeScale); //"Z Per Depth" float prevBakeZSize = _targetPortrait._bakeZSize; _targetPortrait._bakeZSize = EditorGUILayout.FloatField(_editor.GetText(TEXT.DLG_ZPerDepth), _targetPortrait._bakeZSize); if (_targetPortrait._bakeZSize < 0.5f) { _targetPortrait._bakeZSize = 0.5f; } if (prevBakeScale != _targetPortrait._bakeScale || prevBakeZSize != _targetPortrait._bakeZSize) { apEditorUtil.SetEditorDirty(); } //Bake 버튼 GUILayout.Space(10); if (GUILayout.Button(_editor.GetText(TEXT.DLG_Bake), GUILayout.Height(45))) //"Bake" { GUI.FocusControl(null); //CheckChangedProperties(nextRootScale, nextZScale); apEditorUtil.SetEditorDirty(); //------------------------------------- // Bake 함수를 실행한다. << 중요오오오오 //------------------------------------- apBakeResult bakeResult = _editor.Controller.Bake(); _editor.Notification("[" + _targetPortrait.name + "] is Baked", false, false); if (bakeResult.NumUnlinkedExternalObject > 0) { EditorUtility.DisplayDialog(_editor.GetText(TEXT.BakeWarning_Title), _editor.GetTextFormat(TEXT.BakeWarning_Body, bakeResult.NumUnlinkedExternalObject), _editor.GetText(TEXT.Okay)); } } GUILayout.Space(10); apEditorUtil.GUI_DelimeterBoxH(width - 10); GUILayout.Space(10); //최적화 Bake EditorGUILayout.LabelField(_editor.GetText(TEXT.DLG_OptimizedBaking)); //"Optimized Baking" //"Target" apPortrait nextOptPortrait = (apPortrait)EditorGUILayout.ObjectField(_editor.GetText(TEXT.DLG_Target), _targetPortrait._bakeTargetOptPortrait, typeof(apPortrait), true); if (nextOptPortrait != _targetPortrait._bakeTargetOptPortrait) { //타겟을 바꾸었다. bool isChanged = false; if (nextOptPortrait != null) { //1. 다른 Portrait를 선택했다. if (!nextOptPortrait._isOptimizedPortrait) { //1-1. 최적화된 객체가 아니다. EditorUtility.DisplayDialog(_editor.GetText(TEXT.OptBakeError_Title), _editor.GetText(TEXT.OptBakeError_NotOptTarget_Body), _editor.GetText(TEXT.Close)); } else if (nextOptPortrait._bakeSrcEditablePortrait != _targetPortrait) { //1-2. 다른 대상으로부터 Bake된 Portrait같다. (물어보고 계속) bool isResult = EditorUtility.DisplayDialog(_editor.GetText(TEXT.OptBakeError_Title), _editor.GetText(TEXT.OptBakeError_SrcMatchError_Body), _editor.GetText(TEXT.Okay), _editor.GetText(TEXT.Cancel)); if (isResult) { //뭐 선택하겠다는데요 뭐.. isChanged = true; } } else { //1-3. 오케이. 변경 가능 isChanged = true; } } else { //2. 선택을 해제했다. isChanged = true; } if (isChanged) { //Target을 변경한다. apEditorUtil.SetRecord_Portrait(apUndoGroupData.ACTION.Portrait_SettingChanged, _editor, _targetPortrait, null, false); _targetPortrait._bakeTargetOptPortrait = nextOptPortrait; } } string optBtnText = ""; if (_targetPortrait._bakeTargetOptPortrait != null) { //optBtnText = "Optimized Bake to\n[" + _targetPortrait._bakeTargetOptPortrait.gameObject.name + "]"; optBtnText = string.Format("{0}\n[{1}]", _editor.GetText(TEXT.DLG_OptimizedBakeTo), _targetPortrait._bakeTargetOptPortrait.gameObject.name); } else { //optBtnText = "Optimized Bake\n(Make New GameObject)"; optBtnText = _editor.GetText(TEXT.DLG_OptimizedBakeMakeNew); } GUILayout.Space(10); if (GUILayout.Button(optBtnText, GUILayout.Height(45))) { GUI.FocusControl(null); //CheckChangedProperties(nextRootScale, nextZScale); //Optimized Bake를 하자 apBakeResult bakeResult = _editor.Controller.OptimizedBake(_targetPortrait, _targetPortrait._bakeTargetOptPortrait); if (bakeResult.NumUnlinkedExternalObject > 0) { EditorUtility.DisplayDialog(_editor.GetText(TEXT.BakeWarning_Title), _editor.GetTextFormat(TEXT.BakeWarning_Body, bakeResult.NumUnlinkedExternalObject), _editor.GetText(TEXT.Okay)); } _editor.Notification("[" + _targetPortrait.name + "] is Baked (Optimized)", false, false); } } else { //Vector2 curScroll = (_tab == TAB.Bake) ? _scroll_Bake : _scroll_Options; _scroll_Options = EditorGUILayout.BeginScrollView(_scroll_Options, false, true, GUILayout.Width(width), GUILayout.Height(height - 30)); EditorGUILayout.BeginVertical(GUILayout.Width(width - 24)); GUILayout.Space(5); width -= 24; // 2. Option에 대한 UI //1. Gamma Space Space bool prevBakeGamma = _editor._isBakeColorSpaceToGamma; int iPrevColorSpace = prevBakeGamma ? 0 : 1; int iNextColorSpace = EditorGUILayout.Popup(_editor.GetUIWord(UIWORD.ColorSpace), iPrevColorSpace, _colorSpaceNames); if (iNextColorSpace != iPrevColorSpace) { apEditorUtil.SetRecord_Portrait(apUndoGroupData.ACTION.Portrait_SettingChanged, _editor, _targetPortrait, null, false); if (iNextColorSpace == 0) { //Gamma _editor._isBakeColorSpaceToGamma = true; } else { //Linear _editor._isBakeColorSpaceToGamma = false; } } GUILayout.Space(10); //2. Sorting Layer int prevSortingLayerID = _editor._portrait._sortingLayerID; int prevSortingOrder = _editor._portrait._sortingOrder; int layerIndex = -1; for (int i = 0; i < SortingLayer.layers.Length; i++) { if (SortingLayer.layers[i].id == _editor._portrait._sortingLayerID) { //찾았다. layerIndex = i; break; } } if (layerIndex < 0) { apEditorUtil.SetRecord_Portrait(apUndoGroupData.ACTION.Portrait_SettingChanged, _editor, _targetPortrait, null, false); //어라 레이어가 없는데용.. //초기화해야겠다. _editor._portrait._sortingLayerID = -1; if (SortingLayer.layers.Length > 0) { _editor._portrait._sortingLayerID = SortingLayer.layers[0].id; layerIndex = 0; } } int nextIndex = EditorGUILayout.Popup(_editor.GetText(TEXT.SortingLayer), layerIndex, _sortingLayerNames); //"Sorting Layer" if (nextIndex != layerIndex) { apEditorUtil.SetRecord_Portrait(apUndoGroupData.ACTION.Portrait_SettingChanged, _editor, _targetPortrait, null, false); //레이어가 변경되었다. if (nextIndex >= 0 && nextIndex < SortingLayer.layers.Length) { //LayerID 변경 _editor._portrait._sortingLayerID = SortingLayer.layers[nextIndex].id; } } _editor._portrait._sortingOrder = EditorGUILayout.IntField(_editor.GetText(TEXT.SortingOrder), _editor._portrait._sortingOrder); //"Sorting Order" GUILayout.Space(10); //3. 메카님 사용 여부 //EditorGUILayout.LabelField("Animation Settings"); bool prevIsUsingMecanim = _targetPortrait._isUsingMecanim; string prevMecanimPath = _targetPortrait._mecanimAnimClipResourcePath; _targetPortrait._isUsingMecanim = EditorGUILayout.Toggle(_editor.GetText(TEXT.IsMecanimAnimation), _targetPortrait._isUsingMecanim); //"Is Mecanim Animation" EditorGUILayout.LabelField(_editor.GetText(TEXT.AnimationClipExportPath)); //"Animation Clip Export Path" GUIStyle guiStyle_ChangeBtn = new GUIStyle(GUI.skin.button); guiStyle_ChangeBtn.margin = GUI.skin.textField.margin; guiStyle_ChangeBtn.border = GUI.skin.textField.border; EditorGUILayout.BeginHorizontal(GUILayout.Width(width), GUILayout.Height(20)); GUILayout.Space(5); EditorGUILayout.TextField(_targetPortrait._mecanimAnimClipResourcePath, GUILayout.Width(width - (70 + 15))); if (GUILayout.Button(_editor.GetText(TEXT.DLG_Change), guiStyle_ChangeBtn, GUILayout.Width(70), GUILayout.Height(18))) { string defaultPath = _targetPortrait._mecanimAnimClipResourcePath; if (string.IsNullOrEmpty(defaultPath)) { defaultPath = Application.dataPath; } string nextPath = EditorUtility.SaveFolderPanel("Select to export animation clips", defaultPath, ""); if (!string.IsNullOrEmpty(nextPath)) { if (apEditorUtil.IsInAssetsFolder(nextPath)) { //유효한 폴더인 경우 _targetPortrait._mecanimAnimClipResourcePath = nextPath; } else { //유효한 폴더가 아닌 경우 EditorUtility.DisplayDialog("Invalid Folder Path", "Invalid Clip Path", "Close"); } } GUI.FocusControl(null); } EditorGUILayout.EndHorizontal(); GUILayout.Space(10); //4. Important //"Is Important" bool nextImportant = EditorGUILayout.Toggle(new GUIContent(_editor.GetText(TEXT.DLG_Setting_IsImportant), "When this setting is on, it always updates and the physics effect works."), _targetPortrait._isImportant); if (nextImportant != _targetPortrait._isImportant) { apEditorUtil.SetRecord_Portrait(apUndoGroupData.ACTION.Portrait_SettingChanged, _editor, _targetPortrait, null, false); _targetPortrait._isImportant = nextImportant; } //"FPS (Important Off)" int nextFPS = EditorGUILayout.DelayedIntField(new GUIContent(_editor.GetText(TEXT.DLG_Setting_FPS), "This setting is used when <Important> is off"), _targetPortrait._FPS); if (_targetPortrait._FPS != nextFPS) { apEditorUtil.SetRecord_Portrait(apUndoGroupData.ACTION.Portrait_SettingChanged, _editor, _targetPortrait, null, false); if (nextFPS < 10) { nextFPS = 10; } _targetPortrait._FPS = nextFPS; } GUILayout.Space(10); //5. Billboard + Perspective apPortrait.BILLBOARD_TYPE nextBillboardType = (apPortrait.BILLBOARD_TYPE)EditorGUILayout.Popup(_editor.GetText(TEXT.DLG_Billboard), (int)_targetPortrait._billboardType, _billboardTypeNames); if (nextBillboardType != _targetPortrait._billboardType) { apEditorUtil.SetRecord_Portrait(apUndoGroupData.ACTION.Portrait_SettingChanged, _editor, _targetPortrait, null, false); _targetPortrait._billboardType = nextBillboardType; } GUILayout.Space(10); //6. Shadow apPortrait.SHADOW_CASTING_MODE nextChastShadows = (apPortrait.SHADOW_CASTING_MODE)EditorGUILayout.EnumPopup(_editor.GetUIWord(UIWORD.CastShadows), _targetPortrait._meshShadowCastingMode); bool nextReceiveShaodw = EditorGUILayout.Toggle(_editor.GetUIWord(UIWORD.ReceiveShadows), _targetPortrait._meshReceiveShadow); if (nextChastShadows != _targetPortrait._meshShadowCastingMode || nextReceiveShaodw != _targetPortrait._meshReceiveShadow) { apEditorUtil.SetRecord_Portrait(apUndoGroupData.ACTION.Portrait_SettingChanged, _editor, _targetPortrait, null, false); _targetPortrait._meshShadowCastingMode = nextChastShadows; _targetPortrait._meshReceiveShadow = nextReceiveShaodw; } GUILayout.Space(10); #if UNITY_2018_2_OR_NEWER //7. LWRP //LWRP 쉐이더를 쓸지 여부와 다시 강제로 생성하기 버튼을 만들자. bool prevUseLWRP = _editor._isUseLWRPShader; int iPrevUseLWRP = prevUseLWRP ? 1 : 0; int iNextUseLWRP = EditorGUILayout.Popup("Render Pipeline", iPrevUseLWRP, _renderPipelineNames); if (iNextUseLWRP != iPrevUseLWRP) { apEditorUtil.SetRecord_Portrait(apUndoGroupData.ACTION.Portrait_SettingChanged, _editor, _targetPortrait, null, false); if (iNextUseLWRP == 0) { //사용 안함 _editor._isUseLWRPShader = false; } else { //LWRP 사용함 _editor._isUseLWRPShader = true; } } if (GUILayout.Button("Generate Lightweight Shaders")) { apShaderGenerator shaderGenerator = new apShaderGenerator(); shaderGenerator.GenerateLWRPShaders(); } GUILayout.Space(10); #endif //11.7 추가 : Ambient Light를 검은색으로 만든다. GUILayout.Space(10); if (GUILayout.Button(_editor.GetText(TEXT.DLG_AmbientToBlack), GUILayout.Height(20))) { MakeAmbientLightToBlack(); } //CheckChangedProperties(nextRootScale, nextZScale); if (prevSortingLayerID != _editor._portrait._sortingLayerID || prevSortingOrder != _editor._portrait._sortingOrder || prevIsUsingMecanim != _targetPortrait._isUsingMecanim || !string.Equals(prevMecanimPath, _targetPortrait._mecanimAnimClipResourcePath) || prevBakeGamma != _editor._isBakeColorSpaceToGamma #if UNITY_2018_2_OR_NEWER || prevUseLWRP != _editor._isUseLWRPShader #endif ) { apEditorUtil.SetEditorDirty(); _editor.SaveEditorPref(); } GUILayout.Space(height + 500); EditorGUILayout.EndVertical(); EditorGUILayout.EndScrollView(); } GUILayout.Space(5); }
// GUI //------------------------------------------------------------------------ void OnGUI() { int width = (int)position.width; int height = (int)position.height; if (_editor == null || _funcResult == null) { return; } Color prevColor = GUI.backgroundColor; GUI.backgroundColor = new Color(0.9f, 0.9f, 0.9f); GUI.Box(new Rect(0, 35, width, height - (90 + 12)), ""); GUI.backgroundColor = prevColor; EditorGUILayout.BeginVertical(); Texture2D iconImageCategory = _editor.ImageSet.Get(apImageSet.PRESET.Hierarchy_FoldDown); Texture2D iconBone = _editor.ImageSet.Get(apImageSet.PRESET.Modifier_Rigging); Texture2D iconImage_FoldDown = _editor.ImageSet.Get(apImageSet.PRESET.Hierarchy_FoldDown); Texture2D iconImage_FoldRight = _editor.ImageSet.Get(apImageSet.PRESET.Hierarchy_FoldRight); GUIStyle guiStyle = new GUIStyle(GUIStyle.none); guiStyle.normal.textColor = GUI.skin.label.normal.textColor; guiStyle.alignment = TextAnchor.MiddleLeft; GUIStyle guiStyle_Selected = new GUIStyle(GUIStyle.none); if (EditorGUIUtility.isProSkin) { guiStyle_Selected.normal.textColor = Color.cyan; } else { guiStyle_Selected.normal.textColor = Color.white; } guiStyle_Selected.alignment = TextAnchor.MiddleLeft; GUIStyle guiStyle_NotSelectable = new GUIStyle(GUIStyle.none); guiStyle_NotSelectable.normal.textColor = Color.red; guiStyle_NotSelectable.alignment = TextAnchor.MiddleLeft; GUIStyle guiStyle_Center = new GUIStyle(GUIStyle.none); guiStyle_Center.normal.textColor = GUI.skin.label.normal.textColor; guiStyle_Center.alignment = TextAnchor.MiddleCenter; GUIContent guiContent_Bone = new GUIContent(iconBone); GUILayout.Space(10); //GUILayout.Button("Select a Bone to Link", guiStyle_Center, GUILayout.Width(width), GUILayout.Height(15));//<투명 버튼 //"Search " _strSearchKeyword = EditorGUILayout.DelayedTextField(_editor.GetText(TEXT.DLG_Search) + " ", _strSearchKeyword, GUILayout.Width(width - 20), GUILayout.Height(15)); if (string.IsNullOrEmpty(_strSearchKeyword)) { _isSearched = false; } else { _isSearched = true; } GUILayout.Space(10); _scrollList = EditorGUILayout.BeginScrollView(_scrollList, GUILayout.Width(width), GUILayout.Height(height - (90))); //_targetMeshGroup._name + " Bones" GUILayout.Button(new GUIContent(string.Format("{0} {1}", _targetMeshGroup._name, _editor.GetText(TEXT.DLG_Bones)), iconImageCategory), guiStyle, GUILayout.Height(20)); //<투명 버튼 //GUILayout.Space(10); for (int i = 0; i < _boneUnits_Root.Count; i++) { DrawBoneUnit(_boneUnits_Root[i], 0, width, iconImage_FoldDown, iconImage_FoldRight, guiContent_Bone, guiStyle, guiStyle_Selected, guiStyle_NotSelectable, _scrollList.x); } GUILayout.Space(50); EditorGUILayout.EndScrollView(); EditorGUILayout.EndVertical(); GUILayout.Space(10); EditorGUILayout.BeginHorizontal(); bool isClose = false; bool isSelectBtnAvailable = (_selectedBoneUnit != null && _selectedBoneUnit._isSelectable); if (apEditorUtil.ToggledButton(_editor.GetText(TEXT.DLG_Select), false, isSelectBtnAvailable, (width / 2) - 8, 30)) //"Select" { if (_selectedBoneUnit != null) { //선택 가능한 Unit이라면 Return if (_selectedBoneUnit._isSelectable) { _funcResult(true, _loadKey, _selectedBoneUnit._bone == null, _selectedBoneUnit._bone, _targetBone, _requestType); isClose = true; } } } if (apEditorUtil.ToggledButton(_editor.GetText(TEXT.DLG_Close), false, true, (width / 2) - 8, 30)) //"Close" { //_funcResult(false, _loadKey, null, null); _funcResult(false, _loadKey, false, null, null, _requestType); isClose = true; } EditorGUILayout.EndHorizontal(); if (isClose) { CloseDialog(); } }
// GUI //------------------------------------------------------------------ void OnGUI() { bool isChanged = false; int width = (int)position.width; int height = (int)position.height; if (_editor == null || _targetPortrait == null) { //Debug.LogError("Exit - Editor / Portrait is Null"); CloseDialog(); return; } //int height_top = 30; //int height_bottom = 35 + 40; //int height_middle = height - (height_top + height_bottom); int height_middle = 370; GUILayout.Space(5); EditorGUILayout.LabelField(_editor.GetText(TEXT.DLG_ModLockSettings), GUILayout.Height(25)); //"Modifier Lock Settings" GUI.Box(new Rect(0, 30, width / 2, 300), ""); GUI.Box(new Rect(width / 2 - 1, 30, width / 2 + 1, 300), ""); Texture2D img_Lock = _editor.ImageSet.Get(apImageSet.PRESET.Edit_ModLock); Texture2D img_Unlock = _editor.ImageSet.Get(apImageSet.PRESET.Edit_ModUnlock); GUIStyle guiStyle_Title = new GUIStyle(GUI.skin.label); guiStyle_Title.alignment = TextAnchor.MiddleCenter; GUIStyle guiStyle_Box = new GUIStyle(GUI.skin.box); guiStyle_Box.alignment = TextAnchor.MiddleCenter; int width_half = (width - 10) / 2; EditorGUILayout.BeginVertical(GUILayout.Width(width), GUILayout.Height(height_middle)); EditorGUILayout.BeginHorizontal(GUILayout.Width(width), GUILayout.Height(40)); GUILayout.Space(5); //Lock Mode / Unlock Mode EditorGUILayout.LabelField(new GUIContent(" " + _editor.GetText(TEXT.DLG_ModLockMode), img_Lock), guiStyle_Title, GUILayout.Width(width_half), GUILayout.Height(40)); EditorGUILayout.LabelField(new GUIContent(" " + _editor.GetText(TEXT.DLG_ModUnlockMode), img_Unlock), guiStyle_Title, GUILayout.Width(width_half), GUILayout.Height(40)); EditorGUILayout.EndHorizontal(); GUILayout.Space(5); Color prevColor = GUI.backgroundColor; //1. 설명 EditorGUILayout.BeginHorizontal(GUILayout.Width(width), GUILayout.Height(60)); GUILayout.Space(5); GUI.backgroundColor = new Color(prevColor.r * 1.8f, prevColor.g * 0.7f, prevColor.b * 0.7f, 1.0f); //"Other than the selected Modifier\nwill not be executed." GUILayout.Box(_editor.GetText(TEXT.DLG_ModLockDescription), guiStyle_Box, GUILayout.Width(width_half - 5), GUILayout.Height(60)); GUILayout.Space(5); GUI.backgroundColor = new Color(prevColor.r * 0.7f, prevColor.g * 1.8f, prevColor.b * 1.8f, 1.0f); //"Except Modifiers which are of the same type\nor can not be edited at the same time,\nothers are executed." GUILayout.Box(_editor.GetText(TEXT.DLG_ModUnlockDescription), guiStyle_Box, GUILayout.Width(width_half - 5), GUILayout.Height(60)); GUI.backgroundColor = prevColor; EditorGUILayout.EndHorizontal(); GUILayout.Space(5); //2. 어떤 객체가 Modifier나 Timeline Layer에 등록 안된 경우, 배타적인 계산을 하지 않는다. //Lock On인 경우 없다. //"Calculating transformations\nof unregistered objects" string strOpt_CalculateIfNotAddedOther_On = _editor.GetText(TEXT.DLG_ModLockCalculateUnregisteredObj); EditorGUILayout.BeginHorizontal(GUILayout.Width(width), GUILayout.Height(40)); GUILayout.Space(5 + width_half + 5); if (apEditorUtil.ToggledButton_2Side(strOpt_CalculateIfNotAddedOther_On, strOpt_CalculateIfNotAddedOther_On, _editor._modLockOption_CalculateIfNotAddedOther, true, width_half - 5, 40)) { _editor._modLockOption_CalculateIfNotAddedOther = !_editor._modLockOption_CalculateIfNotAddedOther; isChanged = true; _editor.SaveEditorPref(); } EditorGUILayout.EndHorizontal(); GUILayout.Space(5); //3. Color Preview //"Render Calculated Colors" string strOpt_ColorPreview = _editor.GetText(TEXT.DLG_ModLockRenderCalculatedColors); EditorGUILayout.BeginHorizontal(GUILayout.Width(width), GUILayout.Height(30)); GUILayout.Space(5); if (apEditorUtil.ToggledButton_2Side(strOpt_ColorPreview, strOpt_ColorPreview, _editor._modLockOption_ColorPreview_Lock, true, width_half - 5, 30)) { _editor._modLockOption_ColorPreview_Lock = !_editor._modLockOption_ColorPreview_Lock; isChanged = true; _editor.SaveEditorPref(); } GUILayout.Space(5); if (apEditorUtil.ToggledButton_2Side(strOpt_ColorPreview, strOpt_ColorPreview, _editor._modLockOption_ColorPreview_Unlock, true, width_half - 5, 30)) { _editor._modLockOption_ColorPreview_Unlock = !_editor._modLockOption_ColorPreview_Unlock; isChanged = true; _editor.SaveEditorPref(); } EditorGUILayout.EndHorizontal(); GUILayout.Space(5); //4. Bone Preview //"Preview Calculated Bones" string strOpt_BonePreview = _editor.GetText(TEXT.DLG_ModLockPreviewCalculatedBones); EditorGUILayout.BeginHorizontal(GUILayout.Width(width), GUILayout.Height(30)); GUILayout.Space(5); if (apEditorUtil.ToggledButton_2Side(strOpt_BonePreview, strOpt_BonePreview, _editor._modLockOption_BonePreview_Lock, true, width_half - 5, 30)) { _editor._modLockOption_BonePreview_Lock = !_editor._modLockOption_BonePreview_Lock; isChanged = true; _editor.SaveEditorPref(); } GUILayout.Space(5); if (apEditorUtil.ToggledButton_2Side(strOpt_BonePreview, strOpt_BonePreview, _editor._modLockOption_BonePreview_Unlock, true, width_half - 5, 30)) { _editor._modLockOption_BonePreview_Unlock = !_editor._modLockOption_BonePreview_Unlock; isChanged = true; _editor.SaveEditorPref(); } EditorGUILayout.EndHorizontal(); GUILayout.Space(5); //5. Mesh Preview //string strOpt_MeshPreview = "Preview Calculated Meshes"; //EditorGUILayout.BeginHorizontal(GUILayout.Width(width), GUILayout.Height(30)); //GUILayout.Space(5); //if(apEditorUtil.ToggledButton_2Side(strOpt_MeshPreview, strOpt_MeshPreview, // _editor._modLockOption_MeshPreview_Lock, // true, // width_half - 5, 30)) //{ // _editor._modLockOption_MeshPreview_Lock = !_editor._modLockOption_MeshPreview_Lock; // isChanged = true; // _editor.SaveEditorPref(); //} //GUILayout.Space(5); //if(apEditorUtil.ToggledButton_2Side(strOpt_MeshPreview, strOpt_MeshPreview, // _editor._modLockOption_MeshPreview_Unlock, // true, // width_half - 5, 30)) //{ // _editor._modLockOption_MeshPreview_Unlock = !_editor._modLockOption_MeshPreview_Unlock; // isChanged = true; // _editor.SaveEditorPref(); //} //EditorGUILayout.EndHorizontal(); //GUILayout.Space(5); //6. Modifier List UI //"Show Modifier List" string strOpt_ModifierListUI = _editor.GetText(TEXT.DLG_ModLockShowModifierList); EditorGUILayout.BeginHorizontal(GUILayout.Width(width), GUILayout.Height(30)); GUILayout.Space(5); if (apEditorUtil.ToggledButton_2Side(strOpt_ModifierListUI, strOpt_ModifierListUI, _editor._modLockOption_ModListUI_Lock, true, width_half - 5, 30)) { _editor._modLockOption_ModListUI_Lock = !_editor._modLockOption_ModListUI_Lock; isChanged = true; _editor.SaveEditorPref(); } GUILayout.Space(5); if (apEditorUtil.ToggledButton_2Side(strOpt_ModifierListUI, strOpt_ModifierListUI, _editor._modLockOption_ModListUI_Unlock, true, width_half - 5, 30)) { _editor._modLockOption_ModListUI_Unlock = !_editor._modLockOption_ModListUI_Unlock; isChanged = true; _editor.SaveEditorPref(); } EditorGUILayout.EndHorizontal(); GUILayout.Space(15); //7. Preview 색상 //"Preview Color" EditorGUILayout.LabelField(_editor.GetText(TEXT.DLG_ModLockPreviewColor)); //try //{ // Color nextColor = EditorGUILayout.ColorField("Mesh Preview Color", _editor._modLockOption_MeshPreviewColor); // if(!IsSameColor(nextColor, _editor._modLockOption_MeshPreviewColor)) // { // _editor._modLockOption_MeshPreviewColor = nextColor; // isChanged = true; // _editor.SaveEditorPref(); // } //} //catch(Exception) { } try { //"Bone Preview Color" _editor._modLockOption_BonePreviewColor = EditorGUILayout.ColorField(_editor.GetText(TEXT.DLG_ModLockBonePreviewColor), _editor._modLockOption_BonePreviewColor); } catch (Exception) { } EditorGUILayout.EndVertical(); //"Restore Settings" if (GUILayout.Button(_editor.GetText(TEXT.DLG_ModLockRestoreSettings), GUILayout.Height(20))) { //TODO _editor._modLockOption_CalculateIfNotAddedOther = false; _editor._modLockOption_ColorPreview_Lock = false; _editor._modLockOption_ColorPreview_Unlock = true; //<< True 기본값 _editor._modLockOption_BonePreview_Lock = false; _editor._modLockOption_BonePreview_Unlock = true; //<< True 기본값 //_editor._modLockOption_MeshPreview_Lock = false; //_editor._modLockOption_MeshPreview_Unlock = false; _editor._modLockOption_ModListUI_Lock = false; _editor._modLockOption_ModListUI_Unlock = false; //_editor._modLockOption_MeshPreviewColor = apEditor.DefauleColor_ModLockOpt_MeshPreview; _editor._modLockOption_BonePreviewColor = apEditor.DefauleColor_ModLockOpt_BonePreview; isChanged = true; _editor.SaveEditorPref(); } if (isChanged) { if (_editor.Select != null) { _editor.Select.RefreshModifierExclusiveEditing(); _editor.Select.RefreshAnimEditingLayerLock(); } } if (GUILayout.Button(_editor.GetText(TEXT.DLG_Close), GUILayout.Height(35))) { _editor.SaveEditorPref(); CloseDialog(); } }
// GUI //------------------------------------------------------------------------ void OnGUI() { int width = (int)position.width; int height = (int)position.height; if (_editor == null || _funcResult == null || _targetModMesh == null) { CloseDialog(); return; } Texture2D iconImageCategory = _editor.ImageSet.Get(apImageSet.PRESET.Hierarchy_FoldDown); int height_List = height - 480; Color prevColor = GUI.backgroundColor; GUI.backgroundColor = new Color(0.9f, 0.9f, 0.9f); GUI.Box(new Rect(0, 156, width, height_List), ""); GUI.backgroundColor = prevColor; EditorGUILayout.BeginVertical(); EditorGUILayout.LabelField(_editor.GetText(TEXT.DLG_SelectedPhysicsSetting)); //"Selected Physics Setting" //현재 선택한 Physics Param을 등록하는 UI GUIStyle boxGUIStyle = new GUIStyle(GUI.skin.box); boxGUIStyle.alignment = TextAnchor.MiddleCenter; boxGUIStyle.normal.textColor = apEditorUtil.BoxTextColor; GUILayout.Box(_targetModMesh._renderUnit.Name, boxGUIStyle, GUILayout.Width(width - 8), GUILayout.Height(20)); GUILayout.Space(5); int width_Left = 90; int width_Right = width - 110; //Icon 이미지 | 이름 Icon 타입 // | (저장) EditorGUILayout.BeginHorizontal(GUILayout.Width(width), GUILayout.Height(70)); GUILayout.Space(5); EditorGUILayout.BeginVertical(GUILayout.Width(width_Left), GUILayout.Height(70)); //Icon을 출력하자 Texture2D addParamIcon = _editor.ImageSet.Get(apEditorUtil.GetPhysicsPresetIconType(_addParamIcon)); GUILayout.Box(addParamIcon, boxGUIStyle, GUILayout.Width(65), GUILayout.Height(65)); EditorGUILayout.EndVertical(); EditorGUILayout.BeginVertical(GUILayout.Width(width_Right), GUILayout.Height(70)); //이름, Icon 및 등록 버튼 EditorGUILayout.BeginHorizontal(GUILayout.Width(width_Right)); EditorGUILayout.LabelField(_editor.GetText(TEXT.DLG_Name), GUILayout.Width(80)); //"Name" _strAddParamName = EditorGUILayout.TextField(_strAddParamName, GUILayout.Width(width_Right - 88)); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(GUILayout.Width(width_Right)); EditorGUILayout.LabelField(_editor.GetText(TEXT.DLG_Icon), GUILayout.Width(80)); //"Icon" _addParamIcon = (apPhysicsPresetUnit.ICON)EditorGUILayout.EnumPopup(_addParamIcon, GUILayout.Width(width_Right - 88)); EditorGUILayout.EndHorizontal(); GUILayout.Space(5); EditorGUILayout.BeginHorizontal(GUILayout.Width(width_Right)); if (GUILayout.Button(_editor.GetText(TEXT.DLG_RegistToPreset), GUILayout.Width(150))) //"Regist To Preset" { //TODO if (_targetModMesh.PhysicParam != null) { //bool result = EditorUtility.DisplayDialog("Regist to Preset", "Regist Preset [" + _strAddParamName + "] ?", "Regist", "Cancel"); bool result = EditorUtility.DisplayDialog(_editor.GetText(TEXT.PhysicPreset_Regist_Title), _editor.GetTextFormat(TEXT.PhysicPreset_Regist_Body, _strAddParamName), _editor.GetText(TEXT.PhysicPreset_Regist_Okay), _editor.GetText(TEXT.Cancel)); if (result) { _editor.PhysicsPreset.AddNewPreset(_targetModMesh.PhysicParam, _strAddParamName, _addParamIcon); } } } EditorGUILayout.EndHorizontal(); EditorGUILayout.EndVertical(); EditorGUILayout.EndHorizontal(); GUILayout.Space(5); apEditorUtil.GUI_DelimeterBoxH(width); GUILayout.Space(5); GUIStyle guiStyle = new GUIStyle(GUIStyle.none); guiStyle.normal.textColor = GUI.skin.label.normal.textColor; guiStyle.alignment = TextAnchor.MiddleLeft; GUIStyle guiStyle_NotSelectable = new GUIStyle(GUIStyle.none); guiStyle_NotSelectable.normal.textColor = Color.red; guiStyle_NotSelectable.alignment = TextAnchor.MiddleLeft; GUIStyle guiStyle_Center = new GUIStyle(GUIStyle.none); guiStyle_Center.normal.textColor = GUI.skin.label.normal.textColor; guiStyle_Center.alignment = TextAnchor.MiddleCenter; //GUIContent guiContent_Bone = new GUIContent(iconBone); GUILayout.Space(10); //GUILayout.Button("Select a Physics Preset", guiStyle_Center, GUILayout.Width(width), GUILayout.Height(15));//<투명 버튼 _scrollList = EditorGUILayout.BeginScrollView(_scrollList, GUILayout.Width(width), GUILayout.Height(height_List)); //"Presets" GUILayout.Button(new GUIContent(_editor.GetText(TEXT.DLG_Presets), iconImageCategory), guiStyle, GUILayout.Height(20)); //<투명 버튼 for (int i = 0; i < _editor.PhysicsPreset.Presets.Count; i++) { //DrawBoneUnit(_boneUnits_Root[i], 0, width, iconImage_FoldDown, iconImage_FoldRight, guiContent_Bone, guiStyle, guiStyle_NotSelectable, _scrollList.x); DrawPresetUnit(_editor.PhysicsPreset.Presets[i], i, width - 18, _scrollList.x); } GUILayout.Space(310); EditorGUILayout.EndScrollView(); EditorGUILayout.EndVertical(); GUILayout.Space(10); //선택한 정보를 보여주자 //string curName = "<Not Selected>"; string curName = "<" + _editor.GetText(TEXT.DLG_NotSelected) + ">"; Texture2D curIcon = null; float curMoveRange = 0.0f; //float curStretchRange_Min = 0.0f; float curStretchRange_Max = 0.0f; float curStretchK = 0.0f; float curInertiaK = 0.0f; float curDamping = 0.0f; float curMass = 100.0f; bool curIsRestrictMoveRange = false; bool curIsRestrictStretchRange = false; Vector2 curGravityConstValue = Vector2.zero; Vector2 curWindConstValue = Vector2.zero; Vector2 curWindRandomRange = Vector2.zero; float curAirDrag = 0.0f; float curViscosity = 0.0f; float curRestoring = 1.0f; if (_selectedUnit != null) { curName = _selectedUnit._name; curIcon = _editor.ImageSet.Get(apEditorUtil.GetPhysicsPresetIconType(_selectedUnit._icon)); //curStretchRange_Min = _selectedUnit._stretchRange_Min; curStretchRange_Max = _selectedUnit._stretchRange_Max; curIsRestrictMoveRange = _selectedUnit._isRestrictMoveRange; curIsRestrictStretchRange = _selectedUnit._isRestrictStretchRange; curMoveRange = _selectedUnit._moveRange; curStretchK = _selectedUnit._stretchK; curInertiaK = _selectedUnit._inertiaK; curDamping = _selectedUnit._damping; curMass = _selectedUnit._mass; curGravityConstValue = _selectedUnit._gravityConstValue; curWindConstValue = _selectedUnit._windConstValue; curWindRandomRange = _selectedUnit._windRandomRange; curAirDrag = _selectedUnit._airDrag; curViscosity = _selectedUnit._viscosity; curRestoring = _selectedUnit._restoring; } Texture2D imgIcon_Stretch = _editor.ImageSet.Get(apImageSet.PRESET.Physic_Stretch); Texture2D imgIcon_Inertia = _editor.ImageSet.Get(apImageSet.PRESET.Physic_Inertia); Texture2D imgIcon_Restoring = _editor.ImageSet.Get(apImageSet.PRESET.Physic_Recover); Texture2D imgIcon_Viscosity = _editor.ImageSet.Get(apImageSet.PRESET.Physic_Viscosity); Texture2D imgIcon_Gravity = _editor.ImageSet.Get(apImageSet.PRESET.Physic_Gravity); Texture2D imgIcon_Wind = _editor.ImageSet.Get(apImageSet.PRESET.Physic_Wind); //반반 나눠서 그려주자 int width_Info = ((width - 10) / 2) - 10; int height_Info = 270; int width_InfoLabel = 120; int width_InfoValue = (width_Info - width_InfoLabel) - 4; EditorGUILayout.BeginHorizontal(GUILayout.Width(width), GUILayout.Height(height_Info)); GUILayout.Space(5); EditorGUILayout.BeginVertical(GUILayout.Width(width_Info), GUILayout.Height(height_Info)); //Icon, Name, Basic Setting, Gravity, Wind를 보여주자 if (curIcon == null) { EditorGUILayout.LabelField(curName, GUILayout.Width(width_Info), GUILayout.Height(26)); } else { EditorGUILayout.LabelField(new GUIContent(" " + curName, curIcon), GUILayout.Width(width_Info), GUILayout.Height(26)); } GUILayout.Space(5); EditorGUILayout.BeginHorizontal(GUILayout.Width(width_Info)); EditorGUILayout.LabelField(_editor.GetUIWord(UIWORD.Mass), GUILayout.Width(width_InfoLabel)); //"Mass" EditorGUILayout.FloatField(curMass, GUILayout.Width(width_InfoValue)); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(GUILayout.Width(width_Info)); EditorGUILayout.LabelField(_editor.GetUIWord(UIWORD.Damping), GUILayout.Width(width_InfoLabel)); //"Damping" EditorGUILayout.FloatField(curDamping, GUILayout.Width(width_InfoValue)); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(GUILayout.Width(width_Info)); EditorGUILayout.LabelField(_editor.GetUIWord(UIWORD.AirDrag), GUILayout.Width(width_InfoLabel)); //"Air Drag" EditorGUILayout.FloatField(curAirDrag, GUILayout.Width(width_InfoValue)); EditorGUILayout.EndHorizontal(); if (curIsRestrictMoveRange) { EditorGUILayout.BeginHorizontal(GUILayout.Width(width_Info)); EditorGUILayout.LabelField(_editor.GetUIWord(UIWORD.MoveRange), GUILayout.Width(width_InfoLabel)); //"Move Range" EditorGUILayout.FloatField(curMoveRange, GUILayout.Width(width_InfoValue)); EditorGUILayout.EndHorizontal(); } else { EditorGUILayout.BeginHorizontal(GUILayout.Width(width_Info)); EditorGUILayout.LabelField(_editor.GetUIWord(UIWORD.MoveRangeUnlimited), GUILayout.Width(width_Info)); //"Move Range : (Unlimited)" EditorGUILayout.EndHorizontal(); } GUILayout.Space(5); //" Gravity" EditorGUILayout.LabelField(new GUIContent(" " + _editor.GetUIWord(UIWORD.Gravity), imgIcon_Gravity), GUILayout.Width(width_Info), GUILayout.Height(25)); apEditorUtil.DelayedVector2Field(curGravityConstValue, width_Info - 4); GUILayout.Space(5); //" Wind" EditorGUILayout.LabelField(new GUIContent(" " + _editor.GetUIWord(UIWORD.Wind), imgIcon_Wind), GUILayout.Width(width_Info), GUILayout.Height(25)); apEditorUtil.DelayedVector2Field(curWindConstValue, width_Info - 4); EditorGUILayout.LabelField(_editor.GetUIWord(UIWORD.WindRandomRangeSize), GUILayout.Width(width_Info)); //"Wind Random Size" apEditorUtil.DelayedVector2Field(curWindRandomRange, width_Info - 4); EditorGUILayout.EndVertical(); GUILayout.Space(4); EditorGUILayout.BeginVertical(GUILayout.Width(width_Info), GUILayout.Height(height_Info)); //Stretchiness, Inertia, Restoring, Viscosity를 보여주고, 삭제 버튼(또는 Reserved) 표시 //" Stretchiness" EditorGUILayout.LabelField(new GUIContent(" " + _editor.GetUIWord(UIWORD.Stretchiness), imgIcon_Stretch), GUILayout.Width(width_Info), GUILayout.Height(25)); EditorGUILayout.BeginHorizontal(GUILayout.Width(width_Info)); EditorGUILayout.LabelField(_editor.GetUIWord(UIWORD.K_Value), GUILayout.Width(width_InfoLabel)); //"K-Value" EditorGUILayout.FloatField(curStretchK, GUILayout.Width(width_InfoValue)); EditorGUILayout.EndHorizontal(); if (curIsRestrictStretchRange) { //EditorGUILayout.BeginHorizontal(GUILayout.Width(width_Info)); //EditorGUILayout.LabelField("Shorten Range", GUILayout.Width(width_InfoLabel)); //EditorGUILayout.FloatField(curStretchRange_Min, GUILayout.Width(width_InfoValue)); //EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(GUILayout.Width(width_Info)); EditorGUILayout.LabelField(_editor.GetUIWord(UIWORD.LengthenRatio), GUILayout.Width(width_InfoLabel)); //"Lengthen Range" EditorGUILayout.FloatField(curStretchRange_Max, GUILayout.Width(width_InfoValue)); EditorGUILayout.EndHorizontal(); } else { //EditorGUILayout.LabelField("Shorten Range : (Unlimited)", GUILayout.Width(width_Info)); EditorGUILayout.BeginHorizontal(GUILayout.Width(width_Info)); EditorGUILayout.LabelField(_editor.GetUIWord(UIWORD.LengthenRatioUnlimited), GUILayout.Width(width_Info)); //"Lengthen Range : (Unlimited)" EditorGUILayout.EndHorizontal(); } GUILayout.Space(5); EditorGUILayout.BeginHorizontal(GUILayout.Width(width_Info)); //" Inertia" EditorGUILayout.LabelField(new GUIContent(" " + _editor.GetUIWord(UIWORD.Inertia), imgIcon_Inertia), GUILayout.Width(width_InfoLabel), GUILayout.Height(25)); EditorGUILayout.FloatField(curInertiaK, GUILayout.Width(width_InfoValue)); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(GUILayout.Width(width_Info)); //" Restoring" EditorGUILayout.LabelField(new GUIContent(" " + _editor.GetUIWord(UIWORD.Restoring), imgIcon_Restoring), GUILayout.Width(width_InfoLabel), GUILayout.Height(25)); EditorGUILayout.FloatField(curRestoring, GUILayout.Width(width_InfoValue)); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(GUILayout.Width(width_Info)); //" Viscosity" EditorGUILayout.LabelField(new GUIContent(" " + _editor.GetUIWord(UIWORD.Viscosity), imgIcon_Viscosity), GUILayout.Width(width_InfoLabel), GUILayout.Height(25)); EditorGUILayout.FloatField(curViscosity, GUILayout.Width(width_InfoValue)); EditorGUILayout.EndHorizontal(); GUILayout.Space(10); if (_selectedUnit != null) { //삭제 가능한지 체크 if (!_selectedUnit._isReserved) { //"Remove Preset" if (GUILayout.Button(_editor.GetText(TEXT.DLG_RemovePreset), GUILayout.Width(width_Info - 4))) { //bool result = EditorUtility.DisplayDialog("Remove Preset", "Remove Preset [" + _selectedUnit._name + "] ?", "Remove", "Cancel"); bool result = EditorUtility.DisplayDialog(_editor.GetText(TEXT.PhysicPreset_Remove_Title), _editor.GetTextFormat(TEXT.PhysicPreset_Remove_Body, _selectedUnit._name), _editor.GetText(TEXT.Remove), _editor.GetText(TEXT.Cancel)); if (result) { int targetID = _selectedUnit._uniqueID; _selectedUnit = null; _editor.PhysicsPreset.RemovePreset(targetID); } } } } EditorGUILayout.EndVertical(); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); bool isClose = false; bool isSelectBtnAvailable = _selectedUnit != null; if (apEditorUtil.ToggledButton(_editor.GetText(TEXT.DLG_Apply), false, isSelectBtnAvailable, (width / 2) - 8, 30)) //"Apply" { _funcResult(true, _loadKey, _selectedUnit, _targetModMesh); isClose = true; } if (apEditorUtil.ToggledButton(_editor.GetText(TEXT.DLG_Close), false, true, (width / 2) - 8, 30)) //"Close" { //_funcResult(false, _loadKey, null, null); _funcResult(false, _loadKey, null, _targetModMesh); isClose = true; } EditorGUILayout.EndHorizontal(); if (isClose) { CloseDialog(); } }
// GUI //------------------------------------------------------------------ void OnGUI() { int width = (int)position.width; int height = (int)position.height; if (_editor == null || _targetPortrait == null) { //Debug.LogError("Exit - Editor / Portrait is Null"); CloseDialog(); return; } //만약 Portriat가 바뀌었거나 Editor가 리셋되면 닫자 if (_editor != apEditor.CurrentEditor || _targetPortrait != apEditor.CurrentEditor._portrait) { //Debug.LogError("Exit - Editor / Portrait Missmatch"); CloseDialog(); return; } int tabBtnHeight = 25; int tabBtnWidth = ((width - 10) / 3) - 4; EditorGUILayout.BeginHorizontal(GUILayout.Width(width), GUILayout.Height(tabBtnHeight)); GUILayout.Space(5); if (apEditorUtil.ToggledButton(_editor.GetText(TEXT.DLG_Portrait), _tab == TAB.PortriatSetting, tabBtnWidth, tabBtnHeight)) //"Portrait" { _tab = TAB.PortriatSetting; } if (apEditorUtil.ToggledButton(_editor.GetText(TEXT.DLG_Editor), _tab == TAB.EditorSetting, tabBtnWidth, tabBtnHeight)) //"Editor" { _tab = TAB.EditorSetting; } if (apEditorUtil.ToggledButton(_editor.GetText(TEXT.DLG_About), _tab == TAB.About, tabBtnWidth, tabBtnHeight)) //"About" { _tab = TAB.About; } EditorGUILayout.EndHorizontal(); GUILayout.Space(5); int scrollHeight = height - 40; _scroll = EditorGUILayout.BeginScrollView(_scroll, false, true, GUILayout.Width(width), GUILayout.Height(scrollHeight)); width -= 25; GUILayout.BeginVertical(GUILayout.Width(width)); switch (_tab) { case TAB.PortriatSetting: { //Portrait 설정 EditorGUILayout.LabelField(_editor.GetText(TEXT.DLG_PortraitSetting)); //"Portrait Settings" GUILayout.Space(10); string nextName = EditorGUILayout.DelayedTextField(_editor.GetText(TEXT.DLG_Name), _targetPortrait.name); //"Name" if (nextName != _targetPortrait.name) { apEditorUtil.SetRecord_Portrait(apUndoGroupData.ACTION.Portrait_SettingChanged, _editor, _targetPortrait, null, false); _targetPortrait.name = nextName; } //"FPS (Important Off)" int nextFPS = EditorGUILayout.DelayedIntField(new GUIContent(_editor.GetText(TEXT.DLG_Setting_FPS), "This setting is used when <Important> is off"), _targetPortrait._FPS); if (_targetPortrait._FPS != nextFPS) { apEditorUtil.SetRecord_Portrait(apUndoGroupData.ACTION.Portrait_SettingChanged, _editor, _targetPortrait, null, false); if (nextFPS < 10) { nextFPS = 10; } _targetPortrait._FPS = nextFPS; } //"Is Important" bool nextImportant = EditorGUILayout.Toggle(new GUIContent(_editor.GetText(TEXT.DLG_Setting_IsImportant), "When this setting is on, it always updates and the physics effect works."), _targetPortrait._isImportant); if (nextImportant != _targetPortrait._isImportant) { apEditorUtil.SetRecord_Portrait(apUndoGroupData.ACTION.Portrait_SettingChanged, _editor, _targetPortrait, null, false); _targetPortrait._isImportant = nextImportant; } GUILayout.Space(10); //수동으로 백업하기 if (GUILayout.Button(_editor.GetText(TEXT.DLG_Setting_ManualBackUp), GUILayout.Height(30))) //"Save Backup (Manual)" { if (_editor.Backup.IsAutoSaveWorking()) { EditorUtility.DisplayDialog(_editor.GetText(TEXT.BackupError_Title), _editor.GetText(TEXT.BackupError_Body), _editor.GetText(TEXT.Okay)); } else { string defaultBackupFileName = _targetPortrait.name + "_backup_" + apBackup.GetCurrentTimeString(); string savePath = EditorUtility.SaveFilePanel("Backup File Path", "", defaultBackupFileName, "bck"); if (string.IsNullOrEmpty(savePath)) { _editor.Notification("Backup Canceled", true, false); } else { _editor.Backup.SaveBackup(savePath, _targetPortrait); _editor.Notification("Backup Saved [" + savePath + "]", false, true); } CloseDialog(); } } } break; case TAB.EditorSetting: { EditorGUILayout.LabelField(_editor.GetText(TEXT.DLG_EditorSetting)); //"Editor Settings" GUILayout.Space(10); apEditor.LANGUAGE prevLanguage = _editor._language; int prevLangIndex = -1; for (int i = 0; i < _validLanguageIndex.Length; i++) { if (_validLanguageIndex[i] == (int)prevLanguage) { prevLangIndex = i; } } if (prevLangIndex < 0) { prevLangIndex = 0; //English 강제 } bool prevGUIFPS = _editor._guiOption_isFPSVisible; bool prevGUIStatistics = _editor._guiOption_isStatisticsVisible; Color prevColor_Background = _editor._colorOption_Background; Color prevColor_GridCenter = _editor._colorOption_GridCenter; Color prevColor_Grid = _editor._colorOption_Grid; Color prevColor_MeshEdge = _editor._colorOption_MeshEdge; Color prevColor_MeshHiddenEdge = _editor._colorOption_MeshHiddenEdge; Color prevColor_Outline = _editor._colorOption_Outline; Color prevColor_TFBorder = _editor._colorOption_TransformBorder; Color prevColor_VertNotSelected = _editor._colorOption_VertColor_NotSelected; Color prevColor_VertSelected = _editor._colorOption_VertColor_Selected; Color prevColor_GizmoFFDLine = _editor._colorOption_GizmoFFDLine; Color prevColor_GizmoFFDInnerLine = _editor._colorOption_GizmoFFDInnerLine; Color prevColor_ToneColor = _editor._colorOption_OnionToneColor; bool prevBackup_IsAutoSave = _editor._backupOption_IsAutoSave; string prevBackup_Path = _editor._backupOption_BaseFolderName; int prevBackup_Time = _editor._backupOption_Minute; string prevBonePose_Path = _editor._bonePose_BaseFolderName; //"Language" //이전 방식은 Enum을 모두 조회 //_editor._language = (apEditor.LANGUAGE)EditorGUILayout.Popup(_editor.GetText(TEXT.DLG_Setting_Language), (int)_editor._language, _strLanguageName); //사용 가능한 Language만 따로 조회 int nextLangIndex = EditorGUILayout.Popup(_editor.GetText(TEXT.DLG_Setting_Language), prevLangIndex, _strLanguageName); _editor._language = (apEditor.LANGUAGE)_validLanguageIndex[nextLangIndex]; GUILayout.Space(10); _editor._guiOption_isFPSVisible = EditorGUILayout.Toggle(_editor.GetText(TEXT.DLG_Setting_ShowFPS), _editor._guiOption_isFPSVisible); //"Show FPS" _editor._guiOption_isStatisticsVisible = EditorGUILayout.Toggle(_editor.GetText(TEXT.DLG_Setting_ShowStatistics), _editor._guiOption_isStatisticsVisible); // "Show Statistics" GUILayout.Space(10); EditorGUILayout.LabelField(_editor.GetText(TEXT.DLG_Setting_AutoBackupSetting)); //"Auto Backup Option" _editor._backupOption_IsAutoSave = EditorGUILayout.Toggle(_editor.GetText(TEXT.DLG_Setting_AutoBackup), _editor._backupOption_IsAutoSave); //"Auto Backup" if (_editor._backupOption_IsAutoSave) { //경로와 시간 //"Time (Min)" _editor._backupOption_Minute = EditorGUILayout.IntField(_editor.GetText(TEXT.DLG_Setting_BackupTime), _editor._backupOption_Minute, GUILayout.Width(width)); EditorGUILayout.BeginHorizontal(GUILayout.Width(width), GUILayout.Height(18)); GUILayout.Space(5); //"Save Path" _editor._backupOption_BaseFolderName = EditorGUILayout.TextField(_editor.GetText(TEXT.DLG_Setting_BackupPath), _editor._backupOption_BaseFolderName, GUILayout.Width(width - 100), GUILayout.Height(18)); if (GUILayout.Button(_editor.GetText(TEXT.DLG_Change), GUILayout.Width(90), GUILayout.Height(18))) //"Change" { string pathResult = EditorUtility.SaveFolderPanel("Set the Backup Folder", _editor._backupOption_BaseFolderName, ""); if (!string.IsNullOrEmpty(pathResult)) { //Debug.Log("백업 폴더 경로 [" + pathResult + "] - " + Application.dataPath); Uri targetUri = new Uri(pathResult); Uri baseUri = new Uri(Application.dataPath); string relativePath = baseUri.MakeRelativeUri(targetUri).ToString(); _editor._backupOption_BaseFolderName = relativePath; //Debug.Log("상대 경로 [" + relativePath + "]"); apEditorUtil.SetEditorDirty(); } } EditorGUILayout.EndHorizontal(); } GUILayout.Space(10); EditorGUILayout.LabelField(_editor.GetText(TEXT.DLG_Setting_PoseSnapshotSetting)); //"Pose Snapshot Option" EditorGUILayout.BeginHorizontal(GUILayout.Width(width), GUILayout.Height(18)); GUILayout.Space(5); //"Save Path" _editor._bonePose_BaseFolderName = EditorGUILayout.TextField(_editor.GetText(TEXT.DLG_Setting_BackupPath), _editor._bonePose_BaseFolderName, GUILayout.Width(width - 100), GUILayout.Height(18)); if (GUILayout.Button(_editor.GetText(TEXT.DLG_Change), GUILayout.Width(90), GUILayout.Height(18))) //"Change" { string pathResult = EditorUtility.SaveFolderPanel("Set the Pose Folder", _editor._bonePose_BaseFolderName, ""); if (!string.IsNullOrEmpty(pathResult)) { Uri targetUri = new Uri(pathResult); Uri baseUri = new Uri(Application.dataPath); string relativePath = baseUri.MakeRelativeUri(targetUri).ToString(); _editor._bonePose_BaseFolderName = relativePath; apEditorUtil.SetEditorDirty(); } } EditorGUILayout.EndHorizontal(); GUILayout.Space(10); try { //int width_Btn = 65; //int width_Color = width - (width_Btn + 8); //int height_Color = 18; EditorGUILayout.LabelField(_editor.GetText(TEXT.DLG_Setting_BackgroundColors)); //"Background Colors" //"Background" _editor._colorOption_Background = ColorUI(_editor.GetText(TEXT.DLG_Setting_Background), _editor._colorOption_Background, width, apEditor.DefaultColor_Background); //"Grid Center" _editor._colorOption_GridCenter = ColorUI(_editor.GetText(TEXT.DLG_Setting_GridCenter), _editor._colorOption_GridCenter, width, apEditor.DefaultColor_GridCenter); //"Grid" _editor._colorOption_Grid = ColorUI(_editor.GetText(TEXT.DLG_Setting_Grid), _editor._colorOption_Grid, width, apEditor.DefaultColor_Grid); //"Atlas Border" _editor._colorOption_AtlasBorder = ColorUI(_editor.GetText(TEXT.DLG_Setting_AtlasBorder), _editor._colorOption_AtlasBorder, width, apEditor.DefaultColor_AtlasBorder); GUILayout.Space(5); EditorGUILayout.LabelField(_editor.GetText(TEXT.DLG_Setting_MeshGUIColors)); //"Mesh GUI Colors" //"Mesh Edge" _editor._colorOption_MeshEdge = ColorUI(_editor.GetText(TEXT.DLG_Setting_MeshEdge), _editor._colorOption_MeshEdge, width, apEditor.DefaultColor_MeshEdge); //"Mesh Hidden Edge" _editor._colorOption_MeshHiddenEdge = ColorUI(_editor.GetText(TEXT.DLG_Setting_MeshHiddenEdge), _editor._colorOption_MeshHiddenEdge, width, apEditor.DefaultColor_MeshHiddenEdge); //"Outline" _editor._colorOption_Outline = ColorUI(_editor.GetText(TEXT.DLG_Setting_Outline), _editor._colorOption_Outline, width, apEditor.DefaultColor_Outline); //"Transform Border" _editor._colorOption_TransformBorder = ColorUI(_editor.GetText(TEXT.DLG_Setting_TransformBorder), _editor._colorOption_TransformBorder, width, apEditor.DefaultColor_TransformBorder); //"Vertex" _editor._colorOption_VertColor_NotSelected = ColorUI(_editor.GetText(TEXT.DLG_Setting_Vertex), _editor._colorOption_VertColor_NotSelected, width, apEditor.DefaultColor_VertNotSelected); //"Selected Vertex" _editor._colorOption_VertColor_Selected = ColorUI(_editor.GetText(TEXT.DLG_Setting_SelectedVertex), _editor._colorOption_VertColor_Selected, width, apEditor.DefaultColor_VertSelected); GUILayout.Space(5); EditorGUILayout.LabelField(_editor.GetText(TEXT.DLG_Setting_GizmoColors)); //"Gizmo Colors" //"FFD Line" _editor._colorOption_GizmoFFDLine = ColorUI(_editor.GetText(TEXT.DLG_Setting_FFDLine), _editor._colorOption_GizmoFFDLine, width, apEditor.DefaultColor_GizmoFFDLine); //"FFD Inner Line" _editor._colorOption_GizmoFFDInnerLine = ColorUI(_editor.GetText(TEXT.DLG_Setting_FFDInnerLine), _editor._colorOption_GizmoFFDInnerLine, width, apEditor.DefaultColor_GizmoFFDInnerLine); GUILayout.Space(5); EditorGUILayout.LabelField(_editor.GetText(TEXT.DLG_Setting_OnionSkinColor)); //"Onion Skin Color" //"Onion Skin (2x)" _editor._colorOption_OnionToneColor = ColorUI(_editor.GetText(TEXT.DLG_Setting_OnionSkinColor2X), _editor._colorOption_OnionToneColor, width, apEditor.DefaultColor_OnionToneColor); } catch (Exception) { } GUILayout.Space(10); bool prevStartupScreen = _editor._startScreenOption_IsShowStartup; EditorGUILayout.BeginHorizontal(GUILayout.Width(width), GUILayout.Height(25)); GUILayout.Space(5); EditorGUILayout.LabelField(_editor.GetText(TEXT.DLG_StartPage_AlawysOn), GUILayout.Width((width - (10 + 30)))); _editor._startScreenOption_IsShowStartup = EditorGUILayout.Toggle(_editor._startScreenOption_IsShowStartup, GUILayout.Width(30)); EditorGUILayout.EndHorizontal(); GUILayout.Space(20); //"Restore Editor Default Setting" if (GUILayout.Button(_editor.GetText(TEXT.DLG_Setting_RestoreDefaultSetting), GUILayout.Height(20))) { _editor.RestoreEditorPref(); } if (prevLanguage != _editor._language || prevGUIFPS != _editor._guiOption_isFPSVisible || prevGUIStatistics != _editor._guiOption_isStatisticsVisible || prevColor_Background != _editor._colorOption_Background || prevColor_GridCenter != _editor._colorOption_GridCenter || prevColor_Grid != _editor._colorOption_Grid || prevColor_MeshEdge != _editor._colorOption_MeshEdge || prevColor_MeshHiddenEdge != _editor._colorOption_MeshHiddenEdge || prevColor_Outline != _editor._colorOption_Outline || prevColor_TFBorder != _editor._colorOption_TransformBorder || prevColor_VertNotSelected != _editor._colorOption_VertColor_NotSelected || prevColor_VertSelected != _editor._colorOption_VertColor_Selected || prevColor_GizmoFFDLine != _editor._colorOption_GizmoFFDLine || prevColor_GizmoFFDInnerLine != _editor._colorOption_GizmoFFDInnerLine || prevColor_ToneColor != _editor._colorOption_OnionToneColor || prevBackup_IsAutoSave != _editor._backupOption_IsAutoSave || !prevBackup_Path.Equals(_editor._backupOption_BaseFolderName) || prevBackup_Time != _editor._backupOption_Minute || !prevBonePose_Path.Equals(_editor._bonePose_BaseFolderName) || prevStartupScreen != _editor._startScreenOption_IsShowStartup ) { bool isLanguageChanged = (prevLanguage != _editor._language); _editor.SaveEditorPref(); apEditorUtil.SetEditorDirty(); apGL.SetToneColor(_editor._colorOption_OnionToneColor); if (isLanguageChanged) { _editor.ResetHierarchyAll(); _editor.RefreshTimelineLayers(true); _editor.RefreshControllerAndHierarchy(); } } } break; case TAB.About: { EditorGUILayout.LabelField(_editor.GetText(TEXT.DLG_About)); //"About" GUILayout.Space(20); apEditorUtil.GUI_DelimeterBoxH(width); GUILayout.Space(20); EditorGUILayout.LabelField("[AnyPortrait]"); EditorGUILayout.LabelField("Build : " + apVersion.I.APP_VERSION_NUMBER_ONLY); GUILayout.Space(20); apEditorUtil.GUI_DelimeterBoxH(width); GUILayout.Space(20); EditorGUILayout.LabelField("[Open Source Library License]"); GUILayout.Space(20); EditorGUILayout.LabelField("[PSD File Import Library]"); GUILayout.Space(10); EditorGUILayout.LabelField("Ntreev Photoshop Document Parser for .Net"); GUILayout.Space(10); EditorGUILayout.LabelField("Released under the MIT License."); GUILayout.Space(10); EditorGUILayout.LabelField("Copyright (c) 2015 Ntreev Soft co., Ltd."); GUILayout.Space(10); EditorGUILayout.LabelField("Permission is hereby granted, free of charge,"); EditorGUILayout.LabelField("to any person obtaining a copy of this software"); EditorGUILayout.LabelField("and associated documentation files (the \"Software\"),"); EditorGUILayout.LabelField("to deal in the Software without restriction,"); EditorGUILayout.LabelField("including without limitation the rights "); EditorGUILayout.LabelField("to use, copy, modify, merge, publish, distribute,"); EditorGUILayout.LabelField("sublicense, and/or sell copies of the Software, "); EditorGUILayout.LabelField("and to permit persons to whom the Software is furnished"); EditorGUILayout.LabelField("to do so, subject to the following conditions:"); GUILayout.Space(10); EditorGUILayout.LabelField("The above copyright notice and "); EditorGUILayout.LabelField("this permission notice shall be included"); EditorGUILayout.LabelField("in all copies or substantial portions of the Software."); GUILayout.Space(10); EditorGUILayout.LabelField("THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT "); EditorGUILayout.LabelField("WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, "); EditorGUILayout.LabelField("INCLUDING BUT NOT LIMITED TO THE WARRANTIES "); EditorGUILayout.LabelField("OF MERCHANTABILITY, FITNESS FOR A PARTICULAR "); EditorGUILayout.LabelField("PURPOSE AND NONINFRINGEMENT. "); EditorGUILayout.LabelField("IN NO EVENT SHALL THE AUTHORS OR "); EditorGUILayout.LabelField("COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES "); EditorGUILayout.LabelField("OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, "); EditorGUILayout.LabelField("TORT OR OTHERWISE, ARISING FROM, OUT OF OR "); EditorGUILayout.LabelField("IN CONNECTION WITH THE SOFTWARE OR "); EditorGUILayout.LabelField("THE USE OR OTHER DEALINGS IN THE SOFTWARE."); GUILayout.Space(20); apEditorUtil.GUI_DelimeterBoxH(width); GUILayout.Space(20); EditorGUILayout.LabelField("[GIF Export Library]"); GUILayout.Space(10); EditorGUILayout.LabelField("NGif, Animated GIF Encoder for .NET"); GUILayout.Space(10); EditorGUILayout.LabelField("Released under the CPOL 1.02."); GUILayout.Space(10); } break; } GUILayout.Space(height); EditorGUILayout.EndVertical(); EditorGUILayout.EndScrollView(); }
// GUI //------------------------------------------------------------------ void OnGUI() { int width = (int)position.width; int height = (int)position.height; if (_editor == null || _funcResult == null) { return; } Color prevColor = GUI.backgroundColor; GUI.backgroundColor = new Color(0.9f, 0.9f, 0.9f); GUI.Box(new Rect(0, 37, width, height - 90), ""); GUI.backgroundColor = prevColor; EditorGUILayout.BeginVertical(); GUIStyle guiStyle = new GUIStyle(GUIStyle.none); guiStyle.normal.textColor = GUI.skin.label.normal.textColor; GUIStyle guiStyle_Center = new GUIStyle(GUIStyle.none); guiStyle_Center.normal.textColor = GUI.skin.label.normal.textColor; guiStyle_Center.alignment = TextAnchor.MiddleCenter; GUILayout.Space(10); EditorGUILayout.LabelField(_editor.GetText(TEXT.DLG_SelectImage), guiStyle_Center, GUILayout.Width(width), GUILayout.Height(15)); //<투명 버튼//"Select Image" GUILayout.Space(10); _scrollList = EditorGUILayout.BeginScrollView(_scrollList, GUILayout.Width(width), GUILayout.Height(height - 90)); GUILayout.Space(20); int imageUnitHeight = 200; int scrollWidth = width - 16; int imageUnitWidth = (scrollWidth / 3) - 12; for (int iTex = 0; iTex < _textureData.Count; iTex += 3) { EditorGUILayout.BeginHorizontal(GUILayout.Width(scrollWidth), GUILayout.Height(imageUnitHeight)); GUILayout.Space(5); if (iTex < _textureData.Count) { EditorGUILayout.BeginVertical(GUILayout.Width(imageUnitWidth), GUILayout.Height(imageUnitHeight)); DrawTextureUnit(_textureData[iTex], imageUnitWidth, imageUnitHeight); EditorGUILayout.EndVertical(); } GUILayout.Space(2); if (iTex + 1 < _textureData.Count) { EditorGUILayout.BeginVertical(GUILayout.Width(imageUnitWidth), GUILayout.Height(imageUnitHeight)); DrawTextureUnit(_textureData[iTex + 1], imageUnitWidth, imageUnitHeight); EditorGUILayout.EndVertical(); } GUILayout.Space(2); if (iTex + 2 < _textureData.Count) { EditorGUILayout.BeginVertical(GUILayout.Width(imageUnitWidth), GUILayout.Height(imageUnitHeight)); DrawTextureUnit(_textureData[iTex + 2], imageUnitWidth, imageUnitHeight); EditorGUILayout.EndVertical(); } EditorGUILayout.EndHorizontal(); GUILayout.Space(20); } GUILayout.Space(height - 90); EditorGUILayout.EndScrollView(); EditorGUILayout.EndVertical(); GUILayout.Space(10); EditorGUILayout.BeginHorizontal(); bool isClose = false; if (GUILayout.Button(_editor.GetText(TEXT.DLG_Select), GUILayout.Height(30))) //"Select" { _funcResult(true, _targetMesh, _loadKey, _curSelectedTextureData); isClose = true; } if (GUILayout.Button(_editor.GetText(TEXT.DLG_Close), GUILayout.Height(30))) //"Close" { isClose = true; } EditorGUILayout.EndHorizontal(); if (isClose) { CloseDialog(); } }
// GUI //-------------------------------------------------------------- void OnGUI() { int width = (int)position.width; int height = (int)position.height; if (_editor == null || _funcResult == null) { return; } Color prevColor = GUI.backgroundColor; GUI.backgroundColor = new Color(0.9f, 0.9f, 0.9f); GUI.Box(new Rect(0, 45, width, height - 100), ""); GUI.backgroundColor = prevColor; EditorGUILayout.BeginVertical(); Texture2D iconImageCategory = _editor.ImageSet.Get(apImageSet.PRESET.Hierarchy_FoldDown); GUIStyle guiStyle_None = new GUIStyle(GUIStyle.none); guiStyle_None.normal.textColor = GUI.skin.label.normal.textColor; GUIStyle guiStyle_Selected = new GUIStyle(GUIStyle.none); if (EditorGUIUtility.isProSkin) { guiStyle_Selected.normal.textColor = Color.cyan; } else { guiStyle_Selected.normal.textColor = Color.white; } GUIStyle guiStyle_Center = new GUIStyle(GUIStyle.none); guiStyle_Center.normal.textColor = GUI.skin.label.normal.textColor; guiStyle_Center.alignment = TextAnchor.MiddleCenter; GUILayout.Space(10); GUILayout.Button(_msg, guiStyle_Center, GUILayout.Width(width), GUILayout.Height(25)); //<투명 버튼 GUILayout.Space(10); _scrollList = EditorGUILayout.BeginScrollView(_scrollList, GUILayout.Width(width), GUILayout.Height(height - 100)); //TODO : 언어 GUILayout.Button(new GUIContent((_isPresetTarget ? "Presets" : "Material Sets"), iconImageCategory), guiStyle_None, GUILayout.Height(20)); //<투명 버튼 apMaterialSet curMatSet = null; //GUILayout.Space(10); for (int i = 0; i < _materialSets.Count; i++) { curMatSet = _materialSets[i]; GUIStyle curGUIStyle = guiStyle_None; if (curMatSet == _curSelectedMatSet) { Rect lastRect = GUILayoutUtility.GetLastRect(); prevColor = GUI.backgroundColor; if (EditorGUIUtility.isProSkin) { GUI.backgroundColor = new Color(0.0f, 1.0f, 1.0f, 1.0f); } else { GUI.backgroundColor = new Color(0.4f, 0.8f, 1.0f, 1.0f); } GUI.Box(new Rect(lastRect.x, lastRect.y + 20, width, 20), ""); GUI.backgroundColor = prevColor; curGUIStyle = guiStyle_Selected; } EditorGUILayout.BeginHorizontal(GUILayout.Width(width - 50)); GUILayout.Space(15); if (GUILayout.Button(new GUIContent(" " + curMatSet._name, _img_MatSetType[curMatSet._icon]), curGUIStyle, GUILayout.Width(width - 35), GUILayout.Height(20))) { _curSelectedMatSet = curMatSet; } EditorGUILayout.EndHorizontal(); } EditorGUILayout.EndScrollView(); EditorGUILayout.EndVertical(); GUILayout.Space(10); EditorGUILayout.BeginHorizontal(); bool isClose = false; if (GUILayout.Button(_editor.GetText(TEXT.DLG_Select), GUILayout.Height(30))) //"Select" { _funcResult(true, _loadKey, _curSelectedMatSet, (_isNoneSelectable && _curSelectedMatSet != null && _curSelectedMatSet == _noneMatSet), _savedObject); isClose = true; } if (GUILayout.Button(_editor.GetText(TEXT.DLG_Close), GUILayout.Height(30))) //"Close" { isClose = true; } EditorGUILayout.EndHorizontal(); if (isClose) { CloseDialog(); } }
// GUI //------------------------------------------------------------------ void OnGUI() { int width = (int)position.width; int height = (int)position.height; if (_editor == null || _targetPortrait == null) { CloseDialog(); return; } //만약 Portriat가 바뀌었거나 Editor가 리셋되면 닫자 if (_editor != apEditor.CurrentEditor || _targetPortrait != apEditor.CurrentEditor._portrait) { CloseDialog(); return; } //Sorting Layer를 추가하자 if (_sortingLayerNames == null || _sortingLayerIDs == null) { _sortingLayerNames = new string[SortingLayer.layers.Length]; _sortingLayerIDs = new int[SortingLayer.layers.Length]; } else if (_sortingLayerNames.Length != SortingLayer.layers.Length || _sortingLayerIDs.Length != SortingLayer.layers.Length) { _sortingLayerNames = new string[SortingLayer.layers.Length]; _sortingLayerIDs = new int[SortingLayer.layers.Length]; } for (int i = 0; i < SortingLayer.layers.Length; i++) { _sortingLayerNames[i] = SortingLayer.layers[i].name; _sortingLayerIDs[i] = SortingLayer.layers[i].id; } //Bake 설정 EditorGUILayout.LabelField(_editor.GetText(TEXT.DLG_BakeSetting)); //"Bake Setting" GUILayout.Space(5); EditorGUILayout.ObjectField(_editor.GetText(TEXT.DLG_Portrait), _targetPortrait, typeof(apPortrait), true); //"Portait" GUILayout.Space(5); //"Bake Scale" float prevBakeScale = _targetPortrait._bakeScale; _targetPortrait._bakeScale = EditorGUILayout.FloatField(_editor.GetText(TEXT.DLG_BakeScale), _targetPortrait._bakeScale); //"Z Per Depth" float prevBakeZSize = _targetPortrait._bakeZSize; _targetPortrait._bakeZSize = EditorGUILayout.FloatField(_editor.GetText(TEXT.DLG_ZPerDepth), _targetPortrait._bakeZSize); if (_targetPortrait._bakeZSize < 0.5f) { _targetPortrait._bakeZSize = 0.5f; } GUILayout.Space(5); //Gamma Space Space bool prevBakeGamma = _editor._isBakeColorSpaceToGamma; int iPrevColorSpace = prevBakeGamma ? 0 : 1; int iNextColorSpace = EditorGUILayout.Popup(_editor.GetUIWord(UIWORD.ColorSpace), iPrevColorSpace, _colorSpaceNames); if (iNextColorSpace != iPrevColorSpace) { if (iNextColorSpace == 0) { //Gamma _editor._isBakeColorSpaceToGamma = true; } else { //Linear _editor._isBakeColorSpaceToGamma = false; } } //_editor._isBakeColorSpaceToGamma = EditorGUILayout.Toggle("Gamma Color Space", _editor._isBakeColorSpaceToGamma); //GUILayout.Space(5); //float nextPhysicsScale = EditorGUILayout.DelayedFloatField("Physic Scale", _targetPortrait._physicBakeScale); GUILayout.Space(5); //Sorting Layer int prevSortingLayerID = _editor._portrait._sortingLayerID; int prevSortingOrder = _editor._portrait._sortingOrder; int layerIndex = -1; for (int i = 0; i < SortingLayer.layers.Length; i++) { if (SortingLayer.layers[i].id == _editor._portrait._sortingLayerID) { //찾았다. layerIndex = i; break; } } if (layerIndex < 0) { //어라 레이어가 없는데용.. //초기화해야겠다. _editor._portrait._sortingLayerID = -1; if (SortingLayer.layers.Length > 0) { _editor._portrait._sortingLayerID = SortingLayer.layers[0].id; layerIndex = 0; } } int nextIndex = EditorGUILayout.Popup("Sorting Layer", layerIndex, _sortingLayerNames); if (nextIndex != layerIndex) { //레이어가 변경되었다. if (nextIndex >= 0 && nextIndex < SortingLayer.layers.Length) { //LayerID 변경 _editor._portrait._sortingLayerID = SortingLayer.layers[nextIndex].id; } } _editor._portrait._sortingOrder = EditorGUILayout.IntField("Sorting Order", _editor._portrait._sortingOrder); //CheckChangedProperties(nextRootScale, nextZScale); if (prevBakeScale != _targetPortrait._bakeScale || prevBakeZSize != _targetPortrait._bakeZSize || prevSortingLayerID != _editor._portrait._sortingLayerID || prevSortingOrder != _editor._portrait._sortingOrder) { apEditorUtil.SetEditorDirty(); } if (prevBakeGamma != _editor._isBakeColorSpaceToGamma ) { apEditorUtil.SetEditorDirty(); _editor.SaveEditorPref(); } GUILayout.Space(10); if (GUILayout.Button(_editor.GetText(TEXT.DLG_Bake), GUILayout.Height(45))) //"Bake" { GUI.FocusControl(null); //CheckChangedProperties(nextRootScale, nextZScale); apEditorUtil.SetEditorDirty(); //------------------------------------- // Bake 함수를 실행한다. << 중요오오오오 //------------------------------------- apBakeResult bakeResult = _editor.Controller.Bake(); _editor.Notification("[" + _targetPortrait.name + "] is Baked", false, false); if (bakeResult.NumUnlinkedExternalObject > 0) { EditorUtility.DisplayDialog(_editor.GetText(TEXT.BakeWarning_Title), _editor.GetTextFormat(TEXT.BakeWarning_Body, bakeResult.NumUnlinkedExternalObject), _editor.GetText(TEXT.Okay)); } } GUILayout.Space(10); apEditorUtil.GUI_DelimeterBoxH(width - 10); GUILayout.Space(10); EditorGUILayout.LabelField(_editor.GetText(TEXT.DLG_OptimizedBaking)); //"Optimized Baking" //"Target" apPortrait nextOptPortrait = (apPortrait)EditorGUILayout.ObjectField(_editor.GetText(TEXT.DLG_Target), _targetPortrait._bakeTargetOptPortrait, typeof(apPortrait), true); if (nextOptPortrait != _targetPortrait._bakeTargetOptPortrait) { //타겟을 바꾸었다. bool isChanged = false; if (nextOptPortrait != null) { //1. 다른 Portrait를 선택했다. if (!nextOptPortrait._isOptimizedPortrait) { //1-1. 최적화된 객체가 아니다. EditorUtility.DisplayDialog(_editor.GetText(TEXT.OptBakeError_Title), _editor.GetText(TEXT.OptBakeError_NotOptTarget_Body), _editor.GetText(TEXT.Close)); } else if (nextOptPortrait._bakeSrcEditablePortrait != _targetPortrait) { //1-2. 다른 대상으로부터 Bake된 Portrait같다. (물어보고 계속) bool isResult = EditorUtility.DisplayDialog(_editor.GetText(TEXT.OptBakeError_Title), _editor.GetText(TEXT.OptBakeError_SrcMatchError_Body), _editor.GetText(TEXT.Okay), _editor.GetText(TEXT.Cancel)); if (isResult) { //뭐 선택하겠다는데요 뭐.. isChanged = true; } } else { //1-3. 오케이. 변경 가능 isChanged = true; } } else { //2. 선택을 해제했다. isChanged = true; } if (isChanged) { //Target을 변경한다. apEditorUtil.SetRecord_Portrait(apUndoGroupData.ACTION.Portrait_SettingChanged, _editor, _targetPortrait, null, false); _targetPortrait._bakeTargetOptPortrait = nextOptPortrait; } } string optBtnText = ""; if (_targetPortrait._bakeTargetOptPortrait != null) { //optBtnText = "Optimized Bake to\n[" + _targetPortrait._bakeTargetOptPortrait.gameObject.name + "]"; optBtnText = string.Format("{0}\n[{1}]", _editor.GetText(TEXT.DLG_OptimizedBakeTo), _targetPortrait._bakeTargetOptPortrait.gameObject.name); } else { //optBtnText = "Optimized Bake\n(Make New GameObject)"; optBtnText = _editor.GetText(TEXT.DLG_OptimizedBakeMakeNew); } GUILayout.Space(10); if (GUILayout.Button(optBtnText, GUILayout.Height(45))) { GUI.FocusControl(null); //CheckChangedProperties(nextRootScale, nextZScale); //Optimized Bake를 하자 apBakeResult bakeResult = _editor.Controller.OptimizedBake(_targetPortrait, _targetPortrait._bakeTargetOptPortrait); if (bakeResult.NumUnlinkedExternalObject > 0) { EditorUtility.DisplayDialog(_editor.GetText(TEXT.BakeWarning_Title), _editor.GetTextFormat(TEXT.BakeWarning_Body, bakeResult.NumUnlinkedExternalObject), _editor.GetText(TEXT.Okay)); } _editor.Notification("[" + _targetPortrait.name + "] is Baked (Optimized)", false, false); } }
// GUI //------------------------------------------------------------------------ void OnGUI() { int width = (int)position.width; int height = (int)position.height; if (_editor == null || _funcResult == null || _targetControlParam == null) { CloseDialog(); return; } int height_List = height - 450; Color prevColor = GUI.backgroundColor; GUI.backgroundColor = new Color(0.9f, 0.9f, 0.9f); GUI.Box(new Rect(0, 156, width, height_List), ""); GUI.backgroundColor = prevColor; EditorGUILayout.BeginVertical(); EditorGUILayout.LabelField(_editor.GetText(TEXT.DLG_SelectedControlParamSetting)); //"Selected Controller Parameter Setting" //현재 선택한 Physics Param을 등록하는 UI GUIStyle boxGUIStyle = new GUIStyle(GUI.skin.box); boxGUIStyle.alignment = TextAnchor.MiddleCenter; boxGUIStyle.normal.textColor = apEditorUtil.BoxTextColor; GUILayout.Box(_targetControlParam._keyName, boxGUIStyle, GUILayout.Width(width - 8), GUILayout.Height(20)); GUILayout.Space(5); int width_Left = 90; int width_Right = width - 110; //Icon 이미지 | 이름, ValueType과 값 범위 (수정 불가) // | 저장 버튼 EditorGUILayout.BeginHorizontal(GUILayout.Width(width), GUILayout.Height(70)); GUILayout.Space(5); EditorGUILayout.BeginVertical(GUILayout.Width(width_Left), GUILayout.Height(70)); //Icon을 출력하자 Texture2D addParamIcon = _editor.ImageSet.Get(apEditorUtil.GetControlParamPresetIconType(_targetControlParam._iconPreset)); GUILayout.Box(addParamIcon, boxGUIStyle, GUILayout.Width(65), GUILayout.Height(65)); EditorGUILayout.EndVertical(); EditorGUILayout.BeginVertical(GUILayout.Width(width_Right), GUILayout.Height(70)); //이름, Icon 및 등록 버튼 EditorGUILayout.BeginHorizontal(GUILayout.Width(width_Right)); EditorGUILayout.LabelField(_editor.GetText(TEXT.DLG_Range), GUILayout.Width(80)); //"Range" EditorGUILayout.LabelField(_strValueInfo, GUILayout.Width(width_Right - 88)); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(GUILayout.Width(width_Right)); EditorGUILayout.LabelField(_editor.GetText(TEXT.DLG_Default), GUILayout.Width(80)); //"Default" EditorGUILayout.LabelField(_strDefaultInfo, GUILayout.Width(width_Right - 88)); EditorGUILayout.EndHorizontal(); GUILayout.Space(5); EditorGUILayout.BeginHorizontal(GUILayout.Width(width_Right)); if (GUILayout.Button(_editor.GetText(TEXT.DLG_RegistToPreset), GUILayout.Width(150))) //"Regist To Preset" { //bool result = EditorUtility.DisplayDialog("Regist to Preset", "Regist Preset [" + _strAddParamName + "] ?", "Regist", "Cancel"); bool result = EditorUtility.DisplayDialog(_editor.GetText(TEXT.ControlParamPreset_Regist_Title), _editor.GetTextFormat(TEXT.ControlParamPreset_Regist_Body, _strAddParamName), _editor.GetText(TEXT.ControlParamPreset_Regist_Okay), _editor.GetText(TEXT.Cancel)); if (result) { //Control Param으로 추가하자 _editor.ControlParamPreset.AddNewPreset(_targetControlParam); } } EditorGUILayout.EndHorizontal(); EditorGUILayout.EndVertical(); EditorGUILayout.EndHorizontal(); GUILayout.Space(5); apEditorUtil.GUI_DelimeterBoxH(width); GUILayout.Space(5); GUIStyle guiStyle = new GUIStyle(GUIStyle.none); guiStyle.normal.textColor = GUI.skin.label.normal.textColor; guiStyle.alignment = TextAnchor.MiddleLeft; GUIStyle guiStyle_NotSelectable = new GUIStyle(GUIStyle.none); guiStyle_NotSelectable.normal.textColor = Color.red; guiStyle_NotSelectable.alignment = TextAnchor.MiddleLeft; GUIStyle guiStyle_Center = new GUIStyle(GUIStyle.none); guiStyle_Center.normal.textColor = GUI.skin.label.normal.textColor; guiStyle_Center.alignment = TextAnchor.MiddleCenter; GUILayout.Space(10); _scrollList = EditorGUILayout.BeginScrollView(_scrollList, GUILayout.Width(width), GUILayout.Height(height_List)); //"Presets" GUILayout.Button(new GUIContent(_editor.GetText(TEXT.DLG_Presets), _editor.ImageSet.Get(apImageSet.PRESET.Hierarchy_FoldDown)), guiStyle, GUILayout.Height(20)); //<투명 버튼 for (int i = 0; i < _editor.ControlParamPreset.Presets.Count; i++) { //DrawBoneUnit(_boneUnits_Root[i], 0, width, iconImage_FoldDown, iconImage_FoldRight, guiContent_Bone, guiStyle, guiStyle_NotSelectable, _scrollList.x); DrawPresetUnit(_editor.ControlParamPreset.Presets[i], i, width - 18, _scrollList.x); } GUILayout.Space(310); EditorGUILayout.EndScrollView(); EditorGUILayout.EndVertical(); GUILayout.Space(10); //TODO : 선택된 객체 정보 + 삭제(Reserved 아닌 경우) + 적용과 취소 int width_Info = ((width - 10) / 2) - 10; int height_Info = 150; int selectedIconSize = 40; if (_selectedUnit != null) { GUILayout.Box("[" + _selectedUnit._keyName + "]", boxGUIStyle, GUILayout.Width(width - 8), GUILayout.Height(30)); //아이콘, 카테고리, 값 타입 int rightInfoWidth = width - (selectedIconSize + 20); EditorGUILayout.BeginHorizontal(GUILayout.Width(width), GUILayout.Height(selectedIconSize)); Texture2D iconImage = _editor.ImageSet.Get(apEditorUtil.GetControlParamPresetIconType(_selectedUnit._iconPreset)); GUILayout.Space(5); GUILayout.Box(iconImage, boxGUIStyle, GUILayout.Width(selectedIconSize), GUILayout.Height(selectedIconSize)); GUILayout.Space(5); EditorGUILayout.BeginVertical(GUILayout.Width(rightInfoWidth), GUILayout.Height(selectedIconSize)); //카테고리 //값 타입 GUILayout.Space(5); //"Category" EditorGUILayout.EnumPopup(_editor.GetText(TEXT.DLG_Category), _selectedUnit._category, GUILayout.Width(rightInfoWidth)); //"Value Type" EditorGUILayout.EnumPopup(_editor.GetText(TEXT.DLG_ValueType), _selectedUnit._valueType, GUILayout.Width(rightInfoWidth)); EditorGUILayout.EndVertical(); EditorGUILayout.EndHorizontal(); GUILayout.Space(5); //반반 나눠서 그려주자 // Def | Label // Range | SnapSize int bottomInfoWidth = width_Info - 10; string strValueDef = ""; string strLabel1 = ""; string strLabel2 = ""; int optLabelWidth = 50; int optValueWidth = bottomInfoWidth - (optLabelWidth + 10); int optValue2Width = (bottomInfoWidth - (optLabelWidth + 10)) / 2; switch (_selectedUnit._valueType) { case apControlParam.TYPE.Int: strValueDef = _selectedUnit._int_Def.ToString(); //strLabel1 = "Min"; //strLabel2 = "Max"; strLabel1 = _editor.GetText(TEXT.DLG_Min); strLabel2 = _editor.GetText(TEXT.DLG_Max); break; case apControlParam.TYPE.Float: strValueDef = _selectedUnit._float_Def.ToString(); //strLabel1 = "Min"; //strLabel2 = "Max"; strLabel1 = _editor.GetText(TEXT.DLG_Min); strLabel2 = _editor.GetText(TEXT.DLG_Max); break; case apControlParam.TYPE.Vector2: strValueDef = _selectedUnit._vec2_Def.ToString(); //strLabel1 = "Axis 1"; //strLabel2 = "Axis 2"; strLabel1 = _editor.GetText(TEXT.DLG_Axis1); strLabel2 = _editor.GetText(TEXT.DLG_Axis2); break; } GUILayout.Space(5); EditorGUILayout.BeginHorizontal(GUILayout.Width(width), GUILayout.Height(height_Info)); GUILayout.Space(5); EditorGUILayout.BeginVertical(GUILayout.Width(width_Info), GUILayout.Height(height_Info)); //왼쪽 영역 //기본 값 //값 범위 EditorGUILayout.LabelField(_editor.GetText(TEXT.DLG_ValueRange), GUILayout.Width(width_Info)); //"Value Range" GUILayout.Space(5); EditorGUILayout.BeginHorizontal(GUILayout.Width(width_Info)); EditorGUILayout.LabelField(_editor.GetText(TEXT.DLG_Default), GUILayout.Width(optLabelWidth)); //"Default" EditorGUILayout.TextField(strValueDef, GUILayout.Width(optValueWidth)); EditorGUILayout.EndHorizontal(); GUILayout.Space(5); switch (_selectedUnit._valueType) { case apControlParam.TYPE.Int: EditorGUILayout.BeginHorizontal(GUILayout.Width(width_Info)); EditorGUILayout.LabelField(_editor.GetText(TEXT.DLG_Min), GUILayout.Width(optLabelWidth)); //"Min" EditorGUILayout.IntField(_selectedUnit._int_Min, GUILayout.Width(optValueWidth)); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(GUILayout.Width(width_Info)); EditorGUILayout.LabelField(_editor.GetText(TEXT.DLG_Max), GUILayout.Width(optLabelWidth)); //"Max" EditorGUILayout.IntField(_selectedUnit._int_Max, GUILayout.Width(optValueWidth)); EditorGUILayout.EndHorizontal(); break; case apControlParam.TYPE.Float: EditorGUILayout.BeginHorizontal(GUILayout.Width(width_Info)); EditorGUILayout.LabelField(_editor.GetText(TEXT.DLG_Min), GUILayout.Width(optLabelWidth)); //"Min" EditorGUILayout.FloatField(_selectedUnit._float_Min, GUILayout.Width(optValueWidth)); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(GUILayout.Width(width_Info)); EditorGUILayout.LabelField(_editor.GetText(TEXT.DLG_Max), GUILayout.Width(optLabelWidth)); //"Max" EditorGUILayout.FloatField(_selectedUnit._float_Max, GUILayout.Width(optValueWidth)); EditorGUILayout.EndHorizontal(); break; case apControlParam.TYPE.Vector2: { EditorGUILayout.BeginHorizontal(GUILayout.Width(bottomInfoWidth)); EditorGUILayout.LabelField("", GUILayout.Width(optLabelWidth)); EditorGUILayout.LabelField(_editor.GetText(TEXT.DLG_Min), GUILayout.Width(optValue2Width)); //"Min" EditorGUILayout.LabelField(_editor.GetText(TEXT.DLG_Max), GUILayout.Width(optValue2Width)); //"Max" EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(GUILayout.Width(bottomInfoWidth)); EditorGUILayout.LabelField("X", GUILayout.Width(optLabelWidth)); EditorGUILayout.FloatField(_selectedUnit._vec2_Min.x, GUILayout.Width(optValue2Width)); EditorGUILayout.FloatField(_selectedUnit._vec2_Max.x, GUILayout.Width(optValue2Width)); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(GUILayout.Width(bottomInfoWidth)); EditorGUILayout.LabelField("Y", GUILayout.Width(optLabelWidth)); EditorGUILayout.FloatField(_selectedUnit._vec2_Min.y, GUILayout.Width(optValue2Width)); EditorGUILayout.FloatField(_selectedUnit._vec2_Max.y, GUILayout.Width(optValue2Width)); EditorGUILayout.EndHorizontal(); } break; } EditorGUILayout.EndVertical(); GUILayout.Space(4); EditorGUILayout.BeginVertical(GUILayout.Width(width_Info), GUILayout.Height(height_Info)); //오른쪽 영역 //Label //SnapSize EditorGUILayout.LabelField(_editor.GetText(TEXT.DLG_Label), GUILayout.Width(bottomInfoWidth)); //"Label" GUILayout.Space(5); EditorGUILayout.BeginHorizontal(GUILayout.Width(bottomInfoWidth)); EditorGUILayout.LabelField(strLabel1, GUILayout.Width(optLabelWidth)); EditorGUILayout.TextField(_selectedUnit._label_Min, GUILayout.Width(optValueWidth)); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(GUILayout.Width(bottomInfoWidth)); EditorGUILayout.LabelField(strLabel2, GUILayout.Width(optLabelWidth)); EditorGUILayout.TextField(_selectedUnit._label_Max, GUILayout.Width(optValueWidth)); EditorGUILayout.EndHorizontal(); GUILayout.Space(5); EditorGUILayout.LabelField(_editor.GetText(TEXT.DLG_SnapSize), GUILayout.Width(bottomInfoWidth)); //"Snap Size" EditorGUILayout.IntField(_selectedUnit._snapSize, GUILayout.Width(bottomInfoWidth)); //Reserved가 아니면 삭제가능 if (!_selectedUnit._isReserved) { //"Remove Preset" if (GUILayout.Button(_editor.GetText(TEXT.DLG_RemovePreset), GUILayout.Height(25))) { bool result = EditorUtility.DisplayDialog(_editor.GetText(TEXT.ControlParamPreset_Remove_Title), _editor.GetTextFormat(TEXT.ControlParamPreset_Remove_Body, _selectedUnit._keyName), _editor.GetText(TEXT.Remove), _editor.GetText(TEXT.Cancel)); if (result) { int targetID = _selectedUnit._uniqueID; _selectedUnit = null; _editor.ControlParamPreset.RemovePreset(targetID); } } } EditorGUILayout.EndVertical(); EditorGUILayout.EndHorizontal(); } else { //"No Selected" GUILayout.Box(_editor.GetText(TEXT.DLG_NotSelected), boxGUIStyle, GUILayout.Width(width - 8), GUILayout.Height(30)); GUILayout.Space(height_Info + selectedIconSize + 14); } bool isClose = false; bool isSelectBtnAvailable = _selectedUnit != null; EditorGUILayout.BeginHorizontal(); if (apEditorUtil.ToggledButton(_editor.GetText(TEXT.DLG_Apply), false, isSelectBtnAvailable, (width / 2) - 8, 30)) //"Apply" { _funcResult(true, _loadKey, _selectedUnit, _targetControlParam); isClose = true; } if (apEditorUtil.ToggledButton(_editor.GetText(TEXT.DLG_Close), false, true, (width / 2) - 8, 30)) //"Close" { //_funcResult(false, _loadKey, null, null); _funcResult(false, _loadKey, null, _targetControlParam); isClose = true; } EditorGUILayout.EndHorizontal(); if (isClose) { CloseDialog(); } }
// GUI //------------------------------------------------------------------ void OnGUI() { int width = (int)position.width; int height = (int)position.height; if (_editor == null || _targetBone == null || _funcResult == null) { CloseDialog(); return; } //오프셋과 자식 복사 여부 int width_Label = 30; int width_Value = (width - 10) - 34; GUILayout.Space(5); EditorGUILayout.LabelField(_editor.GetText(TEXT.DLG_PositionOffset)); GUILayout.Space(5); EditorGUILayout.BeginHorizontal(GUILayout.Width(width)); GUILayout.Space(5); EditorGUILayout.LabelField("X", GUILayout.Width(width_Label)); _offsetX = EditorGUILayout.FloatField(_offsetX, GUILayout.Width(width_Value)); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(GUILayout.Width(width)); GUILayout.Space(5); EditorGUILayout.LabelField("Y", GUILayout.Width(width_Label)); _offsetY = EditorGUILayout.FloatField(_offsetY, GUILayout.Width(width_Value)); EditorGUILayout.EndHorizontal(); GUILayout.Space(10); EditorGUILayout.BeginHorizontal(GUILayout.Width(width)); GUILayout.Space(5); EditorGUILayout.LabelField(_editor.GetUIWord(UIWORD.DuplicateWithChildBones), GUILayout.Width(width - (10 + 30))); //"Duplicate with Child Bones" _isDuplicateChildren = EditorGUILayout.Toggle(_isDuplicateChildren, GUILayout.Width(30)); EditorGUILayout.EndHorizontal(); GUILayout.Space(10); EditorGUILayout.BeginHorizontal(GUILayout.Width(width)); int width_Btn = ((width - 10) / 2) - 4; bool isCloseDialog = false; if (GUILayout.Button(_editor.GetUIWord(UIWORD.Duplicate), GUILayout.Width(width_Btn), GUILayout.Height(30))) //"Start Edit" { _funcResult(true, _targetBone, _loadKey, _offsetX, _offsetY, _isDuplicateChildren); isCloseDialog = true; } if (GUILayout.Button(_editor.GetText(TEXT.Cancel), GUILayout.Width(width_Btn), GUILayout.Height(30))) //"Close" { _funcResult(false, _targetBone, null, _offsetX, _offsetY, _isDuplicateChildren); isCloseDialog = true; } EditorGUILayout.EndHorizontal(); if (isCloseDialog) { CloseDialog(); } }
// GUI //------------------------------------------------------------------ void OnGUI() { int width = (int)position.width; int height = (int)position.height; if (_editor == null || _targetPortrait == null) { CloseDialog(); return; } //만약 Portriat가 바뀌었거나 Editor가 리셋되면 닫자 if (_editor != apEditor.CurrentEditor || _targetPortrait != apEditor.CurrentEditor._portrait) { CloseDialog(); return; } //_scroll = EditorGUILayout.BeginScrollView(_scroll, false, true, GUILayout.Width(width), GUILayout.Height(height)); //EditorGUILayout.BeginVertical(GUILayout.Width(width - 28)); width -= 10; //Color toneColor = _editor._colorOption_OnionToneColor; //Color animPrevColor = _editor._colorOption_OnionAnimPrevColor; //Color animNextColor = _editor._colorOption_OnionAnimNextColor; bool isOutlineRender = _editor._onionOption_IsOutlineRender; float outlineThickness = _editor._onionOption_OutlineThickness; bool isRenderOnlySelected = _editor._onionOption_IsRenderOnlySelected; bool isRenderBehind = _editor._onionOption_IsRenderBehind; bool isRenderAnimFrames = _editor._onionOption_IsRenderAnimFrames; int prevRange = _editor._onionOption_PrevRange; int nextRange = _editor._onionOption_NextRange; int renderPerFrame = _editor._onionOption_RenderPerFrame; float posOffsetX = _editor._onionOption_PosOffsetX; float posOffsetY = _editor._onionOption_PosOffsetY; bool IKCalculateForce = _editor._onionOption_IKCalculateForce; bool isChanged = false; GUIStyle guiStyle_Box = new GUIStyle(GUI.skin.box); guiStyle_Box.alignment = TextAnchor.MiddleCenter; if (EditorGUIUtility.isProSkin) { guiStyle_Box.normal.textColor = Color.white; } Color prevColor = GUI.backgroundColor; GUILayout.Space(10); GUI.backgroundColor = new Color(0.7f, 1.0f, 0.6f, 1.0f); GUILayout.Box(_editor.GetText(TEXT.DLG_BasicSettings), guiStyle_Box, GUILayout.Width(width), GUILayout.Height(25)); //"Basic Settings" GUI.backgroundColor = prevColor; GUILayout.Space(5); //- 색상 //- 렌더링 방식 < Outline / Solid (Enum) //- 두께 //- 앞/뒤 < Enum //- 선택Only / 전체 < Enum int widthValue = 130; int widthLabel = width - (10 + widthValue + 5); int widthValueHalf = (widthValue / 2) - 2; //1. 색상들 EditorGUILayout.BeginHorizontal(GUILayout.Width(width)); GUILayout.Space(5); EditorGUILayout.LabelField(_editor.GetText(TEXT.DLG_Colors), GUILayout.Width(widthLabel)); //"Colors" EditorGUILayout.LabelField(_editor.GetText(TEXT.DLG_Mesh), GUILayout.Width(widthValueHalf)); //"Mesh" EditorGUILayout.LabelField(_editor.GetText(TEXT.DLG_Bone), GUILayout.Width(widthValueHalf)); //"Bone" EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(GUILayout.Width(width)); GUILayout.Space(5); EditorGUILayout.LabelField(_editor.GetText(TEXT.DLG_SingleMarker), GUILayout.Width(widthLabel)); //"Single Marker" try { Color nextToneColor = EditorGUILayout.ColorField(_editor._colorOption_OnionToneColor, GUILayout.Width(widthValueHalf)); if (!IsSameColor(_editor._colorOption_OnionToneColor, nextToneColor)) { _editor._colorOption_OnionToneColor = nextToneColor; apGL.SetToneOption(_editor._colorOption_OnionToneColor, _editor._onionOption_OutlineThickness, _editor._onionOption_IsOutlineRender, _editor._onionOption_PosOffsetX, _editor._onionOption_PosOffsetY, _editor._colorOption_OnionBoneColor); } } catch (Exception) { } try { Color nextBoneColor = EditorGUILayout.ColorField(_editor._colorOption_OnionBoneColor, GUILayout.Width(widthValueHalf)); if (!IsSameColor(nextBoneColor, _editor._colorOption_OnionBoneColor)) { _editor._colorOption_OnionBoneColor = nextBoneColor; apGL.SetToneOption(_editor._colorOption_OnionToneColor, _editor._onionOption_OutlineThickness, _editor._onionOption_IsOutlineRender, _editor._onionOption_PosOffsetX, _editor._onionOption_PosOffsetY, _editor._colorOption_OnionBoneColor); } } catch (Exception) { } EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(GUILayout.Width(width)); GUILayout.Space(5); EditorGUILayout.LabelField(_editor.GetText(TEXT.DLG_PreviousFrames), GUILayout.Width(widthLabel)); //"Previous Frames" try { _editor._colorOption_OnionAnimPrevColor = EditorGUILayout.ColorField(_editor._colorOption_OnionAnimPrevColor, GUILayout.Width(widthValueHalf)); } catch (Exception) { } try { _editor._colorOption_OnionBonePrevColor = EditorGUILayout.ColorField(_editor._colorOption_OnionBonePrevColor, GUILayout.Width(widthValueHalf)); } catch (Exception) { } EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(GUILayout.Width(width)); GUILayout.Space(5); EditorGUILayout.LabelField(_editor.GetText(TEXT.DLG_NextFrames), GUILayout.Width(widthLabel)); //"Next Frames" try { _editor._colorOption_OnionAnimNextColor = EditorGUILayout.ColorField(_editor._colorOption_OnionAnimNextColor, GUILayout.Width(widthValueHalf)); } catch (Exception) { } try { _editor._colorOption_OnionBoneNextColor = EditorGUILayout.ColorField(_editor._colorOption_OnionBoneNextColor, GUILayout.Width(widthValueHalf)); } catch (Exception) { } EditorGUILayout.EndHorizontal(); if (GUILayout.Button(_editor.GetText(TEXT.DLG_RestoretoDefaultColors), GUILayout.Width(width), GUILayout.Height(20))) //"Restore Default Colors" { _editor._colorOption_OnionToneColor = apEditor.DefaultColor_OnionToneColor; _editor._colorOption_OnionAnimPrevColor = apEditor.DefaultColor_OnionAnimPrevColor; _editor._colorOption_OnionAnimNextColor = apEditor.DefaultColor_OnionAnimNextColor; _editor._colorOption_OnionBoneColor = apEditor.DefaultColor_OnionBoneColor; _editor._colorOption_OnionBonePrevColor = apEditor.DefaultColor_OnionBonePrevColor; _editor._colorOption_OnionBoneNextColor = apEditor.DefaultColor_OnionBoneNextColor; _editor.SaveEditorPref(); } GUILayout.Space(10); //렌더 모드 int iEnumRenderMode = (isOutlineRender ? 0 : 1); EditorGUILayout.BeginHorizontal(GUILayout.Width(width)); GUILayout.Space(5); EditorGUILayout.LabelField(_editor.GetText(TEXT.DLG_Shape), GUILayout.Width(widthLabel)); //"Shape" int nextEnumRenderMode = EditorGUILayout.Popup(iEnumRenderMode, _enumTitle_RenderMode, GUILayout.Width(widthValue)); if (nextEnumRenderMode != iEnumRenderMode) { isOutlineRender = (nextEnumRenderMode == 0 ? true : false); isChanged = true; } EditorGUILayout.EndHorizontal(); //- 두께 EditorGUILayout.BeginHorizontal(GUILayout.Width(width)); GUILayout.Space(5); EditorGUILayout.LabelField(_editor.GetText(TEXT.DLG_Thickness01), GUILayout.Width(widthLabel)); //"Thickness (0~1)" float nextOutlineThickness = EditorGUILayout.DelayedFloatField(outlineThickness, GUILayout.Width(widthValue)); if (nextOutlineThickness != outlineThickness) { outlineThickness = nextOutlineThickness; isChanged = true; apEditorUtil.ReleaseGUIFocus(); } EditorGUILayout.EndHorizontal(); //- 앞/뒤 < Enum int iEnumRenderOrder = (isRenderBehind ? 1 : 0); EditorGUILayout.BeginHorizontal(GUILayout.Width(width)); GUILayout.Space(5); EditorGUILayout.LabelField(_editor.GetText(TEXT.DLG_Order), GUILayout.Width(widthLabel)); //"Order" int nextEnumRenderOrder = EditorGUILayout.Popup(iEnumRenderOrder, _enumTitle_RenderOrder, GUILayout.Width(widthValue)); if (nextEnumRenderOrder != iEnumRenderOrder) { isRenderBehind = (nextEnumRenderOrder == 0 ? false : true); isChanged = true; } EditorGUILayout.EndHorizontal(); //- 선택Only / 전체 < Enum int iEnumSelected = (isRenderOnlySelected ? 1 : 0); EditorGUILayout.BeginHorizontal(GUILayout.Width(width)); GUILayout.Space(5); EditorGUILayout.LabelField(_editor.GetText(TEXT.DLG_Target), GUILayout.Width(widthLabel)); //"Target" int nextEnumSelected = EditorGUILayout.Popup(iEnumSelected, _enumTitle_SelectedMode, GUILayout.Width(widthValue)); if (nextEnumSelected != iEnumSelected) { isRenderOnlySelected = (nextEnumSelected == 0 ? false : true); isChanged = true; } EditorGUILayout.EndHorizontal(); //float posOffsetX = _editor._onionOption_PosOffsetX; //float posOffsetY = _editor._onionOption_PosOffsetY; EditorGUILayout.BeginHorizontal(GUILayout.Width(width)); GUILayout.Space(5); EditorGUILayout.LabelField(_editor.GetText(TEXT.DLG_PositionOffset), GUILayout.Width(widthLabel)); //"Position Offset" float nextPosOffsetX = EditorGUILayout.DelayedFloatField(posOffsetX, GUILayout.Width((widthValue / 2) - 2)); float nextPosOffsetY = EditorGUILayout.DelayedFloatField(posOffsetY, GUILayout.Width((widthValue / 2) - 2)); if (Mathf.Abs(nextPosOffsetX - posOffsetX) > 0.0001f) { posOffsetX = nextPosOffsetX; isChanged = true; apEditorUtil.ReleaseGUIFocus(); } if (Mathf.Abs(nextPosOffsetY - posOffsetY) > 0.0001f) { posOffsetY = nextPosOffsetY; isChanged = true; apEditorUtil.ReleaseGUIFocus(); } EditorGUILayout.EndHorizontal(); //IK 계산 int iEnumIK = (IKCalculateForce ? 0 : 1); EditorGUILayout.BeginHorizontal(GUILayout.Width(width)); GUILayout.Space(5); EditorGUILayout.LabelField(_editor.GetText(TEXT.DLG_IKCalculation), GUILayout.Width(widthLabel)); //"IK calculation" int nextEnumIK = EditorGUILayout.Popup(iEnumIK, _enimTitle_IKCalculate, GUILayout.Width(widthValue)); if (nextEnumIK != iEnumIK) { IKCalculateForce = (nextEnumIK == 0 ? true : false); isChanged = true; } EditorGUILayout.EndHorizontal(); GUILayout.Space(20); GUI.backgroundColor = new Color(0.3f, 0.9f, 1.0f, 1.0f); GUILayout.Box(_editor.GetText(TEXT.DLG_AnimationSettings), guiStyle_Box, GUILayout.Width(width), GUILayout.Height(25)); //"Animation Settings" GUI.backgroundColor = prevColor; GUILayout.Space(5); //- 단일 프레임 <-> 범위 프레임 비교 < 아이콘 //- 이전/이후 프레임 //- Render Per Frame EditorGUILayout.LabelField(_editor.GetText(TEXT.DLG_AnimationFrameRendering), GUILayout.Width(width)); //"Animation Frame Rendering" Texture2D img_SingleFrame = _editor.ImageSet.Get(apImageSet.PRESET.OnionSkin_SingleFrame); Texture2D img_MultipleFrame = _editor.ImageSet.Get(apImageSet.PRESET.OnionSkin_MultipleFrame); int width_Half = ((width - 10) / 2) - 2; string strBtn_SingleFrame = " " + _editor.GetText(TEXT.DLG_SingleFrame); //" Single Frame" string strBtn_MultipleFrames = " " + _editor.GetText(TEXT.DLG_MultipleFrames); //" Multiple Frames" EditorGUILayout.BeginHorizontal(GUILayout.Width(width), GUILayout.Height(30)); GUILayout.Space(5); if (apEditorUtil.ToggledButton_2Side(img_SingleFrame, strBtn_SingleFrame, strBtn_SingleFrame, !isRenderAnimFrames, true, width_Half, 30)) { isRenderAnimFrames = false; isChanged = true; } if (apEditorUtil.ToggledButton_2Side(img_MultipleFrame, strBtn_MultipleFrames, strBtn_MultipleFrames, isRenderAnimFrames, true, width_Half, 30)) { isRenderAnimFrames = true; isChanged = true; } EditorGUILayout.EndHorizontal(); EditorGUILayout.LabelField(_editor.GetText(TEXT.DLG_Range), GUILayout.Width(width)); //"Range" EditorGUILayout.BeginHorizontal(GUILayout.Width(width)); GUILayout.Space(5); EditorGUILayout.LabelField(_editor.GetText(TEXT.DLG_PreviousRange), GUILayout.Width(widthLabel)); //"Previous" int changedPrevRange = EditorGUILayout.DelayedIntField(prevRange, GUILayout.Width(widthValue)); if (changedPrevRange != prevRange) { prevRange = changedPrevRange; isChanged = true; apEditorUtil.ReleaseGUIFocus(); } EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(GUILayout.Width(width)); GUILayout.Space(5); EditorGUILayout.LabelField(_editor.GetText(TEXT.DLG_NextRange), GUILayout.Width(widthLabel)); //"Next" int changedNextRange = EditorGUILayout.DelayedIntField(nextRange, GUILayout.Width(widthValue)); if (changedNextRange != nextRange) { nextRange = changedNextRange; isChanged = true; apEditorUtil.ReleaseGUIFocus(); } EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(GUILayout.Width(width)); GUILayout.Space(5); EditorGUILayout.LabelField(_editor.GetText(TEXT.DLG_FramePerRender), GUILayout.Width(widthLabel)); //"Render per Frame" int changedRenderPerFrame = EditorGUILayout.DelayedIntField(renderPerFrame, GUILayout.Width(widthValue)); if (changedRenderPerFrame != renderPerFrame) { renderPerFrame = changedRenderPerFrame; isChanged = true; apEditorUtil.ReleaseGUIFocus(); } EditorGUILayout.EndHorizontal(); if (isChanged) { _editor._onionOption_IsOutlineRender = isOutlineRender; _editor._onionOption_OutlineThickness = Mathf.Clamp01(outlineThickness); _editor._onionOption_IsRenderOnlySelected = isRenderOnlySelected; _editor._onionOption_IsRenderBehind = isRenderBehind; _editor._onionOption_IsRenderAnimFrames = isRenderAnimFrames; _editor._onionOption_PrevRange = Mathf.Max(prevRange, 0); _editor._onionOption_NextRange = Mathf.Max(nextRange, 0); _editor._onionOption_RenderPerFrame = Mathf.Max(renderPerFrame, 1); _editor._onionOption_PosOffsetX = posOffsetX; _editor._onionOption_PosOffsetY = posOffsetY; _editor._onionOption_IKCalculateForce = IKCalculateForce; _editor.SaveEditorPref(); } GUILayout.Space(20); if (GUILayout.Button(_editor.GetText(TEXT.DLG_RestoretoDefaultSettings), GUILayout.Width(width), GUILayout.Height(20))) //"Restore to Default Settings" { //TODO _editor._onionOption_IsOutlineRender = true; _editor._onionOption_OutlineThickness = 0.5f; _editor._onionOption_IsRenderOnlySelected = false; _editor._onionOption_IsRenderBehind = false; _editor._onionOption_IsRenderAnimFrames = false; _editor._onionOption_PrevRange = 1; _editor._onionOption_NextRange = 1; _editor._onionOption_RenderPerFrame = 1; _editor._onionOption_PosOffsetX = 0.0f; _editor._onionOption_PosOffsetY = 0.0f; _editor._onionOption_IKCalculateForce = false; _editor.SaveEditorPref(); } GUILayout.Space(5); if (GUILayout.Button(_editor.GetText(TEXT.Close), GUILayout.Width(width), GUILayout.Height(35))) { _editor.SaveEditorPref(); CloseDialog(); } //GUILayout.Height(height + 300); //EditorGUILayout.EndVertical(); //EditorGUILayout.EndScrollView(); }
// GUI //------------------------------------------------------------------ void OnGUI() { int width = (int)position.width; int height = (int)position.height; if (_editor == null || _targetPortrait == null) { CloseDialog(); return; } //만약 Portriat가 바뀌었거나 Editor가 리셋되면 닫자 if (_editor != apEditor.CurrentEditor || _targetPortrait != apEditor.CurrentEditor._portrait) { CloseDialog(); return; } //Sorting Layer를 추가하자 if (_sortingLayerNames == null || _sortingLayerIDs == null) { _sortingLayerNames = new string[SortingLayer.layers.Length]; _sortingLayerIDs = new int[SortingLayer.layers.Length]; } else if (_sortingLayerNames.Length != SortingLayer.layers.Length || _sortingLayerIDs.Length != SortingLayer.layers.Length) { _sortingLayerNames = new string[SortingLayer.layers.Length]; _sortingLayerIDs = new int[SortingLayer.layers.Length]; } for (int i = 0; i < SortingLayer.layers.Length; i++) { _sortingLayerNames[i] = SortingLayer.layers[i].name; _sortingLayerIDs[i] = SortingLayer.layers[i].id; } int width_2Btn = (width - 14) / 2; EditorGUILayout.BeginHorizontal(GUILayout.Width(width), GUILayout.Height(25)); GUILayout.Space(5); if (apEditorUtil.ToggledButton(_editor.GetText(TEXT.DLG_Bake), _tab == TAB.Bake, width_2Btn, 25)) { _tab = TAB.Bake; } if (apEditorUtil.ToggledButton(_editor.GetText(TEXT.DLG_Setting), _tab == TAB.Options, width_2Btn, 25)) { _tab = TAB.Options; } EditorGUILayout.EndHorizontal(); if (_tab == TAB.Bake) { GUILayout.Space(5); // 1. Bake에 대한 UI //Bake 설정 //EditorGUILayout.LabelField(_editor.GetText(TEXT.DLG_BakeSetting));//"Bake Setting" //GUILayout.Space(5); EditorGUILayout.ObjectField(_editor.GetText(TEXT.DLG_Portrait), _targetPortrait, typeof(apPortrait), true); //"Portait" GUILayout.Space(5); //"Bake Scale" float prevBakeScale = _targetPortrait._bakeScale; _targetPortrait._bakeScale = EditorGUILayout.FloatField(_editor.GetText(TEXT.DLG_BakeScale), _targetPortrait._bakeScale); //"Z Per Depth" float prevBakeZSize = _targetPortrait._bakeZSize; _targetPortrait._bakeZSize = EditorGUILayout.FloatField(_editor.GetText(TEXT.DLG_ZPerDepth), _targetPortrait._bakeZSize); if (_targetPortrait._bakeZSize < 0.5f) { _targetPortrait._bakeZSize = 0.5f; } if (prevBakeScale != _targetPortrait._bakeScale || prevBakeZSize != _targetPortrait._bakeZSize) { apEditorUtil.SetEditorDirty(); } //Bake 버튼 GUILayout.Space(10); if (GUILayout.Button(_editor.GetText(TEXT.DLG_Bake), GUILayout.Height(45))) //"Bake" { GUI.FocusControl(null); //CheckChangedProperties(nextRootScale, nextZScale); apEditorUtil.SetEditorDirty(); //------------------------------------- // Bake 함수를 실행한다. << 중요오오오오 //------------------------------------- apBakeResult bakeResult = _editor.Controller.Bake(); _editor.Notification("[" + _targetPortrait.name + "] is Baked", false, false); if (bakeResult.NumUnlinkedExternalObject > 0) { EditorUtility.DisplayDialog(_editor.GetText(TEXT.BakeWarning_Title), _editor.GetTextFormat(TEXT.BakeWarning_Body, bakeResult.NumUnlinkedExternalObject), _editor.GetText(TEXT.Okay)); } //추가 3.29 : Bake 후에 Ambient를 체크하자 CheckAmbientAndCorrection(); } GUILayout.Space(10); apEditorUtil.GUI_DelimeterBoxH(width - 10); GUILayout.Space(10); //최적화 Bake EditorGUILayout.LabelField(_editor.GetText(TEXT.DLG_OptimizedBaking)); //"Optimized Baking" //"Target" apPortrait nextOptPortrait = (apPortrait)EditorGUILayout.ObjectField(_editor.GetText(TEXT.DLG_Target), _targetPortrait._bakeTargetOptPortrait, typeof(apPortrait), true); if (nextOptPortrait != _targetPortrait._bakeTargetOptPortrait) { //타겟을 바꾸었다. bool isChanged = false; if (nextOptPortrait != null) { //1. 다른 Portrait를 선택했다. if (!nextOptPortrait._isOptimizedPortrait) { //1-1. 최적화된 객체가 아니다. EditorUtility.DisplayDialog(_editor.GetText(TEXT.OptBakeError_Title), _editor.GetText(TEXT.OptBakeError_NotOptTarget_Body), _editor.GetText(TEXT.Close)); } else if (nextOptPortrait._bakeSrcEditablePortrait != _targetPortrait) { //1-2. 다른 대상으로부터 Bake된 Portrait같다. (물어보고 계속) bool isResult = EditorUtility.DisplayDialog(_editor.GetText(TEXT.OptBakeError_Title), _editor.GetText(TEXT.OptBakeError_SrcMatchError_Body), _editor.GetText(TEXT.Okay), _editor.GetText(TEXT.Cancel)); if (isResult) { //뭐 선택하겠다는데요 뭐.. isChanged = true; } } else { //1-3. 오케이. 변경 가능 isChanged = true; } } else { //2. 선택을 해제했다. isChanged = true; } if (isChanged) { //Target을 변경한다. apEditorUtil.SetRecord_Portrait(apUndoGroupData.ACTION.Portrait_SettingChanged, _editor, _targetPortrait, null, false); _targetPortrait._bakeTargetOptPortrait = nextOptPortrait; } } string optBtnText = ""; if (_targetPortrait._bakeTargetOptPortrait != null) { //optBtnText = "Optimized Bake to\n[" + _targetPortrait._bakeTargetOptPortrait.gameObject.name + "]"; optBtnText = string.Format("{0}\n[{1}]", _editor.GetText(TEXT.DLG_OptimizedBakeTo), _targetPortrait._bakeTargetOptPortrait.gameObject.name); } else { //optBtnText = "Optimized Bake\n(Make New GameObject)"; optBtnText = _editor.GetText(TEXT.DLG_OptimizedBakeMakeNew); } GUILayout.Space(10); if (GUILayout.Button(optBtnText, GUILayout.Height(45))) { GUI.FocusControl(null); //CheckChangedProperties(nextRootScale, nextZScale); //Optimized Bake를 하자 apBakeResult bakeResult = _editor.Controller.OptimizedBake(_targetPortrait, _targetPortrait._bakeTargetOptPortrait); if (bakeResult.NumUnlinkedExternalObject > 0) { EditorUtility.DisplayDialog(_editor.GetText(TEXT.BakeWarning_Title), _editor.GetTextFormat(TEXT.BakeWarning_Body, bakeResult.NumUnlinkedExternalObject), _editor.GetText(TEXT.Okay)); } _editor.Notification("[" + _targetPortrait.name + "] is Baked (Optimized)", false, false); //추가 3.29 : Bake 후에 Ambient를 체크하자 CheckAmbientAndCorrection(); } } else { //Vector2 curScroll = (_tab == TAB.Bake) ? _scroll_Bake : _scroll_Options; _scroll_Options = EditorGUILayout.BeginScrollView(_scroll_Options, false, true, GUILayout.Width(width), GUILayout.Height(height - 30)); EditorGUILayout.BeginVertical(GUILayout.Width(width - 24)); GUILayout.Space(5); width -= 24; // 2. Option에 대한 UI //1. Gamma Space Space bool prevBakeGamma = _editor._isBakeColorSpaceToGamma; int iPrevColorSpace = prevBakeGamma ? 0 : 1; int iNextColorSpace = EditorGUILayout.Popup(_editor.GetUIWord(UIWORD.ColorSpace), iPrevColorSpace, _colorSpaceNames); if (iNextColorSpace != iPrevColorSpace) { apEditorUtil.SetRecord_Portrait(apUndoGroupData.ACTION.Portrait_SettingChanged, _editor, _targetPortrait, null, false); if (iNextColorSpace == 0) { //Gamma _editor._isBakeColorSpaceToGamma = true; } else { //Linear _editor._isBakeColorSpaceToGamma = false; } } GUILayout.Space(10); //2. Sorting Layer int prevSortingLayerID = _editor._portrait._sortingLayerID; int prevSortingOrder = _editor._portrait._sortingOrder; apPortrait.SORTING_ORDER_OPTION prevSortingLayerOption = _editor._portrait._sortingOrderOption; int layerIndex = -1; for (int i = 0; i < SortingLayer.layers.Length; i++) { if (SortingLayer.layers[i].id == _editor._portrait._sortingLayerID) { //찾았다. layerIndex = i; break; } } if (layerIndex < 0) { apEditorUtil.SetRecord_Portrait(apUndoGroupData.ACTION.Portrait_SettingChanged, _editor, _targetPortrait, null, false); //어라 레이어가 없는데용.. //초기화해야겠다. _editor._portrait._sortingLayerID = -1; if (SortingLayer.layers.Length > 0) { _editor._portrait._sortingLayerID = SortingLayer.layers[0].id; layerIndex = 0; } } int nextIndex = EditorGUILayout.Popup(_editor.GetText(TEXT.SortingLayer), layerIndex, _sortingLayerNames); //"Sorting Layer" if (nextIndex != layerIndex) { apEditorUtil.SetRecord_Portrait(apUndoGroupData.ACTION.Portrait_SettingChanged, _editor, _targetPortrait, null, false); //레이어가 변경되었다. if (nextIndex >= 0 && nextIndex < SortingLayer.layers.Length) { //LayerID 변경 _editor._portrait._sortingLayerID = SortingLayer.layers[nextIndex].id; } } //추가 19.8.18 : Sorting Order를 지정하는 방식을 3가지 + 미적용 1가지로 더 세분화 apPortrait.SORTING_ORDER_OPTION nextSortingLayerOption = (apPortrait.SORTING_ORDER_OPTION)EditorGUILayout.EnumPopup(_editor.GetText(TEXT.SortingOrderOption), _editor._portrait._sortingOrderOption); if (nextSortingLayerOption != _editor._portrait._sortingOrderOption) { apEditorUtil.SetRecord_Portrait(apUndoGroupData.ACTION.Portrait_SettingChanged, _editor, _targetPortrait, null, false); _editor._portrait._sortingOrderOption = nextSortingLayerOption; } if (_editor._portrait._sortingOrderOption == apPortrait.SORTING_ORDER_OPTION.SetOrder) { //Set Order인 경우에만 한정 int nextOrder = EditorGUILayout.IntField(_editor.GetText(TEXT.SortingOrder), _editor._portrait._sortingOrder); //"Sorting Order" if (nextOrder != _editor._portrait._sortingOrder) { apEditorUtil.SetRecord_Portrait(apUndoGroupData.ACTION.Portrait_SettingChanged, _editor, _targetPortrait, null, false); _editor._portrait._sortingOrder = nextOrder; } } GUILayout.Space(10); //3. 메카님 사용 여부 //EditorGUILayout.LabelField("Animation Settings"); bool prevIsUsingMecanim = _targetPortrait._isUsingMecanim; string prevMecanimPath = _targetPortrait._mecanimAnimClipResourcePath; _targetPortrait._isUsingMecanim = EditorGUILayout.Toggle(_editor.GetText(TEXT.IsMecanimAnimation), _targetPortrait._isUsingMecanim); //"Is Mecanim Animation" EditorGUILayout.LabelField(_editor.GetText(TEXT.AnimationClipExportPath)); //"Animation Clip Export Path" GUIStyle guiStyle_ChangeBtn = new GUIStyle(GUI.skin.button); guiStyle_ChangeBtn.margin = GUI.skin.textField.margin; guiStyle_ChangeBtn.border = GUI.skin.textField.border; EditorGUILayout.BeginHorizontal(GUILayout.Width(width), GUILayout.Height(20)); GUILayout.Space(5); EditorGUILayout.TextField(_targetPortrait._mecanimAnimClipResourcePath, GUILayout.Width(width - (70 + 15))); if (GUILayout.Button(_editor.GetText(TEXT.DLG_Change), guiStyle_ChangeBtn, GUILayout.Width(70), GUILayout.Height(18))) { string nextPath = EditorUtility.SaveFolderPanel("Select to export animation clips", "", ""); if (!string.IsNullOrEmpty(nextPath)) { if (apEditorUtil.IsInAssetsFolder(nextPath)) { //유효한 폴더인 경우 //중요 : 경로가 절대 경로로 찍힌다. //상대 경로로 바꾸자 apEditorUtil.PATH_INFO_TYPE pathInfoType = apEditorUtil.GetPathInfo(nextPath); if (pathInfoType == apEditorUtil.PATH_INFO_TYPE.Absolute_InAssetFolder) { //절대 경로 + Asset 폴더 안쪽이라면 //Debug.LogError("절대 경로가 리턴 되었다. : " + nextPath); nextPath = apEditorUtil.AbsolutePath2RelativePath(nextPath); //Debug.LogError(">> 상대 경로로 변경 : " + nextPath); } apEditorUtil.SetRecord_Portrait(apUndoGroupData.ACTION.Portrait_BakeOptionChanged, _editor, _targetPortrait, _targetPortrait, false); _targetPortrait._mecanimAnimClipResourcePath = nextPath; } else { //유효한 폴더가 아닌 경우 //EditorUtility.DisplayDialog("Invalid Folder Path", "Invalid Clip Path", "Close"); EditorUtility.DisplayDialog( _editor.GetText(TEXT.DLG_AnimClipSavePathValidationError_Title), _editor.GetText(TEXT.DLG_AnimClipSavePathResetError_Body), _editor.GetText(TEXT.Close)); } } GUI.FocusControl(null); } EditorGUILayout.EndHorizontal(); GUILayout.Space(10); if (_guiContent_Setting_IsImportant == null) { _guiContent_Setting_IsImportant = apGUIContentWrapper.Make(_editor.GetText(TEXT.DLG_Setting_IsImportant), false, "When this setting is on, it always updates and the physics effect works."); } if (_guiContent_Setting_FPS == null) { _guiContent_Setting_FPS = apGUIContentWrapper.Make(_editor.GetText(TEXT.DLG_Setting_FPS), false, "This setting is used when <Important> is off"); } //4. Important //"Is Important" bool nextImportant = EditorGUILayout.Toggle(_guiContent_Setting_IsImportant.Content, _targetPortrait._isImportant); if (nextImportant != _targetPortrait._isImportant) { apEditorUtil.SetRecord_Portrait(apUndoGroupData.ACTION.Portrait_SettingChanged, _editor, _targetPortrait, null, false); _targetPortrait._isImportant = nextImportant; } //"FPS (Important Off)" int nextFPS = EditorGUILayout.DelayedIntField(_guiContent_Setting_FPS.Content, _targetPortrait._FPS); if (_targetPortrait._FPS != nextFPS) { apEditorUtil.SetRecord_Portrait(apUndoGroupData.ACTION.Portrait_SettingChanged, _editor, _targetPortrait, null, false); if (nextFPS < 10) { nextFPS = 10; } _targetPortrait._FPS = nextFPS; } GUILayout.Space(10); //5. Billboard + Perspective apPortrait.BILLBOARD_TYPE nextBillboardType = (apPortrait.BILLBOARD_TYPE)EditorGUILayout.Popup(_editor.GetText(TEXT.DLG_Billboard), (int)_targetPortrait._billboardType, _billboardTypeNames); if (nextBillboardType != _targetPortrait._billboardType) { apEditorUtil.SetRecord_Portrait(apUndoGroupData.ACTION.Portrait_SettingChanged, _editor, _targetPortrait, null, false); _targetPortrait._billboardType = nextBillboardType; } //추가 19.9.24 : Billboard인 경우 카메라의 SortMode를 OrthoGraphic으로 강제할지 여부 if (_targetPortrait._billboardType != apPortrait.BILLBOARD_TYPE.None) { GUILayout.Space(2); EditorGUILayout.BeginHorizontal(GUILayout.Width(width)); int width_Value = 30; int width_Label = width - (width_Value + 10); GUIStyle guiStyle_LabelWrapText = new GUIStyle(GUI.skin.label); guiStyle_LabelWrapText.wordWrap = true; GUILayout.Space(5); EditorGUILayout.LabelField(_editor.GetText(TEXT.SetSortMode2Orthographic), guiStyle_LabelWrapText, GUILayout.Width(width_Label)); bool nextForceSortModeToOrtho = EditorGUILayout.Toggle(_targetPortrait._isForceCamSortModeToOrthographic, GUILayout.Width(width_Value), GUILayout.Height(20)); if (nextForceSortModeToOrtho != _targetPortrait._isForceCamSortModeToOrthographic) { apEditorUtil.SetRecord_Portrait(apUndoGroupData.ACTION.Portrait_SettingChanged, _editor, _targetPortrait, null, false); _targetPortrait._isForceCamSortModeToOrthographic = nextForceSortModeToOrtho; } EditorGUILayout.EndHorizontal(); } GUILayout.Space(10); //6. Shadow apPortrait.SHADOW_CASTING_MODE nextChastShadows = (apPortrait.SHADOW_CASTING_MODE)EditorGUILayout.EnumPopup(_editor.GetUIWord(UIWORD.CastShadows), _targetPortrait._meshShadowCastingMode); bool nextReceiveShaodw = EditorGUILayout.Toggle(_editor.GetUIWord(UIWORD.ReceiveShadows), _targetPortrait._meshReceiveShadow); if (nextChastShadows != _targetPortrait._meshShadowCastingMode || nextReceiveShaodw != _targetPortrait._meshReceiveShadow) { apEditorUtil.SetRecord_Portrait(apUndoGroupData.ACTION.Portrait_SettingChanged, _editor, _targetPortrait, null, false); _targetPortrait._meshShadowCastingMode = nextChastShadows; _targetPortrait._meshReceiveShadow = nextReceiveShaodw; } GUILayout.Space(10); //#if UNITY_2018_1_OR_NEWER //변경 19.6.22 : LWRP 기능은 삭제 //Material Library를 열도록 하자 //>> 다시 변경 19.8.5 : Clipped Mesh 땜시 다시 열자 //7. LWRP //LWRP 쉐이더를 쓸지 여부와 다시 강제로 생성하기 버튼을 만들자. : 이건 2019부터 적용 (그 전에는 SRP용 처리가 안된다.) #if UNITY_2019_1_OR_NEWER bool prevUseLWRP = _editor._isUseSRP; int iPrevUseLWRP = prevUseLWRP ? 1 : 0; int iNextUseLWRP = EditorGUILayout.Popup(_editor.GetText(TEXT.RenderPipeline), iPrevUseLWRP, _renderPipelineNames); //"Render Pipeline" if (iNextUseLWRP != iPrevUseLWRP) { apEditorUtil.SetRecord_Portrait(apUndoGroupData.ACTION.Portrait_SettingChanged, _editor, _targetPortrait, null, false); if (iNextUseLWRP == 0) { //사용 안함 _editor._isUseSRP = false; } else { //LWRP 사용함 _editor._isUseSRP = true; } } GUILayout.Space(10); #endif //if(GUILayout.Button("Generate Lightweight Shaders")) //{ // apShaderGenerator shaderGenerator = new apShaderGenerator(); // shaderGenerator.GenerateLWRPShaders(); //} //GUILayout.Space(10); //#endif //8. VR Supported 19.9.24 추가 //VR Supported int iNextVRSupported = EditorGUILayout.Popup(_editor.GetText(TEXT.VROption), (int)_targetPortrait._vrSupportMode, _vrSupportModeLabel); if (iNextVRSupported != (int)_targetPortrait._vrSupportMode) { apEditorUtil.SetRecord_Portrait(apUndoGroupData.ACTION.Portrait_SettingChanged, _editor, _targetPortrait, null, false); _targetPortrait._vrSupportMode = (apPortrait.VR_SUPPORT_MODE)iNextVRSupported; } if (_targetPortrait._vrSupportMode == apPortrait.VR_SUPPORT_MODE.SingleCamera) { //Single Camera인 경우, Clipping Mask의 크기를 결정해야한다. int iNextVRRTSize = EditorGUILayout.Popup(_editor.GetUIWord(UIWORD.MaskTextureSize), (int)_targetPortrait._vrRenderTextureSize, _vrRTSizeLabel); if (iNextVRRTSize != (int)_targetPortrait._vrRenderTextureSize) { apEditorUtil.SetRecord_Portrait(apUndoGroupData.ACTION.Portrait_SettingChanged, _editor, _targetPortrait, null, false); _targetPortrait._vrRenderTextureSize = (apPortrait.VR_RT_SIZE)iNextVRRTSize; } } GUILayout.Space(10); //11.7 추가 : Ambient Light를 검은색으로 만든다. if (GUILayout.Button(_editor.GetText(TEXT.DLG_AmbientToBlack), GUILayout.Height(20))) { MakeAmbientLightToBlack(); } //CheckChangedProperties(nextRootScale, nextZScale); if (prevSortingLayerID != _editor._portrait._sortingLayerID || prevSortingOrder != _editor._portrait._sortingOrder || prevSortingLayerOption != _editor._portrait._sortingOrderOption || prevIsUsingMecanim != _targetPortrait._isUsingMecanim || !string.Equals(prevMecanimPath, _targetPortrait._mecanimAnimClipResourcePath) || prevBakeGamma != _editor._isBakeColorSpaceToGamma #if UNITY_2019_1_OR_NEWER || prevUseLWRP != _editor._isUseSRP #endif ) { apEditorUtil.SetEditorDirty(); _editor.SaveEditorPref(); } GUILayout.Space(height + 500); EditorGUILayout.EndVertical(); EditorGUILayout.EndScrollView(); } GUILayout.Space(5); }
// GUI //------------------------------------------------------------------------------------------------ private void OnGUI() { int width = (int)position.width; int height = (int)position.height; width -= 10; //만약 이 다이얼로그가 켜진 상태로 뭔가 바뀌었다면 종료 bool isClose = false; bool isMoveAnimKeyframe = false; bool isMoveAnimKeyframeToNext = false; if (_editor == null || _meshGroup == null || _modifier == null || _modMesh == null || _renderUnit == null) { //데이터가 없다. isClose = true; } else if (_editor.Select.SelectionType != _selectionType) { //선택 타입이 바뀌었다. isClose = true; } else { if (!_isAnimEdit) { //1. 일반 모디파이어 편집시 //- 현재 선택된 MeshGroup이 바뀌었다면 //- 현재 선택된 Modifier가 바뀌었다면 //- Modifier 메뉴가 아니라면 //- ExEditingMode가 꺼졌다면 //> 해제 if (_editor.Select.ExEditingMode == apSelection.EX_EDIT.None || _editor.Select.MeshGroup != _meshGroup || _editor.Select.Modifier != _modifier || _editor._meshGroupEditMode != apEditor.MESHGROUP_EDIT_MODE.Modifier) { isClose = true; } } else { //2. 애니메이션 편집 시 //- 현재 선택된 AnimationClip이 바뀌었다면 //- 현재 선택된 MeshGroup이 바뀌었다면 (AnimClip이 있을 때) //- AnimExEditingMode가 꺼졌다면 //- 재생 중이라면 //> 해제 if (_editor.Select.ExAnimEditingMode == apSelection.EX_EDIT.None || _editor.Select.AnimClip != _animClip || _animClip == null || _keyframe == null || _editor.Select.AnimClip._targetMeshGroup != _meshGroup || _editor.Select.IsAnimPlaying) { isClose = true; } } } if (isClose) { CloseDialog(); return; } //------------------------------------------------------------ //1. 선택된 객체 정보 //- RenderUnit 아이콘과 이름 //2. <애니메이션인 경우> //- 현재 키프레임과 키프레임 이동하기 //3. 가중치 //- [일반] Weight CutOut //- [Anim] Prev / Next CutOut // (구분선) //4. Depth //- 아이콘과 Chainging Depth 레이블 //- On / Off 버튼 //- Depth 증감과 리스트 (좌우에 배치) //5. Texture (RenderUnit이 MeshTransform인 경우) //- 현재 텍스쳐 //- 바뀔 텍스쳐 //- 텍스쳐 선택하기 버튼 //1. 선택된 객체 정보 //- RenderUnit 아이콘과 이름 //int iconSize = 25; GUIStyle guiStyle_TargetBox = new GUIStyle(GUI.skin.box); guiStyle_TargetBox.alignment = TextAnchor.MiddleCenter; Color prevColor = GUI.backgroundColor; // RenderUnit 이름 Texture2D iconRenderUnit = null; if (_renderUnit._meshTransform != null) { iconRenderUnit = _editor.ImageSet.Get(apImageSet.PRESET.Hierarchy_Mesh); } else { iconRenderUnit = _editor.ImageSet.Get(apImageSet.PRESET.Hierarchy_MeshGroup); } GUI.backgroundColor = new Color(0.5f, 1.0f, 1.0f, 1.0f); GUILayout.Box(new GUIContent(" " + _renderUnit.Name, iconRenderUnit), guiStyle_TargetBox, GUILayout.Width(width), GUILayout.Height(30)); GUI.backgroundColor = prevColor; GUILayout.Space(5); //"Extra Property ON", "Extra Property OFF" if (apEditorUtil.ToggledButton_2Side(_editor.GetText(TEXT.ExtraOpt_ExtraPropertyOn), _editor.GetText(TEXT.ExtraOpt_ExtraPropertyOff), _modMesh._isExtraValueEnabled, true, width, 25)) { apEditorUtil.SetRecord_Modifier(apUndoGroupData.ACTION.Modifier_SettingChanged, _editor, _modifier, _modMesh._extraValue, false); _modMesh._isExtraValueEnabled = !_modMesh._isExtraValueEnabled; _meshGroup.RefreshModifierLink(); //<<옵션의 형태가 바뀌면 Modifier의 Link를 다시 해야한다. apEditorUtil.ReleaseGUIFocus(); } GUILayout.Space(5); if (_isAnimEdit) { GUILayout.Space(10); //2. <애니메이션인 경우> //- 현재 키프레임과 키프레임 이동하기 //"Target Frame" EditorGUILayout.LabelField(_editor.GetText(TEXT.ExtraOpt_TargetFrame)); int frameBtnSize = 20; int frameCurBtnWidth = 100; int frameMoveBtnWidth = (width - (10 + frameCurBtnWidth)) / 2; EditorGUILayout.BeginHorizontal(GUILayout.Width(width), GUILayout.Height(frameBtnSize)); GUILayout.Space(5); if (GUILayout.Button(_editor.ImageSet.Get(apImageSet.PRESET.Anim_MoveToPrevFrame), GUILayout.Width(frameMoveBtnWidth), GUILayout.Height(frameBtnSize))) { //이전 프레임으로 이동하기 isMoveAnimKeyframe = true; isMoveAnimKeyframeToNext = false; } if (GUILayout.Button(_keyframe._frameIndex.ToString(), GUILayout.Width(frameCurBtnWidth), GUILayout.Height(frameBtnSize))) { _animClip.SetFrame_Editor(_keyframe._frameIndex); _editor.SetRepaint(); } if (GUILayout.Button(_editor.ImageSet.Get(apImageSet.PRESET.Anim_MoveToNextFrame), GUILayout.Width(frameMoveBtnWidth), GUILayout.Height(frameBtnSize))) { //다음 프레임으로 이동하기 isMoveAnimKeyframe = true; isMoveAnimKeyframeToNext = true; } EditorGUILayout.EndHorizontal(); } GUILayout.Space(10); //3. 가중치 //- [일반] Weight CutOut //- [Anim] Prev / Next CutOut EditorGUILayout.LabelField(_editor.GetText(TEXT.ExtraOpt_WeightSettings)); //"Weight Settings" GUILayout.Space(5); if (!_isAnimEdit) { //일반이면 CutOut이 1개 float cutOut = EditorGUILayout.DelayedFloatField(_editor.GetText(TEXT.ExtraOpt_Offset), _modMesh._extraValue._weightCutout); //"Offset (0~1)" if (cutOut != _modMesh._extraValue._weightCutout) { cutOut = Mathf.Clamp01(cutOut); apEditorUtil.SetRecord_Modifier(apUndoGroupData.ACTION.Modifier_SettingChanged, _editor, _modifier, _modMesh._extraValue, false); _modMesh._extraValue._weightCutout = cutOut; apEditorUtil.ReleaseGUIFocus(); } } else { //애니메이션이면 CutOut이 2개 EditorGUILayout.LabelField(_editor.GetText(TEXT.ExtraOpt_Offset)); float animPrevCutOut = EditorGUILayout.DelayedFloatField(_editor.GetText(TEXT.ExtraOpt_OffsetPrevKeyframe), _modMesh._extraValue._weightCutout_AnimPrev); //"Prev Keyframe" float animNextCutOut = EditorGUILayout.DelayedFloatField(_editor.GetText(TEXT.ExtraOpt_OffsetNextKeyframe), _modMesh._extraValue._weightCutout_AnimNext); //"Next Keyframe" if (animPrevCutOut != _modMesh._extraValue._weightCutout_AnimPrev || animNextCutOut != _modMesh._extraValue._weightCutout_AnimNext ) { animPrevCutOut = Mathf.Clamp01(animPrevCutOut); animNextCutOut = Mathf.Clamp01(animNextCutOut); apEditorUtil.SetRecord_Modifier(apUndoGroupData.ACTION.Modifier_SettingChanged, _editor, _modifier, _modMesh._extraValue, false); _modMesh._extraValue._weightCutout_AnimPrev = animPrevCutOut; _modMesh._extraValue._weightCutout_AnimNext = animNextCutOut; apEditorUtil.ReleaseGUIFocus(); } } GUILayout.Space(10); apEditorUtil.GUI_DelimeterBoxH(width); GUILayout.Space(10); int tabBtnWidth = ((width - 10) / 2); int tabBtnHeight = 25; EditorGUILayout.BeginHorizontal(GUILayout.Width(width), GUILayout.Height(tabBtnHeight)); GUILayout.Space(5); if (apEditorUtil.ToggledButton(_editor.GetText(TEXT.ExtraOpt_Tab_Depth), _tab == TAB.Depth, tabBtnWidth, tabBtnHeight)) //"Depth" { _tab = TAB.Depth; } if (apEditorUtil.ToggledButton(_editor.GetText(TEXT.ExtraOpt_Tab_Image), _tab == TAB.Image, tabBtnWidth, tabBtnHeight)) //"Image" { _tab = TAB.Image; } EditorGUILayout.EndHorizontal(); GUILayout.Space(10); if (_tab == TAB.Depth) { //4. Depth //- 아이콘과 Chainging Depth 레이블 //- On / Off 버튼 //- Depth 증감과 리스트 (좌우에 배치) EditorGUILayout.LabelField(_editor.GetText(TEXT.ExtraOpt_ChangingDepth)); //"Changing Depth" GUILayout.Space(5); //"Depth Option ON", "Depth Option OFF" if (apEditorUtil.ToggledButton_2Side(_editor.GetText(TEXT.ExtraOpt_DepthOptOn), _editor.GetText(TEXT.ExtraOpt_DepthOptOff), _modMesh._extraValue._isDepthChanged, _modMesh._isExtraValueEnabled, width, 25)) { apEditorUtil.SetRecord_Modifier(apUndoGroupData.ACTION.Modifier_SettingChanged, _editor, _modifier, _modMesh._extraValue, false); _modMesh._extraValue._isDepthChanged = !_modMesh._extraValue._isDepthChanged; _meshGroup.RefreshModifierLink(); //<<Modifier Link를 다시 해야한다. _editor.SetRepaint(); } GUILayout.Space(5); bool isDepthAvailable = _modMesh._extraValue._isDepthChanged && _modMesh._isExtraValueEnabled; int depthListWidth_Left = 80; int depthListWidth_Right = width - (10 + depthListWidth_Left); int depthListWidth_RightInner = depthListWidth_Right - 20; int depthListHeight = 276; //int depthListHeight_LeftBtn = (depthListHeight - 40) / 2; int depthListHeight_LeftBtn = 40; int depthListHeight_LeftSpace = (depthListHeight - (40 + depthListHeight_LeftBtn * 2)) / 2; int depthListHeight_RightList = 20; //리스트 배경 Rect lastRect = GUILayoutUtility.GetLastRect(); if (!isDepthAvailable) { GUI.backgroundColor = new Color(1.0f, 0.6f, 0.6f, 1.0f); } GUI.Box(new Rect(5 + depthListWidth_Left + 8, lastRect.y + 8, depthListWidth_Right, depthListHeight), ""); if (!isDepthAvailable) { GUI.backgroundColor = prevColor; } EditorGUILayout.BeginHorizontal(GUILayout.Width(width), GUILayout.Height(depthListHeight)); GUILayout.Space(5); EditorGUILayout.BeginVertical(GUILayout.Width(depthListWidth_Left), GUILayout.Height(depthListHeight)); // Depth List의 왼쪽 // Depth 증감 버튼과 값 GUILayout.Space(depthListHeight_LeftSpace); Texture2D img_AddWeight = _editor.ImageSet.Get(apImageSet.PRESET.Rig_AddWeight); Texture2D img_SubtractWeight = _editor.ImageSet.Get(apImageSet.PRESET.Rig_SubtractWeight); //if (GUILayout.Button(, GUILayout.Width(depthListWidth_Left), GUILayout.Height(depthListHeight_LeftBtn))) if (apEditorUtil.ToggledButton(img_AddWeight, false, isDepthAvailable, depthListWidth_Left, depthListHeight_LeftBtn)) { //Depth 증가 apEditorUtil.SetRecord_Modifier(apUndoGroupData.ACTION.Modifier_SettingChanged, _editor, _modifier, _modMesh._extraValue, false); _modMesh._extraValue._deltaDepth++; _editor.SetRepaint(); apEditorUtil.ReleaseGUIFocus(); } //"Delta Depth" EditorGUILayout.LabelField(_editor.GetText(TEXT.ExtraOpt_DeltaDepth), GUILayout.Width(depthListWidth_Left)); int deltaDepth = EditorGUILayout.DelayedIntField(_modMesh._extraValue._deltaDepth, GUILayout.Width(depthListWidth_Left)); if (deltaDepth != _modMesh._extraValue._deltaDepth) { if (isDepthAvailable) { apEditorUtil.SetRecord_Modifier(apUndoGroupData.ACTION.Modifier_SettingChanged, _editor, _modifier, _modMesh._extraValue, false); _modMesh._extraValue._deltaDepth = deltaDepth; _editor.SetRepaint(); apEditorUtil.ReleaseGUIFocus(); } } //if (GUILayout.Button(_editor.ImageSet.Get(apImageSet.PRESET.Rig_SubtractWeight), GUILayout.Width(depthListWidth_Left), GUILayout.Height(depthListHeight_LeftBtn))) if (apEditorUtil.ToggledButton(img_SubtractWeight, false, isDepthAvailable, depthListWidth_Left, depthListHeight_LeftBtn)) { //Depth 감소 apEditorUtil.SetRecord_Modifier(apUndoGroupData.ACTION.Modifier_SettingChanged, _editor, _modifier, _modMesh._extraValue, false); _modMesh._extraValue._deltaDepth--; _editor.SetRepaint(); apEditorUtil.ReleaseGUIFocus(); } EditorGUILayout.EndVertical(); EditorGUILayout.BeginVertical(GUILayout.Width(depthListWidth_Right), GUILayout.Height(depthListHeight)); // RenderUnit 리스트와 변환될 Depth 위치 _scrollList = EditorGUILayout.BeginScrollView(_scrollList, false, true, GUILayout.Width(depthListWidth_Right), GUILayout.Height(depthListHeight)); EditorGUILayout.BeginVertical(GUILayout.Width(depthListWidth_RightInner), GUILayout.Height(depthListHeight)); GUILayout.Space(5); SubUnit curSubUnit = null; //int cursorDepth = _renderUnit.GetDepth() + _modMesh._extraValue._deltaDepth; int cursorDepth = _targetDepth + _modMesh._extraValue._deltaDepth; //GUI Content 생성 [11.16 수정] if (_guiContent_DepthMidCursor == null) { _guiContent_DepthMidCursor = apGUIContentWrapper.Make(_img_DepthMidCursor); } if (_guiContent_DepthCursor == null) { _guiContent_DepthCursor = apGUIContentWrapper.Make(_img_DepthCursor); } if (_guiContent_MeshIcon == null) { _guiContent_MeshIcon = apGUIContentWrapper.Make(_img_MeshTF); } if (_guiContent_MeshGroupIcon == null) { _guiContent_MeshGroupIcon = apGUIContentWrapper.Make(_img_MeshGroupTF); } //이전 코드 //GUIContent guiContent_DepthMidCursor = new GUIContent(_img_DepthMidCursor); //GUIContent guiContent_DepthCursor = new GUIContent(_img_DepthCursor); //GUIContent guiContent_MeshIcon = new GUIContent(_img_MeshTF); //GUIContent guiContent_MeshGroupIcon = new GUIContent(_img_MeshGroupTF); int depthCursorSize = depthListHeight_RightList; for (int i = 0; i < _subUnits_All.Count; i++) { curSubUnit = _subUnits_All[i]; if (curSubUnit._isTarget) { //타겟이면 배경색을 그려주자 lastRect = GUILayoutUtility.GetLastRect(); if (EditorGUIUtility.isProSkin) { GUI.backgroundColor = new Color(0.0f, 1.0f, 1.0f, 1.0f); } else { GUI.backgroundColor = new Color(0.4f, 0.8f, 1.0f, 1.0f); } int yOffset = 6; if (i == 0) { yOffset = 7 - depthListHeight_RightList; } GUI.Box(new Rect(lastRect.x, lastRect.y + depthListHeight_RightList + yOffset, depthListWidth_RightInner + 10, depthListHeight_RightList), ""); GUI.backgroundColor = prevColor; } EditorGUILayout.BeginHorizontal(GUILayout.Width(depthListWidth_RightInner), GUILayout.Height(depthListHeight_RightList)); //TODO : Depth 커서 그려주기 //GUILayout.Space(20); DEPTH_CURSOR_TYPE depthCursorType = DEPTH_CURSOR_TYPE.None; if (!curSubUnit._isTarget) { if (cursorDepth != _targetDepth) { if (cursorDepth == curSubUnit._depth) { depthCursorType = DEPTH_CURSOR_TYPE.Target; } else { if (cursorDepth > _targetDepth) { //Depth가 증가했을 때 if (_targetDepth < curSubUnit._depth && curSubUnit._depth < cursorDepth) { depthCursorType = DEPTH_CURSOR_TYPE.Mid; } } else { //Depth가 감소했을 때 if (cursorDepth < curSubUnit._depth && curSubUnit._depth < _targetDepth) { depthCursorType = DEPTH_CURSOR_TYPE.Mid; } } } } } else { if (cursorDepth != _targetDepth) { depthCursorType = DEPTH_CURSOR_TYPE.Mid; } else { depthCursorType = DEPTH_CURSOR_TYPE.Target; } } GUILayout.Space(5); switch (depthCursorType) { case DEPTH_CURSOR_TYPE.None: GUILayout.Space(depthCursorSize + 4); break; case DEPTH_CURSOR_TYPE.Mid: EditorGUILayout.LabelField(_guiContent_DepthMidCursor.Content, GUILayout.Width(depthCursorSize), GUILayout.Height(depthCursorSize)); break; case DEPTH_CURSOR_TYPE.Target: EditorGUILayout.LabelField(_guiContent_DepthCursor.Content, GUILayout.Width(depthCursorSize), GUILayout.Height(depthCursorSize)); break; } EditorGUILayout.LabelField(curSubUnit._isMeshTransform ? _guiContent_MeshIcon.Content : _guiContent_MeshGroupIcon.Content, GUILayout.Width(depthCursorSize), GUILayout.Height(depthCursorSize)); EditorGUILayout.LabelField(curSubUnit._depth.ToString(), GUILayout.Width(20), GUILayout.Height(depthListHeight_RightList)); EditorGUILayout.LabelField(curSubUnit._name, GUILayout.Width(depthListWidth_RightInner - (24 + 5 + depthCursorSize + depthCursorSize + 20 + 8)), GUILayout.Height(depthListHeight_RightList) ); EditorGUILayout.EndHorizontal(); } GUILayout.Space(depthListHeight + 100); EditorGUILayout.EndVertical(); EditorGUILayout.EndScrollView(); EditorGUILayout.EndVertical(); EditorGUILayout.EndHorizontal(); } else { //5. Texture (RenderUnit이 MeshTransform인 경우) //- 현재 텍스쳐 //- 바뀔 텍스쳐 //- 텍스쳐 선택하기 버튼 //"Changing Image" EditorGUILayout.LabelField(_editor.GetText(TEXT.ExtraOpt_ChangingImage)); GUILayout.Space(5); //"Image Option ON", "Image Option OFF" if (apEditorUtil.ToggledButton_2Side(_editor.GetText(TEXT.ExtraOpt_ImageOptOn), _editor.GetText(TEXT.ExtraOpt_ImageOptOff), _modMesh._extraValue._isTextureChanged, _isImageChangable && _modMesh._isExtraValueEnabled, width, 25)) { apEditorUtil.SetRecord_Modifier(apUndoGroupData.ACTION.Modifier_SettingChanged, _editor, _modifier, _modMesh._extraValue, false); _modMesh._extraValue._isTextureChanged = !_modMesh._extraValue._isTextureChanged; _meshGroup.RefreshModifierLink(); //<<Modifier Link를 다시 해야한다. _editor.SetRepaint(); } GUILayout.Space(5); bool isTextureAvailable = _modMesh._extraValue._isTextureChanged && _isImageChangable && _modMesh._isExtraValueEnabled; int imageSlotSize = 170; int imageSlotSpaceSize = width - (imageSlotSize * 2 + 6 + 10); int imageSlotHeight = imageSlotSize + 50; Texture2D img_Src = null; Texture2D img_Dst = null; string strSrcName = "< None >"; string strDstName = "< None >"; if (_srcTexureData != null && _srcTexureData._image != null) { img_Src = _srcTexureData._image; strSrcName = _srcTexureData._name; } if (_dstTexureData != null && _dstTexureData._image != null) { img_Dst = _dstTexureData._image; strDstName = _dstTexureData._name; } GUIStyle guiStyle_ImageSlot = new GUIStyle(GUI.skin.box); guiStyle_ImageSlot.alignment = TextAnchor.MiddleCenter; GUIStyle guiStyle_ImageName = new GUIStyle(GUI.skin.label); guiStyle_ImageName.alignment = TextAnchor.MiddleCenter; EditorGUILayout.BeginHorizontal(GUILayout.Width(width), GUILayout.Height(imageSlotHeight)); GUILayout.Space(5); //이미지 슬롯 1 : 원래 이미지 EditorGUILayout.BeginVertical(GUILayout.Width(imageSlotSize), GUILayout.Height(imageSlotHeight)); //"Original" EditorGUILayout.LabelField(_editor.GetText(TEXT.ExtraOpt_SlotOriginal), GUILayout.Width(imageSlotSize)); GUILayout.Box(img_Src, guiStyle_ImageSlot, GUILayout.Width(imageSlotSize), GUILayout.Height(imageSlotSize)); GUILayout.Space(5); EditorGUILayout.LabelField(strSrcName, guiStyle_ImageName, GUILayout.Width(imageSlotSize)); EditorGUILayout.EndVertical(); GUILayout.Space(imageSlotSpaceSize); //이미지 슬롯 1 : 원래 이미지 EditorGUILayout.BeginVertical(GUILayout.Width(imageSlotSize), GUILayout.Height(imageSlotHeight)); //"Changed" EditorGUILayout.LabelField(_editor.GetText(TEXT.ExtraOpt_SlotChanged), GUILayout.Width(imageSlotSize)); GUILayout.Box(img_Dst, guiStyle_ImageSlot, GUILayout.Width(imageSlotSize), GUILayout.Height(imageSlotSize)); GUILayout.Space(5); EditorGUILayout.LabelField(strDstName, guiStyle_ImageName, GUILayout.Width(imageSlotSize)); EditorGUILayout.EndVertical(); EditorGUILayout.EndHorizontal(); //"Set Image" if (apEditorUtil.ToggledButton(_editor.GetText(TEXT.ExtraOpt_SelectImage), false, isTextureAvailable, width, 30)) { //이미지 열기 열기 _loadKey_TextureSelect = apDialog_SelectTextureData.ShowDialog(_editor, null, OnTextureDataSelected); } //"Reset Image" if (GUILayout.Button(_editor.GetText(TEXT.ExtraOpt_ResetImage), GUILayout.Width(width), GUILayout.Height(20))) { apEditorUtil.SetRecord_Modifier(apUndoGroupData.ACTION.Modifier_SettingChanged, _editor, _modifier, _modMesh._extraValue, false); _modMesh._extraValue._textureDataID = -1; _modMesh._extraValue._linkedTextureData = null; RefreshImagePreview(); Repaint(); } } GUILayout.Space(10); apEditorUtil.GUI_DelimeterBoxH(width); GUILayout.Space(10); //"Close" if (GUILayout.Button(_editor.GetText(TEXT.Close), GUILayout.Height(30))) { isClose = true; } if (isClose) { CloseDialog(); } if (isMoveAnimKeyframe) { //키프레임 이동의 경우, //타임라인 레이어를 따라서 전,후로 이동한다. //이때 ModMesh가 아예 바뀌기 때문에 여기서 처리해야한다. if (_keyframe != null && _keyframe._parentTimelineLayer != null && _animClip != null) { apAnimKeyframe moveKeyframe = (isMoveAnimKeyframeToNext ? _keyframe._nextLinkedKeyframe : _keyframe._prevLinkedKeyframe); if (moveKeyframe != null && moveKeyframe._linkedModMesh_Editor != null) { _keyframe = moveKeyframe; _modMesh = _keyframe._linkedModMesh_Editor; _animClip.SetFrame_Editor(moveKeyframe._frameIndex); RefreshImagePreview(); apEditorUtil.ReleaseGUIFocus(); Repaint(); _editor.SetRepaint(); } } } }
// GUI //-------------------------------------------------------------------- void OnGUI() { int width = (int)position.width; int height = (int)position.height; if (_editor == null || _funcResult == null) { return; } Color prevColor = GUI.backgroundColor; GUI.backgroundColor = new Color(0.9f, 0.9f, 0.9f); GUI.Box(new Rect(0, 41, width, height - 90), ""); GUI.backgroundColor = prevColor; EditorGUILayout.BeginVertical(); //1. Tab GUILayout.Space(5); EditorGUILayout.BeginHorizontal(GUILayout.Width(width), GUILayout.Height(25)); string strCategory = ""; if (_target == TARGET.Mesh) { //strCategory = "Meshes"; strCategory = _editor.GetText(TEXT.DLG_Meshes); } else { //strCategory = "Mesh Groups"; strCategory = _editor.GetText(TEXT.DLG_MeshGroups); } if (apEditorUtil.ToggledButton(_editor.GetText(TEXT.DLG_Mesh), (_target == TARGET.Mesh), (width / 2) - 2, 25)) //"Mesh" { _target = TARGET.Mesh; } if (apEditorUtil.ToggledButton(_editor.GetText(TEXT.DLG_MeshGroup), (_target == TARGET.MeshGroup), (width / 2) - 2, 25)) //"MeshGroup" { _target = TARGET.MeshGroup; } EditorGUILayout.EndHorizontal(); GUILayout.Space(5); Texture2D iconImage_Mesh = _editor.ImageSet.Get(apImageSet.PRESET.Hierarchy_Mesh); Texture2D iconImage_MeshGroup = _editor.ImageSet.Get(apImageSet.PRESET.Hierarchy_MeshGroup); Texture2D iconImageCategory = _editor.ImageSet.Get(apImageSet.PRESET.Hierarchy_FoldDown); GUIStyle guiStyle_None = new GUIStyle(GUIStyle.none); guiStyle_None.normal.textColor = GUI.skin.label.normal.textColor; GUIStyle guiStyle_Selected = new GUIStyle(GUIStyle.none); if (EditorGUIUtility.isProSkin) { guiStyle_Selected.normal.textColor = Color.cyan; } else { guiStyle_Selected.normal.textColor = Color.white; } _scrollList = EditorGUILayout.BeginScrollView(_scrollList, GUILayout.Width(width), GUILayout.Height(height - 90)); GUILayout.Button(new GUIContent(strCategory, iconImageCategory), guiStyle_None, GUILayout.Height(20)); //<투명 버튼 if (_target == TARGET.Mesh) { for (int i = 0; i < _meshes.Count; i++) { GUIStyle curGUIStyle = guiStyle_None; apMesh mesh = _meshes[i]; if (mesh == _curSelectedMesh) { Rect lastRect = GUILayoutUtility.GetLastRect(); prevColor = GUI.backgroundColor; if (EditorGUIUtility.isProSkin) { GUI.backgroundColor = new Color(0.0f, 1.0f, 1.0f, 1.0f); } else { GUI.backgroundColor = new Color(0.4f, 0.8f, 1.0f, 1.0f); } GUI.Box(new Rect(lastRect.x, lastRect.y + 20, width, 20), ""); GUI.backgroundColor = prevColor; curGUIStyle = guiStyle_Selected; } EditorGUILayout.BeginHorizontal(GUILayout.Width(width - 50)); GUILayout.Space(15); if (GUILayout.Button(new GUIContent(" " + mesh._name, iconImage_Mesh), curGUIStyle, GUILayout.Width(width - 35), GUILayout.Height(20))) { _curSelectedMesh = mesh; } EditorGUILayout.EndHorizontal(); } } else { for (int i = 0; i < _meshGroups.Count; i++) { GUIStyle curGUIStyle = guiStyle_None; apMeshGroup meshGroup = _meshGroups[i]; if (meshGroup == _curSelectedMeshGroup) { Rect lastRect = GUILayoutUtility.GetLastRect(); prevColor = GUI.backgroundColor; if (EditorGUIUtility.isProSkin) { GUI.backgroundColor = new Color(0.0f, 1.0f, 1.0f, 1.0f); } else { GUI.backgroundColor = new Color(0.4f, 0.8f, 1.0f, 1.0f); } GUI.Box(new Rect(lastRect.x, lastRect.y + 20, width, 20), ""); GUI.backgroundColor = prevColor; curGUIStyle = guiStyle_Selected; } EditorGUILayout.BeginHorizontal(GUILayout.Width(width - 50)); GUILayout.Space(15); if (GUILayout.Button(new GUIContent(" " + meshGroup._name, iconImage_MeshGroup), curGUIStyle, GUILayout.Width(width - 35), GUILayout.Height(20))) { _curSelectedMeshGroup = meshGroup; } EditorGUILayout.EndHorizontal(); } } EditorGUILayout.EndScrollView(); EditorGUILayout.EndVertical(); GUILayout.Space(10); EditorGUILayout.BeginHorizontal(); bool isClose = false; if (GUILayout.Button(_editor.GetText(TEXT.DLG_Add), GUILayout.Height(30))) //"Add" { if (_target == TARGET.Mesh) { _funcResult(true, _loadKey, _curSelectedMesh, null); } else { _funcResult(true, _loadKey, null, _curSelectedMeshGroup); } isClose = true; } if (GUILayout.Button(_editor.GetText(TEXT.DLG_Close), GUILayout.Height(30))) //"Close" { _funcResult(false, _loadKey, null, null); isClose = true; } EditorGUILayout.EndHorizontal(); if (isClose) { CloseDialog(); } }
// GUI //------------------------------------------------------------------ void OnGUI() { int width = (int)position.width; int height = (int)position.height; if (_editor == null || _targetPortrait == null) { Debug.LogError("Exit - Editor / Portrait is Null"); CloseDialog(); return; } //만약 Portriat가 바뀌었거나 Editor가 리셋되면 닫자 + Overall Menu가 아니라면.. if (_editor != apEditor.CurrentEditor || _targetPortrait != apEditor.CurrentEditor._portrait || _editor.Select.SelectionType != apSelection.SELECTION_TYPE.Overall) { Debug.LogError("Exit - Editor / Portrait Missmatch"); CloseDialog(); return; } //여기서 체크 및 실행하자 //Request => Process => Process 처리 if (_exportProcessType == EXPORT_TYPE.None && _exportRequestType != EXPORT_TYPE.None) { _iProcess = 0; switch (_exportRequestType) { case EXPORT_TYPE.None: break; case EXPORT_TYPE.Thumbnail: _exportProcessType = EXPORT_TYPE.Thumbnail; break; case EXPORT_TYPE.PNG: _exportProcessType = EXPORT_TYPE.PNG; break; case EXPORT_TYPE.GIFAnimation: _exportProcessType = EXPORT_TYPE.GIFAnimation; break; } _exportRequestType = EXPORT_TYPE.None; } switch (_exportProcessType) { case EXPORT_TYPE.None: break; case EXPORT_TYPE.Thumbnail: Process_MakeThumbnail(); break; case EXPORT_TYPE.PNG: Process_PNGScreenShot(); break; case EXPORT_TYPE.GIFAnimation: Process_MakeGIF(); break; } _scroll = EditorGUILayout.BeginScrollView(_scroll, false, true, GUILayout.Width(width), GUILayout.Height(height)); width -= 24; EditorGUILayout.BeginVertical(GUILayout.Width(width)); int settingWidth = ((width - 10) / 3) - 4; int settingWidth_Label = 50; int settingWidth_Value = settingWidth - (50 + 8); int settingHeight = 70; EditorGUILayout.LabelField("Setting"); GUILayout.Space(5); EditorGUILayout.BeginHorizontal(GUILayout.Width(width), GUILayout.Height(settingHeight)); GUILayout.Space(5); //Position //------------------------ EditorGUILayout.BeginVertical(GUILayout.Width(settingWidth), GUILayout.Height(settingHeight)); EditorGUILayout.LabelField("Position", GUILayout.Width(settingWidth)); EditorGUILayout.BeginHorizontal(GUILayout.Width(settingWidth)); EditorGUILayout.LabelField("X", GUILayout.Width(settingWidth_Label)); int posX = EditorGUILayout.DelayedIntField(_editor._captureFrame_PosX, GUILayout.Width(settingWidth_Value)); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(GUILayout.Width(settingWidth)); EditorGUILayout.LabelField("Y", GUILayout.Width(settingWidth_Label)); int posY = EditorGUILayout.DelayedIntField(_editor._captureFrame_PosY, GUILayout.Width(settingWidth_Value)); EditorGUILayout.EndHorizontal(); EditorGUILayout.EndVertical(); //------------------------ //Capture Size //------------------------ EditorGUILayout.BeginVertical(GUILayout.Width(settingWidth), GUILayout.Height(settingHeight)); EditorGUILayout.LabelField("Capture Size", GUILayout.Width(settingWidth)); EditorGUILayout.BeginHorizontal(GUILayout.Width(settingWidth)); EditorGUILayout.LabelField("Width", GUILayout.Width(settingWidth_Label)); int srcSizeWidth = EditorGUILayout.DelayedIntField(_editor._captureFrame_SrcWidth, GUILayout.Width(settingWidth_Value)); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(GUILayout.Width(settingWidth)); EditorGUILayout.LabelField("Height", GUILayout.Width(settingWidth_Label)); int srcSizeHeight = EditorGUILayout.DelayedIntField(_editor._captureFrame_SrcHeight, GUILayout.Width(settingWidth_Value)); EditorGUILayout.EndHorizontal(); if (srcSizeWidth < 8) { srcSizeWidth = 8; } if (srcSizeHeight < 8) { srcSizeHeight = 8; } EditorGUILayout.EndVertical(); //------------------------ //File Size //------------------------------- EditorGUILayout.BeginVertical(GUILayout.Width(settingWidth), GUILayout.Height(settingHeight)); EditorGUILayout.LabelField("File Size", GUILayout.Width(settingWidth)); EditorGUILayout.BeginHorizontal(GUILayout.Width(settingWidth)); EditorGUILayout.LabelField("Width", GUILayout.Width(settingWidth_Label)); int dstSizeWidth = EditorGUILayout.DelayedIntField(_editor._captureFrame_DstWidth, GUILayout.Width(settingWidth_Value)); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(GUILayout.Width(settingWidth)); EditorGUILayout.LabelField("Height", GUILayout.Width(settingWidth_Label)); int dstSizeHeight = EditorGUILayout.DelayedIntField(_editor._captureFrame_DstHeight, GUILayout.Width(settingWidth_Value)); EditorGUILayout.EndHorizontal(); if (dstSizeWidth < 8) { dstSizeWidth = 8; } if (dstSizeHeight < 8) { dstSizeHeight = 8; } EditorGUILayout.EndVertical(); //------------------------------- EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(GUILayout.Width(width), GUILayout.Height(30)); GUILayout.Space(5); int setting2CompWidth = ((width - 10) / 2) - 8; //Color와 AspectRatio EditorGUILayout.LabelField("BG Color", GUILayout.Width(80)); Color prevCaptureColor = _editor._captureFrame_Color; try { _editor._captureFrame_Color = EditorGUILayout.ColorField(_editor._captureFrame_Color, GUILayout.Width(setting2CompWidth - 86)); } catch (Exception) { } GUILayout.Space(30); if (apEditorUtil.ToggledButton_2Side("Aspect Ratio Fixed", "Aspect Ratio Not Fixed", _editor._isCaptureAspectRatioFixed, true, setting2CompWidth - 20, 20)) { _editor._isCaptureAspectRatioFixed = !_editor._isCaptureAspectRatioFixed; if (_editor._isCaptureAspectRatioFixed) { //AspectRatio를 굳혔다. //Dst계열 변수를 Src에 맞춘다. //Height를 고정, Width를 맞춘다. _editor._captureFrame_DstWidth = GetAspectRatio_Width(_editor._captureFrame_DstHeight, _editor._captureFrame_SrcWidth, _editor._captureFrame_SrcHeight); dstSizeWidth = _editor._captureFrame_DstWidth; } _editor.SaveEditorPref(); apEditorUtil.ReleaseGUIFocus(); } EditorGUILayout.EndHorizontal(); //AspectRatio를 맞추어보자 if (_editor._isCaptureAspectRatioFixed) { if (srcSizeWidth != _editor._captureFrame_SrcWidth) { //Width가 바뀌었다. => Height를 맞추자 srcSizeHeight = GetAspectRatio_Height(srcSizeWidth, _editor._captureFrame_SrcWidth, _editor._captureFrame_SrcHeight); //>> Dst도 바꾸자 => Width dstSizeWidth = GetAspectRatio_Width(dstSizeHeight, _editor._captureFrame_SrcWidth, _editor._captureFrame_SrcHeight); } else if (srcSizeHeight != _editor._captureFrame_SrcHeight) { //Height가 바뀌었다. => Width를 맞추자 srcSizeWidth = GetAspectRatio_Width(srcSizeHeight, _editor._captureFrame_SrcWidth, _editor._captureFrame_SrcHeight); //>> Dst도 바꾸자 => Height dstSizeHeight = GetAspectRatio_Height(dstSizeWidth, _editor._captureFrame_SrcWidth, _editor._captureFrame_SrcHeight); } else if (dstSizeWidth != _editor._captureFrame_DstWidth) { //Width가 바뀌었다. => Height를 맞추자 dstSizeHeight = GetAspectRatio_Height(dstSizeWidth, _editor._captureFrame_DstWidth, _editor._captureFrame_DstHeight); //>> Src도 바꾸다 => Width srcSizeWidth = GetAspectRatio_Width(srcSizeHeight, _editor._captureFrame_DstWidth, _editor._captureFrame_DstHeight); } else if (dstSizeHeight != _editor._captureFrame_DstHeight) { //Height가 바뀌었다. => Width를 맞추자 dstSizeWidth = GetAspectRatio_Width(dstSizeHeight, _editor._captureFrame_DstWidth, _editor._captureFrame_DstHeight); //>> Dst도 바꾸자 => Height srcSizeHeight = GetAspectRatio_Height(srcSizeWidth, _editor._captureFrame_DstWidth, _editor._captureFrame_DstHeight); } } if (posX != _editor._captureFrame_PosX || posY != _editor._captureFrame_PosY || srcSizeWidth != _editor._captureFrame_SrcWidth || srcSizeHeight != _editor._captureFrame_SrcHeight || dstSizeWidth != _editor._captureFrame_DstWidth || dstSizeHeight != _editor._captureFrame_DstHeight ) { _editor._captureFrame_PosX = posX; _editor._captureFrame_PosY = posY; _editor._captureFrame_SrcWidth = srcSizeWidth; _editor._captureFrame_SrcHeight = srcSizeHeight; _editor._captureFrame_DstWidth = dstSizeWidth; _editor._captureFrame_DstHeight = dstSizeHeight; _editor.SaveEditorPref(); apEditorUtil.ReleaseGUIFocus(); } if (prevCaptureColor.r != _editor._captureFrame_Color.r || prevCaptureColor.g != _editor._captureFrame_Color.g || prevCaptureColor.b != _editor._captureFrame_Color.b) { _editor.SaveEditorPref(); //색상은 GUIFocus를 null로 만들면 안되기에.. } GUILayout.Space(10); apEditorUtil.GUI_DelimeterBoxH(width); GUILayout.Space(10); EditorGUILayout.LabelField("Thumbnail Capture"); GUILayout.Space(5); EditorGUILayout.LabelField("File Path"); EditorGUILayout.BeginHorizontal(GUILayout.Width(width), GUILayout.Height(25)); GUILayout.Space(5); GUILayout.Box(_editor._portrait._thumbnailImage, GUI.skin.label, GUILayout.Width(50), GUILayout.Height(25)); _editor._portrait._imageFilePath_Thumbnail = EditorGUILayout.TextField(_editor._portrait._imageFilePath_Thumbnail, GUILayout.Width(width - (130))); if (GUILayout.Button("Change", GUILayout.Width(60))) { string fileName = EditorUtility.SaveFilePanelInProject("Thumbnail File Path", _editor._portrait.name + "_Thumb.png", "png", "Please Enter a file name to save Thumbnail to"); if (!string.IsNullOrEmpty(fileName)) { _editor._portrait._imageFilePath_Thumbnail = fileName; apEditorUtil.ReleaseGUIFocus(); } } EditorGUILayout.EndHorizontal(); if (GUILayout.Button("Make Thumbnail", GUILayout.Width(width), GUILayout.Height(30))) { if (string.IsNullOrEmpty(_editor._portrait._imageFilePath_Thumbnail)) { //EditorUtility.DisplayDialog("Thumbnail Creating Failed", "File Name is Empty", "Close"); EditorUtility.DisplayDialog(_editor.GetText(apLocalization.TEXT.ThumbCreateFailed_Title), _editor.GetText(apLocalization.TEXT.ThumbCreateFailed_Body_NoFile), _editor.GetText(apLocalization.TEXT.Close) ); } else { RequestExport(EXPORT_TYPE.Thumbnail); #region [비동기 스타일로 변경] //int thumbnailWidth = 256; //int thumbnailHeight = 128; //float preferAspectRatio = (float)thumbnailWidth / (float)thumbnailHeight; //float srcAspectRatio = (float)_editor._captureFrame_SrcWidth / (float)_editor._captureFrame_SrcHeight; ////긴쪽으로 캡쳐 크기를 맞춘다. //int srcThumbWidth = _editor._captureFrame_SrcWidth; //int srcThumbHeight = _editor._captureFrame_SrcHeight; ////AspectRatio = W / H //if(srcAspectRatio < preferAspectRatio) //{ // //가로가 더 길군요. // //가로를 자릅시다. // //H = W / AspectRatio; // srcThumbHeight = (int)((srcThumbWidth / preferAspectRatio) + 0.5f); //} //else //{ // //세로가 더 길군요. // //세로를 자릅시다. // //W = AspectRatio * H // srcThumbWidth = (int)((srcThumbHeight * preferAspectRatio) + 0.5f); //} //Texture2D result = _editor.Exporter.RenderToTexture(_editor.Select.RootUnit._childMeshGroup, // (int)(_editor._captureFrame_PosX + apGL.WindowSizeHalf.x), (int)(_editor._captureFrame_PosY + apGL.WindowSizeHalf.y), // srcThumbWidth, srcThumbHeight, // thumbnailWidth, thumbnailHeight, // _editor._captureFrame_Color // ); //if (result != null) //{ // //이미지를 저장하자 // //이건 Asset으로 자동 저장 // string filePathWOExtension = _editor._portrait._imageFilePath_Thumbnail.Substring(0, _editor._portrait._imageFilePath_Thumbnail.Length - 4); // bool isSaveSuccess = _editor.Exporter.SaveTexture2DToPNG(result, filePathWOExtension, true); // if(isSaveSuccess) // { // AssetDatabase.Refresh(); // _editor._portrait._thumbnailImage = AssetDatabase.LoadAssetAtPath<Texture2D>(_editor._portrait._imageFilePath_Thumbnail); // } //} #endregion } } GUILayout.Space(10); apEditorUtil.GUI_DelimeterBoxH(width); GUILayout.Space(10); //Screenshot을 찍자 //----------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------- EditorGUILayout.LabelField("Screenshot Capture"); GUILayout.Space(5); if (GUILayout.Button("Take a Screenshot", GUILayout.Width(width), GUILayout.Height(30))) { RequestExport(EXPORT_TYPE.PNG); } //----------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------- GUILayout.Space(10); apEditorUtil.GUI_DelimeterBoxH(width); GUILayout.Space(10); //GIF Animation을 만들자 //----------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------- EditorGUILayout.LabelField("GIF Animation"); GUILayout.Space(5); apRootUnit curRootUnit = _editor.Select.RootUnit; if (_curRootUnit != curRootUnit) { //AnimList 리셋 _animClips.Clear(); _curRootUnit = curRootUnit; if (_curRootUnit != null) { for (int i = 0; i < _editor._portrait._animClips.Count; i++) { apAnimClip animClip = _editor._portrait._animClips[i]; if (animClip._targetMeshGroup == _curRootUnit._childMeshGroup) { _animClips.Add(animClip); } } } _selectedAnimClip = null; } if (curRootUnit == null) { _selectedAnimClip = null; } else { if (_selectedAnimClip != null && _animClips.Count > 0) { if (!_animClips.Contains(_selectedAnimClip)) { _selectedAnimClip = null; } } else { _selectedAnimClip = null; } } string animName = "< Animation is not selected >"; Color animBGColor = new Color(1.0f, 0.7f, 0.7f, 1.0f); if (_selectedAnimClip != null) { animName = _selectedAnimClip._name; animBGColor = new Color(0.7f, 1.0f, 0.7f, 1.0f); } Color prevGUIColor = GUI.backgroundColor; GUIStyle guiStyleBox = new GUIStyle(GUI.skin.box); guiStyleBox.alignment = TextAnchor.MiddleCenter; GUI.backgroundColor = animBGColor; GUILayout.Box(animName, guiStyleBox, GUILayout.Width(width), GUILayout.Height(30)); GUI.backgroundColor = prevGUIColor; GUILayout.Space(5); int width_GIFSetting = (width - 32) / 2; int gifQuality = 256 - _editor._captureFrame_GIFSampleQuality; EditorGUILayout.BeginHorizontal(GUILayout.Width(width)); GUILayout.Space(5); string strQuality = ""; if (gifQuality > 200) { strQuality = "Quality [ High ]"; } else if (gifQuality > 120) { strQuality = "Quality [ Medium ]"; } else { strQuality = "Quality [ Low ]"; } EditorGUILayout.LabelField(strQuality, GUILayout.Width(width_GIFSetting)); GUILayout.Space(20); EditorGUILayout.LabelField("Loop Count", GUILayout.Width(width_GIFSetting)); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(GUILayout.Width(width)); GUILayout.Space(5); //10 ~ 256 //246 ~ 0 gifQuality = EditorGUILayout.IntSlider(gifQuality, 0, 246, GUILayout.Width(width_GIFSetting)); gifQuality = 256 - gifQuality; if (_editor._captureFrame_GIFSampleQuality != gifQuality) { _editor._captureFrame_GIFSampleQuality = gifQuality; _editor.SaveEditorPref(); } GUILayout.Space(20); int loopCount = EditorGUILayout.DelayedIntField(_editor._captureFrame_GIFSampleLoopCount, GUILayout.Width(width_GIFSetting)); if (loopCount != _editor._captureFrame_GIFSampleLoopCount) { loopCount = Mathf.Clamp(loopCount, 1, 10); _editor._captureFrame_GIFSampleLoopCount = loopCount; _editor.SaveEditorPref(); } EditorGUILayout.EndHorizontal(); //GUILayout.Space(10); //Rect lastRect_Progress = GUILayoutUtility.GetLastRect(); //Rect barRect = new Rect(lastRect_Progress.x + 5, lastRect_Progress.y + 10, width - 5, 16); //float barRatio = 0.0f; //string strProcessName = ""; //if(_exportProcessType == EXPORT_TYPE.GIFAnimation) //{ // barRatio = Mathf.Clamp01((float)_exportProcessX100 / 100.0f); // strProcessName = "Exporting.. [ " + _exportProcessX100 + "% ]"; //} ////EditorGUI.ProgressBar(barRect, barRatio, "Convert PSD Data To Editor.."); //EditorGUI.ProgressBar(barRect, barRatio, strProcessName); //GUILayout.Space(20); if (apEditorUtil.ToggledButton_2Side("Take a GIF Animation", "Take a GIF Animation", false, (_selectedAnimClip != null), width, 30)) { //RequestExport(EXPORT_TYPE.GIFAnimation);//리퀘스트 안할래.. string defFileName = "GIF_" + DateTime.Now.Year + "" + DateTime.Now.Month + "" + DateTime.Now.Day + "_" + DateTime.Now.Hour + "" + DateTime.Now.Minute + "" + DateTime.Now.Second + ".gif"; string saveFilePath = EditorUtility.SaveFilePanel("Save GIF Animation", _prevFilePath_Directory, defFileName, "gif"); if (!string.IsNullOrEmpty(saveFilePath)) { bool result = _editor.Exporter.MakeGIFAnimation(saveFilePath, _editor.Select.RootUnit._childMeshGroup, _selectedAnimClip, _editor._captureFrame_GIFSampleLoopCount, (int)(_editor._captureFrame_PosX + apGL.WindowSizeHalf.x), (int)(_editor._captureFrame_PosY + apGL.WindowSizeHalf.y), _editor._captureFrame_SrcWidth, _editor._captureFrame_SrcHeight, _editor._captureFrame_DstWidth, _editor._captureFrame_DstHeight, _editor._captureFrame_Color, _editor._captureFrame_GIFSampleQuality ); if (result) { System.IO.FileInfo fi = new System.IO.FileInfo(saveFilePath); Application.OpenURL("file://" + fi.Directory.FullName); Application.OpenURL("file://" + saveFilePath); _prevFilePath = _editor.Exporter.GIF_FilePath; _prevFilePath_Directory = fi.Directory.FullName; } } } GUILayout.Space(10); GUIStyle guiStyle = new GUIStyle(GUIStyle.none); guiStyle.normal.textColor = GUI.skin.label.normal.textColor; GUILayout.Button("Animation Clips", guiStyle, GUILayout.Width(width), GUILayout.Height(20)); //투명 버튼 //애니메이션 클립 리스트를 만들어야 한다. if (_animClips.Count > 0) { Texture2D iconImage = _editor.ImageSet.Get(apImageSet.PRESET.Hierarchy_Animation); apAnimClip nextSelectedAnimClip = null; for (int i = 0; i < _animClips.Count; i++) { apAnimClip animClip = _animClips[i]; if (animClip == _selectedAnimClip) { Rect lastRect = GUILayoutUtility.GetLastRect(); prevCaptureColor = GUI.backgroundColor; GUI.backgroundColor = new Color(0.4f, 0.8f, 1.0f, 1.0f); GUI.Box(new Rect(lastRect.x, lastRect.y + 20, width, 20), ""); GUI.backgroundColor = prevGUIColor; } EditorGUILayout.BeginHorizontal(GUILayout.Width(width - 50)); GUILayout.Space(15); if (GUILayout.Button(new GUIContent(" " + animClip._name, iconImage), guiStyle, GUILayout.Width(width - 35), GUILayout.Height(20))) { nextSelectedAnimClip = animClip; } EditorGUILayout.EndHorizontal(); } if (nextSelectedAnimClip != null) { for (int i = 0; i < _editor._portrait._animClips.Count; i++) { _editor._portrait._animClips[i]._isSelectedInEditor = false; } nextSelectedAnimClip.LinkEditor(_editor._portrait); nextSelectedAnimClip.RefreshTimelines(); nextSelectedAnimClip.SetFrame_Editor(nextSelectedAnimClip.StartFrame); nextSelectedAnimClip.Pause_Editor(); nextSelectedAnimClip._isSelectedInEditor = true; _selectedAnimClip = nextSelectedAnimClip; _editor._portrait._animPlayManager.SetAnimClip_Editor(_selectedAnimClip); } } EditorGUILayout.EndVertical(); GUILayout.Space(500); EditorGUILayout.EndScrollView(); //----------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------- }
// GUI //-------------------------------------------------------------- void OnGUI() { int width = (int)position.width; int height = (int)position.height; if (_editor == null || _editor._portrait == null || _editor._portrait != _portrait) { return; } bool isGUIEvent = (Event.current.type == EventType.Repaint || Event.current.type == EventType.Layout); EditorGUILayout.BeginVertical(); Texture2D iconImageAnimation = _editor.ImageSet.Get(apImageSet.PRESET.Hierarchy_Animation); Texture2D iconImageCategory = _editor.ImageSet.Get(apImageSet.PRESET.Hierarchy_FoldDown); Texture2D iconImageAddParam = _editor.ImageSet.Get(apImageSet.PRESET.Hierarchy_Add); Texture2D iconImageLayerUp = _editor.ImageSet.Get(apImageSet.PRESET.Modifier_LayerUp); Texture2D iconImageLayerDown = _editor.ImageSet.Get(apImageSet.PRESET.Modifier_LayerDown); Texture2D iconImageRemove = _editor.ImageSet.Get(apImageSet.PRESET.Hierarchy_RemoveTransform); GUIStyle guiStyleBox = new GUIStyle(GUI.skin.box); guiStyleBox.alignment = TextAnchor.MiddleCenter; guiStyleBox.normal.textColor = apEditorUtil.BoxTextColor; //" [ " + _animClip._name + " ] Animation Events" //변경 if (_guiContent_AnimClipName == null) { _guiContent_AnimClipName = apGUIContentWrapper.Make(string.Format(" [ {0} ] {1}", _animClip._name, _editor.GetText(TEXT.DLG_AnimationEvents)), false, iconImageAnimation); } if (_guiContent_Range == null) { _guiContent_Range = apGUIContentWrapper.Make(string.Format("{0} : {1} ~ {2}", _editor.GetText(TEXT.DLG_Range), _animClip.StartFrame, _animClip.EndFrame), false); } if (_guiContent_IsLoop == null) { _guiContent_IsLoop = apGUIContentWrapper.Make(string.Format("{0} : {1}", _editor.GetText(TEXT.DLG_IsLoopAnimation), _animClip.IsLoop), false); } GUILayout.Box(_guiContent_AnimClipName.Content, guiStyleBox, GUILayout.Width(width - 10), GUILayout.Height(35)); GUILayout.Space(5); //"Range : " + _animClip.StartFrame + " ~ " + _animClip.EndFrame EditorGUILayout.LabelField(_guiContent_Range.Content); //"Is Loop Animation : " + _animClip.IsLoop EditorGUILayout.LabelField(_guiContent_IsLoop.Content); GUILayout.Space(10); GUIStyle guiStyle_None = new GUIStyle(GUIStyle.none); guiStyle_None.normal.textColor = GUI.skin.label.normal.textColor; guiStyle_None.alignment = TextAnchor.MiddleLeft; GUIStyle guiStyle_Selected = new GUIStyle(GUIStyle.none); if (EditorGUIUtility.isProSkin) { guiStyle_Selected.normal.textColor = Color.cyan; } else { guiStyle_Selected.normal.textColor = Color.white; } guiStyle_Selected.alignment = TextAnchor.MiddleLeft; GUIStyle guiStyle_Center = new GUIStyle(GUIStyle.none); guiStyle_Center.normal.textColor = GUI.skin.label.normal.textColor; guiStyle_Center.alignment = TextAnchor.MiddleCenter; int topHeight = 120; int bottomHeight = 380; Color prevColor = GUI.backgroundColor; GUI.backgroundColor = new Color(0.9f, 0.9f, 0.9f); GUI.Box(new Rect(0, topHeight - 26, width, height - (topHeight + bottomHeight)), ""); GUI.backgroundColor = prevColor; _scrollList = EditorGUILayout.BeginScrollView(_scrollList, GUILayout.Width(width), GUILayout.Height(height - (topHeight + bottomHeight))); GUILayout.Space(5); //"Animation Events" if (_guiContent_AnimEventCategory == null) { _guiContent_AnimEventCategory = apGUIContentWrapper.Make(_editor.GetText(TEXT.DLG_AnimationEvents), false, iconImageCategory); } GUILayout.Button(_guiContent_AnimEventCategory.Content, guiStyle_None, GUILayout.Height(20)); //<투명 버튼// int nAnimEvents = 0; if (_animClip._animEvents != null) { nAnimEvents = _animClip._animEvents.Count; } //GUILayout.Space(10); apAnimEvent animEvent = null; for (int i = 0; i < nAnimEvents; i++) { GUIStyle curGUIStyle = guiStyle_None; animEvent = _animClip._animEvents[i]; if (animEvent == _curSelectedEvent) { Rect lastRect = GUILayoutUtility.GetLastRect(); prevColor = GUI.backgroundColor; if (EditorGUIUtility.isProSkin) { GUI.backgroundColor = new Color(0.0f, 1.0f, 1.0f, 1.0f); } else { GUI.backgroundColor = new Color(0.4f, 0.8f, 1.0f, 1.0f); } GUI.Box(new Rect(lastRect.x, lastRect.y + 21, width, 20), ""); GUI.backgroundColor = prevColor; curGUIStyle = guiStyle_Selected; } EditorGUILayout.BeginHorizontal(GUILayout.Width(width - 50)); GUILayout.Space(15); if (GUILayout.Button("[" + i + "] " + animEvent._eventName, curGUIStyle, GUILayout.Width(width - 80), GUILayout.Height(20))) { _curSelectedEvent = animEvent; } if (animEvent._callType == apAnimEvent.CALL_TYPE.Once) { if (GUILayout.Button(animEvent._frameIndex.ToString(), curGUIStyle, GUILayout.Width(45), GUILayout.Height(20))) { _curSelectedEvent = animEvent; } } else { if (GUILayout.Button(animEvent._frameIndex + " ~ " + animEvent._frameIndex_End, curGUIStyle, GUILayout.Width(45), GUILayout.Height(20))) { _curSelectedEvent = animEvent; } } EditorGUILayout.EndHorizontal(); } GUILayout.Space((height - (topHeight + bottomHeight)) + 100); EditorGUILayout.EndScrollView(); EditorGUILayout.EndVertical(); GUILayout.Space(10); EditorGUILayout.BeginHorizontal(GUILayout.Height(30)); GUILayout.Space(5); //"Add Event" if (GUILayout.Button(_editor.GetText(TEXT.DLG_AddEvent), GUILayout.Width(width - (10 + 6 + (160))), GUILayout.Height(30))) { apEditorUtil.SetRecord_Portrait(apUndoGroupData.ACTION.Anim_AddEvent, _editor, _animClip._portrait, null, false); if (_animClip._animEvents == null) { _animClip._animEvents = new List <apAnimEvent>(); } apAnimEvent newEvent = new apAnimEvent(); //새로운 이름을 찾자 int iNewName = 0; string newName = "NewAnimEvent_" + iNewName; int cnt = 0; while (true) { if (cnt > 500) { newName = "NewAnimEvent_Infinity"; break; } //중복되는 이름이 있는가 newName = "NewAnimEvent_" + iNewName; bool isExist = _animClip._animEvents.Exists(delegate(apAnimEvent a) { return(string.Equals(a._eventName, newName)); }); if (!isExist) { //중복되지 않는 이름이다. break; } //이름이 중복되는 군염 cnt++; iNewName++; } newEvent._eventName = newName; newEvent._frameIndex = _defaultFrame; _animClip._animEvents.Add(newEvent); _curSelectedEvent = newEvent; } //추가 3.29 : 이벤트 복사하기 : 프레임은 무조건 다음 프레임에 string strCopy = _editor.GetUIWord(UIWORD.Copy); //if(GUILayout.Button(_editor.GetUIWord(UIWORD.Copy), GUILayout.Width(80), GUILayout.Height(30))) if (apEditorUtil.ToggledButton_2Side(strCopy, strCopy, false, _curSelectedEvent != null, 80, 30)) { if (_curSelectedEvent != null) { apEditorUtil.SetRecord_Portrait(apUndoGroupData.ACTION.Anim_AddEvent, _editor, _animClip._portrait, null, false); if (_animClip._animEvents == null) { _animClip._animEvents = new List <apAnimEvent>(); } apAnimEvent newEvent = new apAnimEvent(); //선택한 이벤트와 동일한 속성으로 설정. //- _defaultFrame과 다르다면, 거기에 복사 //- _defaultFrame과 같다면 +1프레임 newEvent._eventName = _curSelectedEvent._eventName; newEvent._callType = _curSelectedEvent._callType; if (newEvent._callType == apAnimEvent.CALL_TYPE.Once) { if (_curSelectedEvent._frameIndex == _defaultFrame) { newEvent._frameIndex = _curSelectedEvent._frameIndex + 1; newEvent._frameIndex_End = _curSelectedEvent._frameIndex_End + 1; } else { int frameLength = Mathf.Max(_curSelectedEvent._frameIndex_End - _curSelectedEvent._frameIndex, 0); newEvent._frameIndex = _defaultFrame; newEvent._frameIndex_End = newEvent._frameIndex + frameLength; } } else { int frameLength = Mathf.Max(_curSelectedEvent._frameIndex_End - _curSelectedEvent._frameIndex, 0); if (_curSelectedEvent._frameIndex <= _defaultFrame && _defaultFrame <= _curSelectedEvent._frameIndex + frameLength) { //DefaultFrame이 기존 이벤트 영역에 포함되어 있다. //기존 영역의 밖에서 생성 newEvent._frameIndex = _curSelectedEvent._frameIndex + frameLength + 1; newEvent._frameIndex_End = newEvent._frameIndex + frameLength; } else { //DefaultFrame이 기존 이벤트 영역 밖에 있다. //DefaultFrame부터 생성 newEvent._frameIndex = _defaultFrame; newEvent._frameIndex_End = newEvent._frameIndex + frameLength; } } if (_curSelectedEvent._subParams == null) { _curSelectedEvent._subParams = new List <apAnimEvent.SubParameter>(); } if (_curSelectedEvent._subParams != null) { for (int iParam = 0; iParam < _curSelectedEvent._subParams.Count; iParam++) { apAnimEvent.SubParameter existParam = _curSelectedEvent._subParams[iParam]; apAnimEvent.SubParameter newParam = new apAnimEvent.SubParameter(); //속성들 복사 newParam._paramType = existParam._paramType; newParam._boolValue = existParam._boolValue; newParam._intValue = existParam._intValue; newParam._floatValue = existParam._floatValue; newParam._vec2Value = existParam._vec2Value; newParam._strValue = existParam._strValue; newParam._intValue_End = existParam._intValue_End; newParam._floatValue_End = existParam._floatValue_End; newParam._vec2Value_End = existParam._vec2Value_End; newEvent._subParams.Add(newParam); } } _animClip._animEvents.Add(newEvent); _curSelectedEvent = newEvent; } } //"Sort" if (GUILayout.Button(_editor.GetText(TEXT.DLG_Sort), GUILayout.Width(80), GUILayout.Height(30))) { apEditorUtil.SetRecord_Portrait(apUndoGroupData.ACTION.Anim_SortEvents, _editor, _animClip._portrait, null, false); //프레임 순으로 정렬을 한다. if (_animClip._animEvents != null) { _animClip._animEvents.Sort(delegate(apAnimEvent a, apAnimEvent b) { if (a._frameIndex == b._frameIndex) { return(string.Compare(a._eventName, b._eventName)); } return(a._frameIndex - b._frameIndex); }); apEditorUtil.SetEditorDirty(); } } EditorGUILayout.EndHorizontal(); //선택된 AnimEvent에 대한 설정을 하자 GUILayout.Space(5); apEditorUtil.GUI_DelimeterBoxH(width - 10); GUILayout.Space(5); //선택이 안되었다면 더미 데이터로 채워야함 int curFrameIndex = 0; int curFrameIndex_End = 0; string curName = "<None>"; apAnimEvent.CALL_TYPE curCallType = apAnimEvent.CALL_TYPE.Once; List <apAnimEvent.SubParameter> curSubParams = null; int curNumSubParams = 0; bool isSelected = _curSelectedEvent != null && _animClip._animEvents.Contains(_curSelectedEvent); if (isSelected) { curFrameIndex = _curSelectedEvent._frameIndex; curFrameIndex_End = _curSelectedEvent._frameIndex_End; curName = _curSelectedEvent._eventName; curCallType = _curSelectedEvent._callType; curSubParams = _curSelectedEvent._subParams; curNumSubParams = curSubParams.Count; } if (isSelected) { GUI.backgroundColor = new Color(0.6f, 0.8f, 0.9f, 1.0f); } //"(Not Selected)" GUILayout.Box((isSelected) ? curName : "(" + _editor.GetText(TEXT.DLG_NotSelected) + ")", guiStyleBox, GUILayout.Width(width - 10), GUILayout.Height(25)); GUI.backgroundColor = prevColor; GUILayout.Space(5); EditorGUILayout.BeginVertical(GUILayout.Height(90)); curName = EditorGUILayout.DelayedTextField(_editor.GetText(TEXT.DLG_EventName), curName); //"Event(Function) Name" curCallType = (apAnimEvent.CALL_TYPE)EditorGUILayout.EnumPopup(_editor.GetText(TEXT.DLG_CallMethod), curCallType); //"Call Method" if (curCallType == apAnimEvent.CALL_TYPE.Once) { curFrameIndex = EditorGUILayout.DelayedIntField(_editor.GetText(TEXT.DLG_TargetFrame), curFrameIndex); //"Target Frame" } else { curFrameIndex = EditorGUILayout.DelayedIntField(_editor.GetText(TEXT.DLG_StartFrame), curFrameIndex); //"Start Frame" curFrameIndex_End = EditorGUILayout.DelayedIntField(_editor.GetText(TEXT.DLG_EndFrame), curFrameIndex_End); //"End Frame" } EditorGUILayout.EndVertical(); GUILayout.Space(5); EditorGUILayout.LabelField(_editor.GetText(TEXT.DLG_Parameters)); //"Parameters" GUILayout.Space(5); GUI.backgroundColor = new Color(0.9f, 0.9f, 0.9f); GUI.Box(new Rect(0, (height - (bottomHeight - 171)) + 22, width, 100), ""); GUI.backgroundColor = prevColor; if (!isSelected) { if (!isGUIEvent) { curNumSubParams = _prevNumSubParams; } } _scrollList_Param = EditorGUILayout.BeginScrollView(_scrollList_Param, GUILayout.Width(width), GUILayout.Height(100)); GUILayout.Space(5); int valueWidth = width - (10 + 35 + 130 + 36 + 36 + 36 + 20); int valueHalfWidth = ((valueWidth / 2) - 10); int midWaveWidth = 20; valueWidth += 7; GUIStyle guiStyleListBtn = new GUIStyle(GUI.skin.button); guiStyleListBtn.margin = GUI.skin.textField.margin; apAnimEvent.SubParameter targetSubParam = null; bool isLayerUp = false; bool isLayerDown = false; bool isRemoveParam = false; //SubParam 리스트를 출력하자 if (curNumSubParams > 0) { if (isSelected && curSubParams != null && curSubParams.Count == curNumSubParams) { for (int i = 0; i < curNumSubParams; i++) { EditorGUILayout.BeginHorizontal(GUILayout.Width(width - 50), GUILayout.Height(24)); GUILayout.Space(15); GUILayout.Label("[" + i + "]", GUILayout.Width(30), GUILayout.Height(20)); curSubParams[i]._paramType = (apAnimEvent.PARAM_TYPE)EditorGUILayout.EnumPopup(curSubParams[i]._paramType, GUILayout.Width(120), GUILayout.Height(20)); switch (curSubParams[i]._paramType) { case apAnimEvent.PARAM_TYPE.Bool: { bool nextValue = EditorGUILayout.Toggle(curSubParams[i]._boolValue, GUILayout.Width(valueWidth)); if (curSubParams[i]._boolValue != nextValue) { apEditorUtil.SetRecord_Portrait(apUndoGroupData.ACTION.Anim_EventChanged, _editor, _animClip._portrait, null, false); curSubParams[i]._boolValue = nextValue; } } break; case apAnimEvent.PARAM_TYPE.Integer: { if (curCallType == apAnimEvent.CALL_TYPE.Once) { int nextValue = EditorGUILayout.DelayedIntField(curSubParams[i]._intValue, GUILayout.Width(valueWidth)); if (curSubParams[i]._intValue != nextValue) { apEditorUtil.SetRecord_Portrait(apUndoGroupData.ACTION.Anim_EventChanged, _editor, _animClip._portrait, null, false); curSubParams[i]._intValue = nextValue; } } else { int nextValue_Prev = EditorGUILayout.DelayedIntField(curSubParams[i]._intValue, GUILayout.Width(valueHalfWidth)); EditorGUILayout.LabelField(" ~ ", GUILayout.Width(midWaveWidth)); int nextValue_Next = EditorGUILayout.DelayedIntField(curSubParams[i]._intValue_End, GUILayout.Width(valueHalfWidth)); if (curSubParams[i]._intValue != nextValue_Prev || curSubParams[i]._intValue_End != nextValue_Next) { apEditorUtil.SetRecord_Portrait(apUndoGroupData.ACTION.Anim_EventChanged, _editor, _animClip._portrait, null, false); curSubParams[i]._intValue = nextValue_Prev; curSubParams[i]._intValue_End = nextValue_Next; } } } break; case apAnimEvent.PARAM_TYPE.Float: { if (curCallType == apAnimEvent.CALL_TYPE.Once) { float nextValue = EditorGUILayout.DelayedFloatField(curSubParams[i]._floatValue, GUILayout.Width(valueWidth)); if (curSubParams[i]._floatValue != nextValue) { apEditorUtil.SetRecord_Portrait(apUndoGroupData.ACTION.Anim_EventChanged, _editor, _animClip._portrait, null, false); curSubParams[i]._floatValue = nextValue; } } else { float nextValue_Prev = EditorGUILayout.DelayedFloatField(curSubParams[i]._floatValue, GUILayout.Width(valueHalfWidth)); EditorGUILayout.LabelField(" ~ ", GUILayout.Width(midWaveWidth)); float nextVelue_Next = EditorGUILayout.DelayedFloatField(curSubParams[i]._floatValue_End, GUILayout.Width(valueHalfWidth)); if (curSubParams[i]._floatValue != nextValue_Prev || curSubParams[i]._floatValue_End != nextVelue_Next) { apEditorUtil.SetRecord_Portrait(apUndoGroupData.ACTION.Anim_EventChanged, _editor, _animClip._portrait, null, false); curSubParams[i]._floatValue = nextValue_Prev; curSubParams[i]._floatValue_End = nextVelue_Next; } } } break; case apAnimEvent.PARAM_TYPE.Vector2: { if (curCallType == apAnimEvent.CALL_TYPE.Once) { Vector2 nextValue = apEditorUtil.DelayedVector2Field(curSubParams[i]._vec2Value, valueWidth); if (curSubParams[i]._vec2Value.x != nextValue.x || curSubParams[i]._vec2Value.y != nextValue.y) { apEditorUtil.SetRecord_Portrait(apUndoGroupData.ACTION.Anim_EventChanged, _editor, _animClip._portrait, null, false); curSubParams[i]._vec2Value = nextValue; } } else { Vector2 nextValue_Prev = apEditorUtil.DelayedVector2Field(curSubParams[i]._vec2Value, valueHalfWidth); EditorGUILayout.LabelField(" ~ ", GUILayout.Width(midWaveWidth)); Vector2 nextValue_Next = apEditorUtil.DelayedVector2Field(curSubParams[i]._vec2Value_End, valueHalfWidth); if (curSubParams[i]._vec2Value.x != nextValue_Prev.x || curSubParams[i]._vec2Value.y != nextValue_Prev.y || curSubParams[i]._vec2Value_End.x != nextValue_Next.x || curSubParams[i]._vec2Value_End.y != nextValue_Next.y) { apEditorUtil.SetRecord_Portrait(apUndoGroupData.ACTION.Anim_EventChanged, _editor, _animClip._portrait, null, false); curSubParams[i]._vec2Value = nextValue_Prev; curSubParams[i]._vec2Value_End = nextValue_Next; } } } break; case apAnimEvent.PARAM_TYPE.String: { string nextValue = EditorGUILayout.DelayedTextField(curSubParams[i]._strValue, GUILayout.Width(valueWidth)); if (!string.Equals(curSubParams[i]._strValue, nextValue)) { apEditorUtil.SetRecord_Portrait(apUndoGroupData.ACTION.Anim_EventChanged, _editor, _animClip._portrait, null, false); curSubParams[i]._strValue = nextValue; } } break; } if (GUILayout.Button(iconImageLayerUp, guiStyleListBtn, GUILayout.Width(30), GUILayout.Height(20))) { targetSubParam = curSubParams[i]; isLayerUp = true; } if (GUILayout.Button(iconImageLayerDown, guiStyleListBtn, GUILayout.Width(30), GUILayout.Height(20))) { targetSubParam = curSubParams[i]; isLayerDown = true; } if (GUILayout.Button(iconImageRemove, guiStyleListBtn, GUILayout.Width(30), GUILayout.Height(20))) { targetSubParam = curSubParams[i]; isRemoveParam = true; } EditorGUILayout.EndHorizontal(); } } else { for (int i = 0; i < curNumSubParams; i++) { EditorGUILayout.BeginHorizontal(GUILayout.Width(width - 50)); GUILayout.Space(15); EditorGUILayout.EndHorizontal(); } } } EditorGUILayout.BeginHorizontal(GUILayout.Width(width - 50)); GUILayout.Space(15); //변경 if (_guiContent_AddParameter == null) { _guiContent_AddParameter = new apGUIContentWrapper(); _guiContent_AddParameter.ClearText(false); _guiContent_AddParameter.AppendSpaceText(1, false); _guiContent_AddParameter.AppendText(_editor.GetText(TEXT.DLG_AddParameter), true); _guiContent_AddParameter.SetImage(iconImageAddParam); } if (isSelected) { //" Add Parameter" if (GUILayout.Button(_guiContent_AddParameter.Content, guiStyle_None, GUILayout.Height(20))) { if (isSelected && curSubParams != null && curSubParams.Count == curNumSubParams) { apEditorUtil.SetRecord_Portrait(apUndoGroupData.ACTION.Anim_EventChanged, _editor, _animClip._portrait, null, false); curSubParams.Add(new apAnimEvent.SubParameter()); } } } else { if (GUILayout.Button(apEditorUtil.Text_EMPTY, guiStyle_None, GUILayout.Height(20))) { //Nooo.. } } EditorGUILayout.EndHorizontal(); GUILayout.Space(150); EditorGUILayout.EndScrollView(); GUILayout.Space(10); EditorGUILayout.BeginVertical(GUILayout.Width(width), GUILayout.Height(40)); if (isSelected) { //"Remove Event [" + curName + "]" if (GUILayout.Button(string.Format("{0} [{1}]", _editor.GetText(TEXT.DLG_RemoveEvent), curName), GUILayout.Height(20))) { if (_curSelectedEvent != null && _animClip._animEvents.Contains(_curSelectedEvent)) { apEditorUtil.SetRecord_Portrait(apUndoGroupData.ACTION.Anim_RemoveEvent, _editor, _animClip._portrait, null, false); _animClip._animEvents.Remove(_curSelectedEvent); _curSelectedEvent = null; isSelected = false; } } } else { if (GUILayout.Button("", guiStyle_None, GUILayout.Height(20))) { } } EditorGUILayout.EndVertical(); if (isSelected && _curSelectedEvent != null) { //순서를 바꾸거나 SubParam을 삭제하는 요청이 있으면 처리해주자 if (targetSubParam != null && _curSelectedEvent._subParams.Contains(targetSubParam)) { if (isLayerUp) { //Index -1 int index = _curSelectedEvent._subParams.IndexOf(targetSubParam); if (index > 0) { apEditorUtil.SetRecord_Portrait(apUndoGroupData.ACTION.Anim_EventChanged, _editor, _animClip._portrait, null, false); _curSelectedEvent._subParams.Remove(targetSubParam); _curSelectedEvent._subParams.Insert(index - 1, targetSubParam); } } else if (isLayerDown) { //Index +1 int index = _curSelectedEvent._subParams.IndexOf(targetSubParam); if (index < _curSelectedEvent._subParams.Count - 1) { apEditorUtil.SetRecord_Portrait(apUndoGroupData.ACTION.Anim_EventChanged, _editor, _animClip._portrait, null, false); _curSelectedEvent._subParams.Remove(targetSubParam); _curSelectedEvent._subParams.Insert(index + 1, targetSubParam); } } else if (isRemoveParam) { //삭제한다. apEditorUtil.SetRecord_Portrait(apUndoGroupData.ACTION.Anim_EventChanged, _editor, _animClip._portrait, null, false); _curSelectedEvent._subParams.Remove(targetSubParam); } } if (_curSelectedEvent._frameIndex != curFrameIndex || _curSelectedEvent._frameIndex_End != curFrameIndex_End || _curSelectedEvent._eventName != curName || _curSelectedEvent._callType != curCallType) { apEditorUtil.SetRecord_Portrait(apUndoGroupData.ACTION.Anim_EventChanged, _editor, _animClip._portrait, null, false); _curSelectedEvent._frameIndex = curFrameIndex; _curSelectedEvent._frameIndex_End = curFrameIndex_End; _curSelectedEvent._eventName = curName; _curSelectedEvent._callType = curCallType; } } EditorGUILayout.BeginHorizontal(); bool isClose = false; //"Close" if (GUILayout.Button(_editor.GetText(TEXT.DLG_Close), GUILayout.Height(30))) { isClose = true; apEditorUtil.ReleaseGUIFocus(); } EditorGUILayout.EndHorizontal(); if (isGUIEvent) { _prevNumSubParams = curNumSubParams; } if (isClose) { CloseDialog(); } }
// GUI //---------------------------------------------------------------------- void OnGUI() { int width = (int)position.width; int height = (int)position.height; if (_editor == null || _funcResult == null) { return; } Color prevColor = GUI.backgroundColor; GUI.backgroundColor = new Color(0.9f, 0.9f, 0.9f); GUI.Box(new Rect(0, 35, width, height - (90 + 58)), ""); GUI.backgroundColor = prevColor; EditorGUILayout.BeginVertical(); Texture2D iconImageCategory = _editor.ImageSet.Get(apImageSet.PRESET.Hierarchy_FoldDown); GUIStyle guiStyle_None = new GUIStyle(GUIStyle.none); guiStyle_None.normal.textColor = GUI.skin.label.normal.textColor; GUIStyle guiStyle_Selected = new GUIStyle(GUIStyle.none); if (EditorGUIUtility.isProSkin) { guiStyle_Selected.normal.textColor = Color.cyan; } else { guiStyle_Selected.normal.textColor = Color.white; } GUIStyle guiStyle_Center = new GUIStyle(GUIStyle.none); guiStyle_Center.normal.textColor = GUI.skin.label.normal.textColor; guiStyle_Center.alignment = TextAnchor.MiddleCenter; GUILayout.Space(10); //"Select Modifier" GUILayout.Button(_editor.GetText(TEXT.DLG_SelectModifier), guiStyle_Center, GUILayout.Width(width), GUILayout.Height(15)); //<투명 버튼 GUILayout.Space(10); _scrollList = EditorGUILayout.BeginScrollView(_scrollList, GUILayout.Width(width), GUILayout.Height(height - (90 + 58))); //"Modifiers" GUILayout.Button(new GUIContent(_editor.GetText(TEXT.DLG_Modifiers), iconImageCategory), guiStyle_None, GUILayout.Height(20)); //<투명 버튼 //GUILayout.Space(10); for (int i = 0; i < _modifiers.Count; i++) { GUIStyle curGUIStyle = guiStyle_None; if (_modifiers[i] == _curSelectedMod) { Rect lastRect = GUILayoutUtility.GetLastRect(); prevColor = GUI.backgroundColor; if (EditorGUIUtility.isProSkin) { GUI.backgroundColor = new Color(0.0f, 1.0f, 1.0f, 1.0f); } else { GUI.backgroundColor = new Color(0.4f, 0.8f, 1.0f, 1.0f); } GUI.Box(new Rect(lastRect.x, lastRect.y + 20, width, 20), ""); GUI.backgroundColor = prevColor; curGUIStyle = guiStyle_Selected; } EditorGUILayout.BeginHorizontal(GUILayout.Width(width - 50)); GUILayout.Space(15); if (GUILayout.Button(new GUIContent(" " + _modifiers[i]._name, _modifiers[i]._iconImage), curGUIStyle, GUILayout.Width(width - 35), GUILayout.Height(20))) { _curSelectedMod = _modifiers[i]; } EditorGUILayout.EndHorizontal(); } EditorGUILayout.EndScrollView(); EditorGUILayout.EndVertical(); GUILayout.Space(5); GUIStyle guiStyle_InfoBox = new GUIStyle(GUI.skin.box); guiStyle_InfoBox.alignment = TextAnchor.MiddleCenter; guiStyle_InfoBox.normal.textColor = apEditorUtil.BoxTextColor; GUILayout.Box(GetModInfo(), guiStyle_InfoBox, GUILayout.Width(width - 6), GUILayout.Height(54)); GUILayout.Space(5); EditorGUILayout.BeginHorizontal(); bool isClose = false; if (GUILayout.Button(_editor.GetText(TEXT.DLG_Select), GUILayout.Height(30))) //"Select" { if (_curSelectedMod != null) { //if(_curSelectedMod._modType == apModifierBase.MODIFIER_TYPE.Physic && apVersion.I.IsDemo) if (!apVersion.I.IsAddableModifier((int)_curSelectedMod._modType, _curSelectedMod._validationKey)) { //데모 버전 + 물리 Modifier는 데모 버전에서 선택할 수 없다. EditorUtility.DisplayDialog( _editor.GetText(TEXT.DemoLimitation_Title), _editor.GetText(TEXT.DemoLimitation_Body), _editor.GetText(TEXT.Okay)); } else { _funcResult(true, _loadKey, _curSelectedMod._modType, _targetMeshGroup, _curSelectedMod._validationKey); isClose = true; } } else { _funcResult(false, _loadKey, apModifierBase.MODIFIER_TYPE.Base, _targetMeshGroup, -1); isClose = true; } } if (GUILayout.Button(_editor.GetText(TEXT.DLG_Close), GUILayout.Height(30))) //"Close" { _funcResult(false, _loadKey, apModifierBase.MODIFIER_TYPE.Base, _targetMeshGroup, -1); isClose = true; } EditorGUILayout.EndHorizontal(); if (isClose) { CloseDialog(); } }
// GUI //------------------------------------------------------------------------ void OnGUI() { int width = (int)position.width; int height = (int)position.height; if (_editor == null || _funcResult == null || _targetMeshGroup == null) { CloseDialog(); return; } Color prevColor = GUI.backgroundColor; //레이아웃 구조 //1. Save // - 저장 버튼 //2. Load // - 로드 버튼 // - 본 정보 리스트 // - <색상> 인덱스, 이름 -> 적용 여부 + IK + 색상 로드 // - 전체 선택 / 해제 // - 전체 IK 포함 여부, // - 옵션 : 크기 width -= 10; //1. Save GUIStyle guiStyleBox = new GUIStyle(GUI.skin.box); guiStyleBox.alignment = TextAnchor.MiddleCenter; guiStyleBox.normal.textColor = apEditorUtil.BoxTextColor; GUIStyle guiStyleBox_Left = new GUIStyle(GUI.skin.textField); guiStyleBox_Left.alignment = TextAnchor.MiddleLeft; //" Export Bone Structure" GUILayout.Box(new GUIContent(" " + _editor.GetText(TEXT.DLG_ExportBoneStructure), _editor.ImageSet.Get(apImageSet.PRESET.Rig_SaveLoad)), guiStyleBox, GUILayout.Width(width), GUILayout.Height(35)); GUILayout.Space(5); EditorGUILayout.BeginHorizontal(GUILayout.Width(width), GUILayout.Height(25)); GUILayout.Space(5); int nBones = _targetMeshGroup._boneList_All.Count; //int nBones = _targetMeshGroup._boneList_All string strBones = ""; if (nBones == 0) { //strBones = "No Bones to Export"; strBones = _editor.GetText(TEXT.DLG_NoBonesToExport); } else if (nBones == 1) { //strBones = "1 Bone to Export"; strBones = _editor.GetText(TEXT.DLG_1BoneToExport); } else { //strBones = nBones + " Bones to Export"; strBones = _editor.GetTextFormat(TEXT.DLG_NBonesToExport, nBones); } if (nBones > 0) { GUI.backgroundColor = new Color(prevColor.r * 0.8f, prevColor.g * 1.5f, prevColor.b * 1.5f, 1.0f); } else { GUI.backgroundColor = new Color(prevColor.r * 1.5f, prevColor.g * 0.8f, prevColor.b * 0.8f, 1.0f); } GUILayout.Box(strBones, guiStyleBox, GUILayout.Width(width - 120), GUILayout.Height(25)); GUI.backgroundColor = prevColor; //" Export" if (apEditorUtil.ToggledButton(_editor.ImageSet.Get(apImageSet.PRESET.Rig_SaveLoad), " " + _editor.GetText(TEXT.Export), false, (nBones > 0), 115, 25)) { string saveFilePath = EditorUtility.SaveFilePanel("Save Bone Structure", "", "", "apb"); if (!string.IsNullOrEmpty(saveFilePath)) { //Save를 하자 bool isResult = apRetarget.SaveBaseStruct(_targetMeshGroup, saveFilePath); if (isResult) { _editor.Notification("[" + saveFilePath + "] is Saved", false, false); //Debug.Log("[" + saveFilePath + "] is Saved"); } else { //Debug.LogError("File Save Failed"); } } } EditorGUILayout.EndHorizontal(); GUILayout.Space(10); apEditorUtil.GUI_DelimeterBoxH(width); GUILayout.Space(10); //2. Load // - 로드 버튼 // - 본 정보 리스트 // - <색상> 인덱스, 이름 -> 적용 여부 + IK + 색상 로드 // - 전체 선택 / 해제 // - 전체 IK 포함 여부, // - 옵션 : 크기 //" Import Bone Structure" GUILayout.Box(new GUIContent(" " + _editor.GetText(TEXT.DLG_ImportBoneStructure), _editor.ImageSet.Get(apImageSet.PRESET.Rig_LoadBones)), guiStyleBox, GUILayout.Width(width), GUILayout.Height(35)); GUILayout.Space(5); //로드한 파일 정보 EditorGUILayout.BeginHorizontal(GUILayout.Width(width), GUILayout.Height(25)); GUILayout.Space(5); //TODO : bool isFileLoaded = _retargetData.IsBaseFileLoaded; string strFileName = _retargetData.BaseLoadedFilePath; if (isFileLoaded) { GUI.backgroundColor = new Color(prevColor.r * 0.8f, prevColor.g * 2.0f, prevColor.b * 0.8f, 1.0f); } else { //strFileName = "No File is Imported"; strFileName = _editor.GetText(TEXT.DLG_NoFileIsImported); GUI.backgroundColor = new Color(prevColor.r * 1.5f, prevColor.g * 0.8f, prevColor.b * 0.8f, 1.0f); } EditorGUILayout.TextField(strFileName, guiStyleBox_Left, GUILayout.Width(width - 120), GUILayout.Height(25)); GUI.backgroundColor = prevColor; //"Load File" if (apEditorUtil.ToggledButton(_editor.GetText(TEXT.DLG_LoadFile), false, true, 115, 25)) { string loadFilePath = EditorUtility.OpenFilePanel("Open Bone Structure", "", "apb"); if (!string.IsNullOrEmpty(loadFilePath)) { bool loadResult = _retargetData.LoadBaseStruct(loadFilePath); if (loadResult) { _editor.Notification("[" + loadFilePath + "] is Loaded", false, false); //Debug.Log("[" + loadFilePath + "] is Loaded"); } } } EditorGUILayout.EndHorizontal(); GUILayout.Space(5); int listHeight = height - 450; Rect lastRect = GUILayoutUtility.GetLastRect(); GUI.backgroundColor = new Color(0.7f, 0.7f, 0.7f); GUI.Box(new Rect(0, lastRect.y + 5, width + 10, listHeight), ""); GUI.backgroundColor = prevColor; List <apRetargetBoneUnit> baseBoneUnits = _retargetData.BaseBoneUnits; _scrollList = EditorGUILayout.BeginScrollView(_scrollList, false, true, GUILayout.Width(width + 10), GUILayout.Height(listHeight)); EditorGUILayout.BeginVertical(GUILayout.Width(width - 20)); if (baseBoneUnits != null) { GUIStyle guiStyle_ItemLabel = new GUIStyle(GUI.skin.label); guiStyle_ItemLabel.alignment = TextAnchor.MiddleLeft; GUIStyle guiStyle_ItemTextBox = new GUIStyle(GUI.skin.textField); guiStyle_ItemTextBox.alignment = TextAnchor.MiddleLeft; // - <색상> 인덱스, 이름 -> 적용 여부 + IK + 색상 로드 apRetargetBoneUnit boneUnit = null; int itemWidth = width - 20; int itemHeight = 20; string strImport = _editor.GetText(TEXT.DLG_Import); string strNoImport = _editor.GetText(TEXT.DLG_NoImport); string strIK = "IK"; //<<이건 고유명사 string strNoIK = _editor.GetText(TEXT.DLG_NoIK); string strShape = _editor.GetText(TEXT.DLG_Shape); string strNoShape = _editor.GetText(TEXT.DLG_NoShape); for (int i = 0; i < baseBoneUnits.Count; i++) { boneUnit = baseBoneUnits[i]; EditorGUILayout.BeginHorizontal(GUILayout.Width(itemWidth), GUILayout.Height(itemHeight)); GUILayout.Space(10); GUI.backgroundColor = boneUnit._color; GUILayout.Box("", apEditorUtil.WhiteGUIStyle_Box, GUILayout.Width(16), GUILayout.Height(16)); GUI.backgroundColor = prevColor; EditorGUILayout.LabelField(boneUnit._unitID.ToString(), guiStyle_ItemLabel, GUILayout.Width(30), GUILayout.Height(itemHeight)); boneUnit._name = EditorGUILayout.TextField(boneUnit._name, guiStyle_ItemTextBox, GUILayout.Width(120), GUILayout.Height(itemHeight)); GUILayout.Space(20); //"Import", "Not Import" if (apEditorUtil.ToggledButton_2Side(strImport, strNoImport, boneUnit._isImportEnabled, true, 100, itemHeight)) { boneUnit._isImportEnabled = !boneUnit._isImportEnabled; } GUILayout.Space(10); //"IK", "No IK" if (apEditorUtil.ToggledButton_2Side(strIK, strNoIK, boneUnit._isIKEnabled, boneUnit._isImportEnabled, 70, itemHeight)) { boneUnit._isIKEnabled = !boneUnit._isIKEnabled; } //"Shape", "No Shape" if (apEditorUtil.ToggledButton_2Side(strShape, strNoShape, boneUnit._isShapeEnabled, boneUnit._isImportEnabled, 70, itemHeight)) { boneUnit._isShapeEnabled = !boneUnit._isShapeEnabled; } EditorGUILayout.EndHorizontal(); } } EditorGUILayout.EndVertical(); GUILayout.Space(listHeight + 100); EditorGUILayout.EndScrollView(); GUILayout.Space(20); // - 전체 선택 / 해제 // - 전체 IK 포함 여부, // - 옵션 : 크기 int widthHalf = (width / 2) - 4; EditorGUILayout.BeginHorizontal(GUILayout.Width(width), GUILayout.Height(25)); GUILayout.Space(5); if (apEditorUtil.ToggledButton(_editor.GetText(TEXT.DLG_EnableAllBones), false, isFileLoaded, widthHalf, 25)) //"Enable All Bones" { if (baseBoneUnits != null) { for (int i = 0; i < baseBoneUnits.Count; i++) { baseBoneUnits[i]._isImportEnabled = true; } } } if (apEditorUtil.ToggledButton(_editor.GetText(TEXT.DLG_DisableAllBones), false, isFileLoaded, widthHalf, 25)) //"Disable All Bones" { if (baseBoneUnits != null) { for (int i = 0; i < baseBoneUnits.Count; i++) { baseBoneUnits[i]._isImportEnabled = false; } } } EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(GUILayout.Width(width), GUILayout.Height(25)); GUILayout.Space(5); if (apEditorUtil.ToggledButton(_editor.GetText(TEXT.DLG_EnableAllIK), false, isFileLoaded, widthHalf, 25)) //"Enable All IK" { if (baseBoneUnits != null) { for (int i = 0; i < baseBoneUnits.Count; i++) { baseBoneUnits[i]._isIKEnabled = true; } } } if (apEditorUtil.ToggledButton(_editor.GetText(TEXT.DLG_DisableAllIK), false, isFileLoaded, widthHalf, 25)) //"Disable All IK" { if (baseBoneUnits != null) { for (int i = 0; i < baseBoneUnits.Count; i++) { baseBoneUnits[i]._isIKEnabled = false; } } } EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(GUILayout.Width(width), GUILayout.Height(25)); GUILayout.Space(5); if (apEditorUtil.ToggledButton(_editor.GetText(TEXT.DLG_EnableAllShape), false, isFileLoaded, widthHalf, 25)) //"Enable All Shape" { if (baseBoneUnits != null) { for (int i = 0; i < baseBoneUnits.Count; i++) { baseBoneUnits[i]._isShapeEnabled = true; } } } if (apEditorUtil.ToggledButton(_editor.GetText(TEXT.DLG_DisableAllShape), false, isFileLoaded, widthHalf, 25)) //"Disable All Shape" { if (baseBoneUnits != null) { for (int i = 0; i < baseBoneUnits.Count; i++) { baseBoneUnits[i]._isShapeEnabled = false; } } } EditorGUILayout.EndHorizontal(); GUILayout.Space(10); int widthLabel = 150; int widthValue = width - 155; EditorGUILayout.BeginHorizontal(GUILayout.Width(width), GUILayout.Height(20)); GUILayout.Space(5); //"Import Scale" EditorGUILayout.LabelField(_editor.GetText(TEXT.DLG_ImportScale), GUILayout.Width(widthLabel)); _retargetData._importScale = EditorGUILayout.FloatField(_retargetData._importScale, GUILayout.Width(widthValue)); EditorGUILayout.EndHorizontal(); GUILayout.Space(10); bool isClose = false; bool isSelectBtnAvailable = _retargetData.IsBaseFileLoaded; //<<TODO : 파일을 연게 있다면 이게 true //" Import to [" + _targetMeshGroup._name + "]" if (apEditorUtil.ToggledButton(_editor.ImageSet.Get(apImageSet.PRESET.Rig_LoadBones), " " + _editor.GetTextFormat(TEXT.DLG_ImportToMeshGroup, _targetMeshGroup._name), false, isSelectBtnAvailable, width, 30)) { _funcResult(true, _loadKey, _retargetData, _targetMeshGroup); isClose = true; } GUILayout.Space(10); apEditorUtil.GUI_DelimeterBoxH(width); GUILayout.Space(10); if (apEditorUtil.ToggledButton(_editor.GetText(TEXT.DLG_Close), false, true, width, 30)) //"Close" { //_funcResult(false, _loadKey, null, null); _funcResult(false, _loadKey, null, _targetMeshGroup); isClose = true; } if (isClose) { CloseDialog(); } }
void OnGUI() { int width = (int)position.width; int height = (int)position.height; if (_editor == null || _targetMeshGroup == null) { CloseDialog(); return; } try { Color prevColor = GUI.backgroundColor; //레이아웃 구조 // 타이틀 // Pose 리스트 경로 + 변경 + 갱신 // Pose 보기 종류 : 동일 MeshGroup만, 동일 Portrait만, 모든 Scene에서의 Pose 기록 (Import 안될 수도 있음) // Pose 리스트 // 선택한 Pose 정보 // Pose 이름, 설명 // 저장된 Bone 이름들 (최대 4개 보여주기) // Import / Close width -= 10; //1. 다이얼로그 타이틀 GUIStyle guiStyleBox = new GUIStyle(GUI.skin.box); guiStyleBox.alignment = TextAnchor.MiddleCenter; guiStyleBox.normal.textColor = apEditorUtil.BoxTextColor; GUIStyle guiStyleBox_Left = new GUIStyle(GUI.skin.textField); guiStyleBox_Left.alignment = TextAnchor.MiddleLeft; //" Import Pose" GUILayout.Box(new GUIContent(" " + _editor.GetText(TEXT.DLG_ImportPose), _editor.ImageSet.Get(apImageSet.PRESET.Rig_LoadBones)), guiStyleBox, GUILayout.Width(width), GUILayout.Height(35)); GUILayout.Space(5); //2. Pose 리스트 경로 + 변경 + 갱신 EditorGUILayout.BeginHorizontal(GUILayout.Width(width), GUILayout.Height(20)); int changeBtnWidth = 70; int refreshBtnWidth = 80; int pathWidth = width - (changeBtnWidth + refreshBtnWidth + 4 + 10); GUILayout.Space(5); EditorGUILayout.TextField(_editor._bonePose_BaseFolderName, GUILayout.Width(pathWidth), GUILayout.Height(20)); //"Change" if (GUILayout.Button(_editor.GetText(TEXT.DLG_Change), GUILayout.Width(changeBtnWidth), GUILayout.Height(20))) { string pathResult = EditorUtility.SaveFolderPanel("Set the Pose Folder", _editor._bonePose_BaseFolderName, ""); if (!string.IsNullOrEmpty(pathResult)) { Uri targetUri = new Uri(pathResult); Uri baseUri = new Uri(Application.dataPath); string relativePath = baseUri.MakeRelativeUri(targetUri).ToString(); _editor._bonePose_BaseFolderName = relativePath; apEditorUtil.SetEditorDirty(); _editor.SaveEditorPref(); _retarget.LoadSinglePoseFileList(_editor); _selectedBonePoseFile = null; _isValidPose = false; } } //"Refresh" if (GUILayout.Button(_editor.GetText(TEXT.DLG_Refresh), GUILayout.Width(refreshBtnWidth), GUILayout.Height(20))) { _retarget.LoadSinglePoseFileList(_editor); _selectedBonePoseFile = null; _isValidPose = false; } EditorGUILayout.EndHorizontal(); GUILayout.Space(5); //3. Pose 보기 종류 int categoryBtnWidth = (width - 10) / 3 - 1; int categoryBtnHeight = 20; EditorGUILayout.BeginHorizontal(GUILayout.Width(width), GUILayout.Height(categoryBtnHeight)); GUILayout.Space(5); //"Same MeshGroup" if (apEditorUtil.ToggledButton(_editor.GetText(TEXT.DLG_SameGroup), _category == CATEGORY.SameMeshGroup, true, categoryBtnWidth, categoryBtnHeight)) { _category = CATEGORY.SameMeshGroup; _selectedBonePoseFile = null; _isValidPose = false; } //"Same Portrait" if (apEditorUtil.ToggledButton(_editor.GetText(TEXT.DLG_SamePortrait), _category == CATEGORY.SamePortrait, true, categoryBtnWidth, categoryBtnHeight)) { _category = CATEGORY.SamePortrait; _selectedBonePoseFile = null; _isValidPose = false; } //"All Poses" if (apEditorUtil.ToggledButton(_editor.GetText(TEXT.DLG_AllPoses), _category == CATEGORY.AllPoses, true, categoryBtnWidth, categoryBtnHeight)) { _category = CATEGORY.AllPoses; _selectedBonePoseFile = null; _isValidPose = false; } EditorGUILayout.EndHorizontal(); GUILayout.Space(5); //4. Pose 리스트 int listHeight = height - 450; Rect lastRect = GUILayoutUtility.GetLastRect(); GUI.backgroundColor = new Color(0.9f, 0.9f, 0.9f); GUI.Box(new Rect(0, lastRect.y + 5, width + 10, listHeight), ""); List <apRetargetPoseListFile.FileMetaData> metaDataList = _retarget.SinglePoseList._metaDataList; int itemWidth = width - 20; int itemHeight = 20; int poseNameWidth = 120; int portraitNameWidth = 100; int meshGroupNameWidth = 100; int selectBtnWidth = (width - 40) - (poseNameWidth + portraitNameWidth + meshGroupNameWidth + 6); GUIStyle guiStyle_ItemLabel = new GUIStyle(GUI.skin.label); guiStyle_ItemLabel.alignment = TextAnchor.MiddleLeft; GUIStyle guiStyle_ItemCategory = new GUIStyle(GUI.skin.label); //guiStyle_ItemCategory.alignment = TextAnchor.MiddleCenter; if (EditorGUIUtility.isProSkin) { guiStyle_ItemCategory.normal.textColor = Color.cyan; } else { guiStyle_ItemCategory.normal.textColor = Color.blue; } _scrollList = EditorGUILayout.BeginScrollView(_scrollList, false, true, GUILayout.Width(width + 10), GUILayout.Height(listHeight)); EditorGUILayout.BeginVertical(GUILayout.Width(width - 10)); if (!_retarget.SinglePoseList._isFolderExist) { //"Pose Folder does not exist." EditorGUILayout.LabelField(_editor.GetText(TEXT.DLG_PoseFolderNotExist), GUILayout.Width(itemWidth)); } else { //Pose 이름 / Portrait 이름 / MeshGroup 이름 / 선택 EditorGUILayout.BeginHorizontal(GUILayout.Width(itemWidth), GUILayout.Height(itemHeight)); GUILayout.Space(5); //"Name" EditorGUILayout.LabelField(_editor.GetText(TEXT.DLG_Name), guiStyle_ItemCategory, GUILayout.Width(poseNameWidth), GUILayout.Height(itemHeight)); //"Portrait" EditorGUILayout.LabelField(_editor.GetText(TEXT.DLG_Portrait), guiStyle_ItemCategory, GUILayout.Width(portraitNameWidth), GUILayout.Height(itemHeight)); //"Mesh Group" EditorGUILayout.LabelField(_editor.GetText(TEXT.DLG_MeshGroup), guiStyle_ItemCategory, GUILayout.Width(meshGroupNameWidth), GUILayout.Height(itemHeight)); EditorGUILayout.EndHorizontal(); GUILayout.Space(10); apRetargetPoseListFile.FileMetaData metaData = null; for (int i = 0; i < metaDataList.Count; i++) { metaData = metaDataList[i]; if (_category == CATEGORY.AllPoses) { //그냥 통과 } else if (_category == CATEGORY.SamePortrait) { if (!string.Equals(_portraitName, metaData._portraitName)) { //Portrait 이름이 다르면 스킵 continue; } } else if (_category == CATEGORY.SameMeshGroup) { if (!string.Equals(_portraitName, metaData._portraitName) || _meshGroupUniqueID != metaData._meshGroupUniqueID) { //Portrait 이름이 다르거나 MeshGroupUniqueID가 다르다면 스킵 continue; } } EditorGUILayout.BeginHorizontal(GUILayout.Width(itemWidth), GUILayout.Height(itemHeight)); GUILayout.Space(5); EditorGUILayout.LabelField(metaData._poseName, guiStyle_ItemLabel, GUILayout.Width(poseNameWidth), GUILayout.Height(itemHeight)); EditorGUILayout.LabelField(metaData._portraitName, guiStyle_ItemLabel, GUILayout.Width(portraitNameWidth), GUILayout.Height(itemHeight)); EditorGUILayout.LabelField(metaData._meshGroupName, guiStyle_ItemLabel, GUILayout.Width(meshGroupNameWidth), GUILayout.Height(itemHeight)); //"Selected", "Select" if (apEditorUtil.ToggledButton_2Side(_editor.GetText(TEXT.DLG_Selected), _editor.GetText(TEXT.DLG_Select), metaData == _selectedBonePoseFile, true, selectBtnWidth, itemHeight)) { _selectedBonePoseFile = metaData; _isValidPose = string.Equals(_portraitName, metaData._portraitName) && _meshGroupUniqueID == metaData._meshGroupUniqueID; } EditorGUILayout.EndHorizontal(); } } EditorGUILayout.EndVertical(); GUILayout.Space(listHeight + 100); EditorGUILayout.EndScrollView(); GUILayout.Space(10); //정보를 출력한다. //Pose 이름 //설명 //Portrait //MeshGroup //MeshGroup이 다르면 경고를 준다. //Bone 개수와 이름들 //string selectedPoseName = "No Pose Selected"; string selectedPoseName = _editor.GetText(TEXT.DLG_NoPoseSelected); string selectedDesc = ""; string selectedPortrait = ""; string selectedMeshGroupName = ""; int boneCount = 0; string selectedBoneNames = ""; if (_selectedBonePoseFile != null) { selectedPoseName = _selectedBonePoseFile._poseName; selectedDesc = _selectedBonePoseFile._description; selectedPortrait = _selectedBonePoseFile._portraitName; selectedMeshGroupName = _selectedBonePoseFile._meshGroupName; boneCount = _selectedBonePoseFile._nBones; selectedBoneNames = _selectedBonePoseFile._boneNames; } GUIStyle guiStyle_Desc = new GUIStyle(GUI.skin.textField); guiStyle_Desc.wordWrap = true; if (_selectedBonePoseFile != null) { GUI.backgroundColor = new Color(GUI.backgroundColor.r * 1.0f, GUI.backgroundColor.g * 1.8f, GUI.backgroundColor.b * 1.2f, 1.0f); } GUILayout.Box(selectedPoseName, guiStyleBox, GUILayout.Width(width), GUILayout.Height(30)); if (_selectedBonePoseFile != null) { GUI.backgroundColor = prevColor; } //"Description" EditorGUILayout.LabelField(_editor.GetText(TEXT.DLG_Description), GUILayout.Width(width)); EditorGUILayout.LabelField(selectedDesc, guiStyle_Desc, GUILayout.Width(width), GUILayout.Height(45)); GUILayout.Space(5); EditorGUILayout.LabelField(string.Format("{0} : {1}", _editor.GetText(TEXT.DLG_Portrait), selectedPortrait), GUILayout.Width(width)); //"Portrait : " EditorGUILayout.LabelField(string.Format("{0} : {1}", _editor.GetText(TEXT.DLG_MeshGroup), selectedMeshGroupName), GUILayout.Width(width)); //"Mesh Group : " GUILayout.Space(5); EditorGUILayout.LabelField(string.Format("{0} : {1}", _editor.GetText(TEXT.DLG_NumberBones), boneCount), GUILayout.Width(width)); //"Number of Bones : " if (_selectedBonePoseFile == null) { //"No Bones" GUILayout.Box(_editor.GetText(TEXT.DLG_NoBones), GUILayout.Width(width), GUILayout.Height(45)); } else { if (_isValidPose) { GUI.backgroundColor = new Color(GUI.backgroundColor.r * 1.0f, GUI.backgroundColor.g * 1.5f, GUI.backgroundColor.b * 1.2f, 1.0f); GUILayout.Box(selectedBoneNames, guiStyleBox, GUILayout.Width(width), GUILayout.Height(45)); GUI.backgroundColor = prevColor; } else { GUI.backgroundColor = new Color(GUI.backgroundColor.r * 1.5f, GUI.backgroundColor.g * 0.7f, GUI.backgroundColor.b * 0.7f, 1.0f); //"[Warning. Import may not work properly]\n" + selectedBoneNames GUILayout.Box(string.Format("[{0}]\n{1}", _editor.GetText(TEXT.DLG_Warningproperly), selectedBoneNames), guiStyleBox, GUILayout.Width(width), GUILayout.Height(45)); GUI.backgroundColor = prevColor; } } //"Remove Pose", "Remove Pose" if (apEditorUtil.ToggledButton_2Side(_editor.GetText(TEXT.DLG_RemovePose), _editor.GetText(TEXT.DLG_RemovePose), false, _selectedBonePoseFile != null, width, 20)) { bool isResult = EditorUtility.DisplayDialog(_editor.GetText(TEXT.Retarget_RemoveSinglePose_Title), _editor.GetTextFormat(TEXT.Retarget_RemoveSinglePose_Body, selectedPoseName), _editor.GetText(TEXT.Remove), _editor.GetText(TEXT.Cancel) ); if (isResult && _selectedBonePoseFile != null) { _retarget.SinglePoseList.RemoveFile(_selectedBonePoseFile); //리스트 갱신 _retarget.LoadSinglePoseFileList(_editor); _selectedBonePoseFile = null; _isValidPose = false; } } string strImportPose = " " + _editor.GetText(TEXT.DLG_ImportPose); GUILayout.Space(10); //" Import Pose", " Import Pose" if (apEditorUtil.ToggledButton_2Side(_editor.ImageSet.Get(apImageSet.PRESET.Rig_LoadBones), strImportPose, strImportPose, false, _selectedBonePoseFile != null, width, 30)) { //1. Retarget Bone Pose에 선택한 MetaData 정보를 넣자 if (_selectedBonePoseFile != null) { bool isSuccess = _retarget.LoadSinglePose(_selectedBonePoseFile._filePath); if (!isSuccess) { EditorUtility.DisplayDialog(_editor.GetText(TEXT.Retarget_SinglePoseImportFailed_Title), _editor.GetText(TEXT.Retarget_SinglePoseImportFailed_Body_Error), _editor.GetText(TEXT.Close)); } else { //2. 리턴 함수 콜 if (_funcResult_Anim != null) { _funcResult_Anim(_loadKey, true, _retarget, _targetMeshGroup, _targetAnimClip, _targetAnimTimeline, _targetFrame); } else if (_funcResult_Mod != null) { _funcResult_Mod(_loadKey, true, _retarget, _targetMeshGroup, _targetModifier, _targetParamSet); } //3. 창 닫기 CloseDialog(); } } else { EditorUtility.DisplayDialog(_editor.GetText(TEXT.Retarget_SinglePoseImportFailed_Title), _editor.GetText(TEXT.Retarget_SinglePoseImportFailed_Body_NoFile), _editor.GetText(TEXT.Close)); } } //"Close" if (GUILayout.Button(_editor.GetText(TEXT.DLG_Close), GUILayout.Width(width), GUILayout.Height(25))) { if (_funcResult_Anim != null) { _funcResult_Anim(null, false, _retarget, _targetMeshGroup, _targetAnimClip, _targetAnimTimeline, _targetFrame); } else if (_funcResult_Mod != null) { _funcResult_Mod(null, false, _retarget, _targetMeshGroup, _targetModifier, _targetParamSet); } CloseDialog(); } } catch (Exception) { } }
// GUI //------------------------------------------------------------------ void OnGUI() { int width = (int)position.width; int height = (int)position.height; width -= 10; //if (_editor == null) //{ // CloseDialog(); // return; //} ////만약 Portriat가 바뀌었거나 Editor가 리셋되면 닫자 //if (_editor != apEditor.CurrentEditor) //{ // CloseDialog(); // return; //} //1. 로고 //2. 버전 //3. 데모 기능 제한 확인하기 int logoWidth = _img_Logo.width; int logoHeight = _img_Logo.height; int boxHeight = (int)((float)width * ((float)logoHeight / (float)logoWidth)); Color prevColor = GUI.backgroundColor; GUI.backgroundColor = Color.black; GUILayout.Box(_img_Logo, GUILayout.Width(width), GUILayout.Height(boxHeight)); GUI.backgroundColor = prevColor; GUILayout.Space(5); if (_isFullVersion) { EditorGUILayout.LabelField(string.Format("Build : {0}", apVersion.I.APP_VERSION)); } else { //"Demo Version : " + apVersion.I.APP_VERSION EditorGUILayout.LabelField(string.Format("{0} : {1}", _editor.GetText(TEXT.DLG_DemoVersion), apVersion.I.APP_VERSION)); } GUILayout.Space(10); //풀 버전 : 로고 / 버전 / 홈페이지 / 닫기 / "다시 보이지 않음" (Toogle) //데모 버전 : 로고 / 버전 / 데모와 정품 차이 안내<- 이거 한글만 되어있다. / 닫기 / AssetStore 페이지 if (_isFullVersion) { //홈페이지 //데모 다운로드 안내 if (GUILayout.Button(_editor.GetText(TEXT.DLG_StartPage_Hompage), GUILayout.Width(width), GUILayout.Height(40))) //"Check Limitations" { //홈페이지로 갑시다. Application.OpenURL("https://www.rainyrizzle.com"); CloseDialog(); } } else { //데모 다운로드 안내 if (GUILayout.Button(_editor.GetText(TEXT.DLG_CheckLimitations), GUILayout.Width(width), GUILayout.Height(40))) //"Check Limitations" { //홈페이지로 갑시다. if (_editor._language == apEditor.LANGUAGE.Korean) { Application.OpenURL("https://www.rainyrizzle.com/ap-demodownload-kor"); } else { Application.OpenURL("https://www.rainyrizzle.com/ap-demodownload-eng"); } CloseDialog(); } } GUILayout.Space(5); if (GUILayout.Button(_editor.GetText(TEXT.DLG_Close), GUILayout.Width(width), GUILayout.Height(25))) //"Close" { CloseDialog(); } //왼쪽 : 에셋 스토어 또는 계속 시작 GUILayout.Space(10); if (_isFullVersion) { EditorGUILayout.BeginHorizontal(GUILayout.Width(width), GUILayout.Height(25)); GUILayout.Space(5); EditorGUILayout.LabelField(_editor.GetText(TEXT.DLG_StartPage_AlawysOn), GUILayout.Width(width - (12 + 20)), GUILayout.Height(20)); bool isShow = EditorGUILayout.Toggle(_editor._startScreenOption_IsShowStartup, GUILayout.Width(20), GUILayout.Height(20)); if (_editor._startScreenOption_IsShowStartup != isShow) { _editor._startScreenOption_IsShowStartup = isShow; _editor.SaveEditorPref(); } EditorGUILayout.EndHorizontal(); } else { if (GUILayout.Button("AssetStore", GUILayout.Width(width), GUILayout.Height(20))) { //AssetStore 등록하면 여기에 넣자 Application.OpenURL("http://u3d.as/16c7"); CloseDialog(); } } }
// GUI //------------------------------------------------------------------ void OnGUI() { int width = (int)position.width; int height = (int)position.height; if (_editor == null || _funcResult == null) { return; } int preferImageWidth = 120; int scrollWidth = width - 20; int nImagePerRow = (scrollWidth / preferImageWidth); if (nImagePerRow < 1) { nImagePerRow = 1; } int imageUnitWidth = (scrollWidth / nImagePerRow) - 14; Color prevColor = GUI.backgroundColor; GUI.backgroundColor = new Color(0.9f, 0.9f, 0.9f); GUI.Box(new Rect(0, 37, width, height - 90), ""); GUI.backgroundColor = prevColor; EditorGUILayout.BeginVertical(); GUIStyle guiStyle = new GUIStyle(GUIStyle.none); guiStyle.normal.textColor = GUI.skin.label.normal.textColor; GUIStyle guiStyle_Center = new GUIStyle(GUIStyle.none); guiStyle_Center.normal.textColor = GUI.skin.label.normal.textColor; guiStyle_Center.alignment = TextAnchor.MiddleCenter; GUILayout.Space(10); //EditorGUILayout.LabelField("Select Texture", guiStyle_Center, GUILayout.Width(width), GUILayout.Height(15));//<투명 버튼 EditorGUILayout.BeginHorizontal(GUILayout.Width(width), GUILayout.Height(15)); GUILayout.Space(5); EditorGUILayout.LabelField(_editor.GetText(TEXT.DLG_Search), GUILayout.Width(80)); //"Search" string prevSearchKeyword = _strSearchKeyword; _strSearchKeyword = EditorGUILayout.DelayedTextField(_strSearchKeyword, GUILayout.Width(width - (100 + 110)), GUILayout.Height(15)); if (GUILayout.Button(_editor.GetText(TEXT.DLG_Refresh), GUILayout.Width(100), GUILayout.Height(15))) //"Refresh" { RefreshTextureAssets(); } if (prevSearchKeyword != _strSearchKeyword) { if (string.IsNullOrEmpty(_strSearchKeyword)) { _isSearched = false; } else { _isSearched = true; } RefreshTextureAssets(); } EditorGUILayout.EndHorizontal(); GUILayout.Space(10); _scrollList = EditorGUILayout.BeginScrollView(_scrollList, GUILayout.Width(width), GUILayout.Height(height - (90 + 10))); GUILayout.Space(20); //int imageUnitHeight = 200; int imageUnitHeight = imageUnitWidth + 30; //int scrollWidth = width - 16; //int imageUnitWidth = (scrollWidth / 3) - 12; for (int iRow = 0; iRow < _texture2Ds.Count; iRow += nImagePerRow) { EditorGUILayout.BeginHorizontal(GUILayout.Width(scrollWidth), GUILayout.Height(imageUnitHeight + 8)); for (int iCol = 0; iCol < nImagePerRow; iCol++) { int iTex = iRow + iCol; if (iTex >= _texture2Ds.Count) { break; } GUILayout.Space(5); EditorGUILayout.BeginVertical(GUILayout.Width(imageUnitWidth), GUILayout.Height(imageUnitHeight)); DrawTextureUnit(_texture2Ds[iTex], imageUnitWidth, imageUnitHeight); EditorGUILayout.EndVertical(); if (iCol < nImagePerRow - 1) { GUILayout.Space(2); } } EditorGUILayout.EndHorizontal(); GUILayout.Space(20); } GUILayout.Space(height - 90); EditorGUILayout.EndScrollView(); EditorGUILayout.EndVertical(); GUILayout.Space(10); EditorGUILayout.BeginHorizontal(); bool isClose = false; //string strSelectBtn = "Set Texture"; string strSelectBtn = _editor.GetText(TEXT.DLG_SetTexture); if (_curSelectedTexture2D != null) { if (_curSelectedTexture2D.name.Length < 20) { //strSelectBtn = "Set [" + _curSelectedTexture2D.name + "]"; strSelectBtn = string.Format("{0}\n[{1}]", _editor.GetText(TEXT.DLG_Select), _curSelectedTexture2D.name); } else { //strSelectBtn = "Set [" + _curSelectedTexture2D.name.Substring(0, 15) + "..]"; strSelectBtn = string.Format("{0}\n[{1}]", _editor.GetText(TEXT.DLG_Select), _curSelectedTexture2D.name.Substring(0, 20)); } } if (GUILayout.Button(strSelectBtn, GUILayout.Height(40), GUILayout.Width(width / 2 - 6))) { _funcResult(true, _targetTextureData, _loadKey, _curSelectedTexture2D); isClose = true; } if (GUILayout.Button(_editor.GetText(TEXT.DLG_Close), GUILayout.Height(40), GUILayout.Width(width / 2 - 6))) //"Close" { isClose = true; } EditorGUILayout.EndHorizontal(); if (isClose) { CloseDialog(); } }
// GUI //-------------------------------------------------------------------- void OnGUI() { int width = (int)position.width; int height = (int)position.height; if (_editor == null || _funcResult == null) { return; } Color prevColor = GUI.backgroundColor; GUI.backgroundColor = new Color(0.9f, 0.9f, 0.9f); //Top : (탭) 또는 없음 int yOffset = 10; int height_Properties = 80; int height_Bottom = 70; int height_Main = height - (height_Properties + height_Bottom + 60); GUI.Box(new Rect(0, yOffset, width, height_Main), ""); GUI.backgroundColor = prevColor; EditorGUILayout.BeginVertical(); //Request Type이 "Mesh" 또는 "ChildTransform"이라면 탭이 없다. //Request Type이 "MeshAndMeshGroups"라면 탭이 있다. //1. Tab GUILayout.Space(5); int width_BtnHalf = (width - 10) / 2 - 2; string strCategory = _meshGroup._name; GUILayout.Space(5); GUIStyle guiStyle_None = new GUIStyle(GUIStyle.none); guiStyle_None.normal.textColor = GUI.skin.label.normal.textColor; GUIStyle guiStyle_Selected = new GUIStyle(GUIStyle.none); if (EditorGUIUtility.isProSkin) { guiStyle_Selected.normal.textColor = Color.cyan; } else { guiStyle_Selected.normal.textColor = Color.white; } int height_ListItem = 20; string strSelected = _editor.GetText(TEXT.DLG_Selected); string strNotSelected = _editor.GetText(TEXT.DLG_NotSelected); _scrollList = EditorGUILayout.BeginScrollView(_scrollList, GUILayout.Width(width), GUILayout.Height(height_Main)); EditorGUILayout.BeginVertical(GUILayout.Width(width - 24)); GUILayout.Button(new GUIContent(strCategory, _img_FoldDown), guiStyle_None, GUILayout.Height(height_ListItem)); //<투명 버튼 //리스트 방식 : 아이콘 + 이름 / Selected 버튼 (토글) int width_SelectBtn = 100; int width_Label = width - (width_SelectBtn + 42); bool isSelected = false; //MeshTransform을 출력하자 apTransform_Mesh curMeshTF = null; for (int i = 0; i < _meshTransforms.Count; i++) { curMeshTF = _meshTransforms[i]; isSelected = _selectedMeshTransforms.Contains(curMeshTF); EditorGUILayout.BeginHorizontal(GUILayout.Height(height_ListItem)); GUILayout.Space(10); EditorGUILayout.LabelField(new GUIContent(" " + curMeshTF._nickName, _img_Mesh), GUILayout.Width(width_Label), GUILayout.Height(height_ListItem)); if (apEditorUtil.ToggledButton_2Side(strSelected, strNotSelected, isSelected, true, width_SelectBtn, height_ListItem)) { if (isSelected) { _selectedMeshTransforms.Remove(curMeshTF); } else { _selectedMeshTransforms.Add(curMeshTF); } } EditorGUILayout.EndHorizontal(); GUILayout.Space(2); } GUILayout.Space(height + 20); EditorGUILayout.EndVertical(); EditorGUILayout.EndScrollView(); EditorGUILayout.EndVertical(); GUILayout.Space(5); //복사할 속성들을 토글한다. //두줄로 적자 //"Select Properties to copy" EditorGUILayout.LabelField(_editor.GetText(TEXT.SelectPropertiesToCopy)); GUILayout.Space(5); EditorGUILayout.BeginHorizontal(GUILayout.Width(width), GUILayout.Height(height_Properties)); GUILayout.Space(5); //왼쪽 줄 EditorGUILayout.BeginVertical(GUILayout.Width(width_BtnHalf), GUILayout.Height(height_Properties)); DrawPropertyToggle(COPIED_PROPERTIES.DefaultColor, _editor.GetText(TEXT.DefaultColor), width_BtnHalf); //"Default Color" DrawPropertyToggle(COPIED_PROPERTIES.ShaderType, _editor.GetText(TEXT.BlendingType), width_BtnHalf); //"Blending Type" DrawPropertyToggle(COPIED_PROPERTIES.CustomShader, _editor.GetText(TEXT.CustomShader), width_BtnHalf); //"Custom Shader" DrawPropertyToggle(COPIED_PROPERTIES.RenderTextureSize, _editor.GetText(TEXT.RenderTextureSize), width_BtnHalf); //"Render Texture Size" EditorGUILayout.EndVertical(); GUILayout.Space(5); //오른쪽 줄 EditorGUILayout.BeginVertical(GUILayout.Width(width_BtnHalf), GUILayout.Height(height_Properties)); DrawPropertyToggle(COPIED_PROPERTIES.TwoSides, _editor.GetText(TEXT.TwoSidedMesh), width_BtnHalf); //"2-Sides Rendering" DrawPropertyToggle(COPIED_PROPERTIES.ShadowSettings, _editor.GetText(TEXT.ShadowSettings), width_BtnHalf); //"Shadow Settings" DrawPropertyToggle(COPIED_PROPERTIES.MaterialSet, _editor.GetText(TEXT.MaterialSet), width_BtnHalf); //"Material Set" DrawPropertyToggle(COPIED_PROPERTIES.MaterialProperties, _editor.GetText(TEXT.CustomMaterialProperties), width_BtnHalf); //"Custom Material Properties" EditorGUILayout.EndVertical(); EditorGUILayout.EndHorizontal(); GUILayout.Space(10); //첫줄에는 Select All / Deselect All //둘째줄에는 Add 또는 Apply (인자로 받음) / Close EditorGUILayout.BeginHorizontal(GUILayout.Height(22)); GUILayout.Space(5); if (GUILayout.Button(_editor.GetText(TEXT.DLG_SelectAll), GUILayout.Width(width_BtnHalf), GUILayout.Height(22))) { //Select All for (int i = 0; i < _meshTransforms.Count; i++) { curMeshTF = _meshTransforms[i]; if (!_selectedMeshTransforms.Contains(curMeshTF)) { _selectedMeshTransforms.Add(curMeshTF); } } } if (GUILayout.Button(_editor.GetText(TEXT.DLG_DeselectAll), GUILayout.Width(width_BtnHalf), GUILayout.Height(22))) { //Deselect All _selectedMeshTransforms.Clear(); } EditorGUILayout.EndHorizontal(); GUILayout.Space(5); EditorGUILayout.BeginHorizontal(GUILayout.Height(30)); GUILayout.Space(5); bool isClose = false; if (GUILayout.Button(_editor.GetText(TEXT.DLG_Apply), GUILayout.Width(width_BtnHalf), GUILayout.Height(30))) { _funcResult(true, _loadKey, _srcMeshTransform, _selectedMeshTransforms, GetCopiedPropertyList()); isClose = true; } if (GUILayout.Button(_editor.GetText(TEXT.DLG_Close), GUILayout.Width(width_BtnHalf), GUILayout.Height(30))) //"Close" { _funcResult(false, _loadKey, null, null, null); isClose = true; } EditorGUILayout.EndHorizontal(); if (isClose) { CloseDialog(); } }
// GUI //-------------------------------------------------------------------- void OnGUI() { int width = (int)position.width; int height = (int)position.height; if (_editor == null || _funcResult == null) { return; } Color prevColor = GUI.backgroundColor; GUI.backgroundColor = new Color(0.9f, 0.9f, 0.9f); //Top : (탭) 또는 없음 int height_Top = (_requestTarget == REQUEST_TARGET.MeshAndMeshGroups) ? 25 : 0; int yOffset = (_requestTarget == REQUEST_TARGET.MeshAndMeshGroups) ? (height_Top + 11) : (height_Top + 10); int height_Bottom = 70; int height_Main = height - (height_Top + height_Bottom + 20); GUI.Box(new Rect(0, yOffset, width, height_Main), ""); GUI.backgroundColor = prevColor; EditorGUILayout.BeginVertical(); //Request Type이 "Mesh" 또는 "ChildTransform"이라면 탭이 없다. //Request Type이 "MeshAndMeshGroups"라면 탭이 있다. //1. Tab GUILayout.Space(5); int width_BtnHalf = (width - 10) / 2 - 2; string strCategory = ""; if (_requestTarget == REQUEST_TARGET.MeshAndMeshGroups) { EditorGUILayout.BeginHorizontal(GUILayout.Width(width), GUILayout.Height(height_Top)); GUILayout.Space(5); //1. Mesh + MeshGroup을 선택하는 경우 탭으로 구분한다. if (apEditorUtil.ToggledButton(_editor.GetText(TEXT.DLG_Mesh), (_target == TARGET_TAB.Mesh), width_BtnHalf, height_Top)) //"Mesh" { _target = TARGET_TAB.Mesh; _scrollList = Vector2.zero; } if (apEditorUtil.ToggledButton(_editor.GetText(TEXT.DLG_MeshGroup), (_target == TARGET_TAB.MeshGroup), width_BtnHalf, height_Top)) //"MeshGroup" { _target = TARGET_TAB.MeshGroup; _scrollList = Vector2.zero; } if (_target == TARGET_TAB.Mesh) { //"Meshes"; strCategory = _editor.GetText(TEXT.DLG_Meshes); } else { //"Mesh Groups"; strCategory = _editor.GetText(TEXT.DLG_MeshGroups); } EditorGUILayout.EndHorizontal(); } else { if (_requestTarget == REQUEST_TARGET.Mesh) { //"Meshes"; strCategory = _editor.GetText(TEXT.DLG_Meshes); } else { //Child MeshTransform > MeshGroup 이름; strCategory = _meshGroup._name; } GUILayout.Space(5); } LIST_TYPE curListType = LIST_TYPE.Mesh; switch (_requestTarget) { case REQUEST_TARGET.Mesh: curListType = LIST_TYPE.Mesh; break; case REQUEST_TARGET.ChildMeshTransforms: curListType = LIST_TYPE.MeshTransforms; break; case REQUEST_TARGET.MeshAndMeshGroups: { if (_target == TARGET_TAB.Mesh) { curListType = LIST_TYPE.Mesh; } else { curListType = LIST_TYPE.MeshGroup; } } break; } GUIStyle guiStyle_None = new GUIStyle(GUIStyle.none); GUIStyle guiStyle_Selected = new GUIStyle(GUIStyle.none); if (EditorGUIUtility.isProSkin) { guiStyle_Selected.normal.textColor = Color.cyan; guiStyle_None.normal.textColor = GUI.skin.label.normal.textColor; } else { guiStyle_Selected.normal.textColor = Color.white; guiStyle_None.normal.textColor = Color.black; } Texture2D whildImg = apEditorUtil.WhiteTexture; int height_ListItem = 25; //string strSelected = _editor.GetText(TEXT.DLG_Selected); //string strNotSelected = _editor.GetText(TEXT.DLG_NotSelected); _scrollList = EditorGUILayout.BeginScrollView(_scrollList, GUILayout.Width(width), GUILayout.Height(height_Main)); EditorGUILayout.BeginVertical(); GUILayout.Button(new GUIContent(strCategory, _img_FoldDown), guiStyle_None, GUILayout.Height(height_ListItem)); //<투명 버튼 //리스트 방식 : 아이콘 + 이름 / Selected 버튼 (토글) //int width_SelectBtn = 100; //int width_Label = width - (width_SelectBtn + 42); bool isSelected = false; GUIStyle guiStyle_ItemLabelBtn = new GUIStyle(GUI.skin.label); guiStyle_ItemLabelBtn.alignment = TextAnchor.MiddleLeft; //Ctrl키나 Shift키를 누르면 여러개를 선택할 수 있다. bool isCtrlOrShift = false; if (Event.current.shift #if UNITY_EDITOR_OSX || Event.current.command #else || Event.current.control #endif ) { isCtrlOrShift = true; } //어떤 리스트를 보여야 하는지 여부 if (curListType == LIST_TYPE.Mesh) { //1. Mesh를 출력하자 apMesh curMesh = null; for (int i = 0; i < _meshes.Count; i++) { curMesh = _meshes[i]; isSelected = _selectedObjects.Contains(curMesh); if (DrawItem(curMesh._name, _img_Mesh, isSelected, guiStyle_None, guiStyle_Selected, i, width, height_ListItem, _scrollList.x)) { if (!isCtrlOrShift) { //일단 무조건 클리어 _selectedObjects.Clear(); } if (isSelected) { _selectedObjects.Remove(curMesh); } else { _selectedObjects.Add(curMesh); } } GUILayout.Space(2); } } else if (curListType == LIST_TYPE.MeshGroup) { //2. MeshGroup을 출력하자 apMeshGroup curMeshGroup = null; for (int i = 0; i < _meshGroups.Count; i++) { curMeshGroup = _meshGroups[i]; isSelected = _selectedObjects.Contains(curMeshGroup); if (DrawItem(curMeshGroup._name, _img_MeshGroup, isSelected, guiStyle_None, guiStyle_Selected, i, width, height_ListItem, _scrollList.x)) { if (!isCtrlOrShift) { //일단 무조건 클리어 _selectedObjects.Clear(); } if (isSelected) { _selectedObjects.Remove(curMeshGroup); } else { _selectedObjects.Add(curMeshGroup); } } GUILayout.Space(2); } } else { //3. MeshTransform을 출력하자 apTransform_Mesh curMeshTF = null; for (int i = 0; i < _meshTransforms.Count; i++) { curMeshTF = _meshTransforms[i]; isSelected = _selectedObjects.Contains(curMeshTF); if (DrawItem(curMeshTF._nickName, _img_Mesh, isSelected, guiStyle_None, guiStyle_Selected, i, width, height_ListItem, _scrollList.x)) { if (!isCtrlOrShift) { //일단 무조건 클리어 _selectedObjects.Clear(); } if (isSelected) { _selectedObjects.Remove(curMeshTF); } else { _selectedObjects.Add(curMeshTF); } } GUILayout.Space(2); } } GUILayout.Space(height + 20); EditorGUILayout.EndVertical(); EditorGUILayout.EndScrollView(); EditorGUILayout.EndVertical(); GUILayout.Space(10); //첫줄에는 Select All / Deselect All //둘째줄에는 Add 또는 Apply (인자로 받음) / Close EditorGUILayout.BeginHorizontal(GUILayout.Height(22)); GUILayout.Space(5); if (GUILayout.Button(_editor.GetText(TEXT.DLG_SelectAll), GUILayout.Width(width_BtnHalf), GUILayout.Height(22))) { //Select All for (int i = 0; i < _meshes.Count; i++) { apMesh curMesh = _meshes[i]; if (!_selectedObjects.Contains(curMesh)) { _selectedObjects.Add(curMesh); } } for (int i = 0; i < _meshGroups.Count; i++) { apMeshGroup curMeshGroup = _meshGroups[i]; if (!_selectedObjects.Contains(curMeshGroup)) { _selectedObjects.Add(curMeshGroup); } } for (int i = 0; i < _meshTransforms.Count; i++) { apTransform_Mesh curMeshTF = _meshTransforms[i]; if (!_selectedObjects.Contains(curMeshTF)) { _selectedObjects.Add(curMeshTF); } } } if (GUILayout.Button(_editor.GetText(TEXT.DLG_DeselectAll), GUILayout.Width(width_BtnHalf), GUILayout.Height(22))) { //Deselect All _selectedObjects.Clear(); } EditorGUILayout.EndHorizontal(); GUILayout.Space(5); EditorGUILayout.BeginHorizontal(GUILayout.Height(30)); GUILayout.Space(5); bool isClose = false; if (GUILayout.Button(_positiveBtnText, GUILayout.Width(width_BtnHalf), GUILayout.Height(30))) { _funcResult(true, _loadKey, _selectedObjects, _savedObject); isClose = true; } if (GUILayout.Button(_editor.GetText(TEXT.DLG_Close), GUILayout.Width(width_BtnHalf), GUILayout.Height(30))) //"Close" { _funcResult(false, _loadKey, null, _savedObject); isClose = true; } EditorGUILayout.EndHorizontal(); if (isClose) { CloseDialog(); } }