From 567fc2da0b5367cbbe59ea5fb3596802c2aa7a43 Mon Sep 17 00:00:00 2001 From: chai Date: Thu, 29 Jul 2021 18:47:06 +0800 Subject: +collider editor --- Assets/ActionTool/Editor/ActionColliderEditor.cs | 169 ++++++++++++++------- .../ActionTool/Editor/ActionColliderEditor.cs.meta | 2 +- .../ActionTool/Editor/ActionColliderFrameEditor.cs | 82 ++++++++++ .../Editor/ActionColliderFrameEditor.cs.meta | 11 ++ Assets/ActionTool/Editor/ActionManager.cs | 14 +- Assets/ActionTool/Editor/ActionPreviewEditor.cs | 3 +- .../Unit/PC/Erika/AnimationData/Take 001.asset | 48 ++++-- Assets/Scripts/Unit/Collider/ColliderBox.cs | 24 ++- Assets/Scripts/Unit/Collider/ColliderData.cs | 11 +- .../Collider/ColliderDifferentiationAttribute.cs | 14 ++ .../ColliderDifferentiationAttribute.cs.meta | 11 ++ .../Unit/Events/Editor/AnimationDataInspector.cs | 26 ++-- Assets/Scripts/Utils/DisallowModifiyInGUI.cs | 9 ++ Assets/Scripts/Utils/DisallowModifiyInGUI.cs.meta | 11 ++ 14 files changed, 349 insertions(+), 86 deletions(-) create mode 100644 Assets/ActionTool/Editor/ActionColliderFrameEditor.cs create mode 100644 Assets/ActionTool/Editor/ActionColliderFrameEditor.cs.meta create mode 100644 Assets/Scripts/Unit/Collider/ColliderDifferentiationAttribute.cs create mode 100644 Assets/Scripts/Unit/Collider/ColliderDifferentiationAttribute.cs.meta create mode 100644 Assets/Scripts/Utils/DisallowModifiyInGUI.cs create mode 100644 Assets/Scripts/Utils/DisallowModifiyInGUI.cs.meta (limited to 'Assets') diff --git a/Assets/ActionTool/Editor/ActionColliderEditor.cs b/Assets/ActionTool/Editor/ActionColliderEditor.cs index d75fd8fc..346cadbc 100644 --- a/Assets/ActionTool/Editor/ActionColliderEditor.cs +++ b/Assets/ActionTool/Editor/ActionColliderEditor.cs @@ -1,82 +1,149 @@ -using System.Collections; +using System; +using System.Collections; using System.Collections.Generic; +using System.Reflection; using UnityEngine; using UnityEditor; namespace ActionTool { - // 编辑collider帧 + // 编辑事件 public class ActionColliderEditor : EditorWindow { - EditorWindow sceneView; + EditorWindow sceneView; + ActionEditorStyles styles; + + ColliderBox collider; private void OnEnable() { - titleContent = new GUIContent("Collider Editor"); - maxSize = new Vector2(300, 150); - minSize = maxSize; - - if(!sceneView) - sceneView = EditorWindow.GetWindow(); - } - - private void OnDisable() + titleContent = new GUIContent("Collider Editor"); + } + + private void OnDisable() { - // sceneView = null; - ActionManager.OnSelectColliderFrame(null); } - private void Update() - { - } + private void Update() + { + } - private void OnGUI() + Vector2 scroll; + private void OnGUI() { - var frame = ActionManager.editColliderFrame; - if (frame == null) + if (ActionManager.colliderData == null) { this.Close(); return; } - GUI.changed = false; + collider = ActionManager.colliderData.collider; + if (collider == null) + return; - GUILayout.Space(5); + if (styles == null) styles = ActionEditorStyles.Get(); - EditorGUILayout.BeginHorizontal(); - EditorGUILayout.LabelField("frame: "); - EditorGUILayout.LabelField(frame.frame.ToString()); - EditorGUILayout.EndHorizontal(); + GUILayout.Space(2); - EditorGUILayout.BeginHorizontal(); - EditorGUILayout.LabelField("active: "); - frame.active = EditorGUILayout.Toggle(frame.active); - EditorGUILayout.EndHorizontal(); + scroll = EditorGUILayout.BeginScrollView(scroll); - EditorGUILayout.LabelField("position: "); - frame.position = EditorGUILayout.Vector3Field("", frame.position); + Type type = collider.GetType(); + FieldInfo[] fields = type.GetFields(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly); + if (fields != null && fields.Length > 0) + { + for (int i = 0; i < fields.Length; ++i) + { + FieldInfo field = fields[i]; + string name = field.Name + " (" + field.FieldType.Name + ")"; + string tooltip = ""; + bool skip = false; + foreach (var attr in field.GetCustomAttributes()) + { + if (attr.GetType() == typeof(TooltipAttribute)) + { + TooltipAttribute tooltipattr = attr as TooltipAttribute; + if (tooltip != null) + { + tooltip = tooltipattr.tooltip; + } + } + else if(attr.GetType() == typeof(DisallowModifiyInGUI)) + { + GUI.enabled = false; + } + else if(attr.GetType() == typeof(ColliderTypeAttribute)) + { + ColliderTypeAttribute t = attr as ColliderTypeAttribute; + if (t.type != collider.type) + { + skip = true; + break; + } + } + } + if(skip) + { + GUI.enabled = true; + continue; + } + EditorGUILayout.LabelField(new GUIContent(name, tooltip), styles.textBold); + if (field.FieldType == typeof(Vector3)) + { + field.SetValue(collider, GUI_Vector3((Vector3)field.GetValue(collider))); + } + else if (field.FieldType == typeof(Vector2)) + { + field.SetValue(collider, GUI_Vector2((Vector2)field.GetValue(collider))); + } + else if (field.FieldType == typeof(string)) + { + field.SetValue(collider, GUI_String((string)field.GetValue(collider))); + } + else if (field.FieldType == typeof(bool)) + { + field.SetValue(collider, GUI_Bool((bool)field.GetValue(collider))); + } + else + { + GUI_Enum(field.GetValue(collider).ToString()); + } + GUI.enabled = true; + GUILayout.Space(5); + } + } + EditorGUILayout.EndScrollView(); + } - EditorGUILayout.LabelField("size: "); - frame.size = EditorGUILayout.Vector3Field("", frame.size); + Vector3 GUI_Vector3(Vector3 value) + { + Rect rect = EditorGUILayout.GetControlRect(); + return EditorGUI.Vector3Field(rect, "", value); + } - GUILayout.Space(10); + Vector2 GUI_Vector2(Vector2 value) + { + Rect rect = EditorGUILayout.GetControlRect(); + return EditorGUI.Vector2Field(rect, "", value); + } - Color prevColor = GUI.backgroundColor; - GUI.backgroundColor = Color.red; - if (GUILayout.Button("Delete")) - { - ActionManager.DeleteCurFrame(); - } - GUI.backgroundColor = prevColor; - - if (GUI.changed) - { - if (sceneView != null) - sceneView.Repaint(); - if (ActionManager.PreviewWindow != null) - ActionManager.PreviewWindow.Repaint(); - } + string GUI_String(string value) + { + Rect rect = EditorGUILayout.GetControlRect(); + return EditorGUI.TextField(rect, "", value); } + + bool GUI_Bool(bool value) + { + Rect rect = EditorGUILayout.GetControlRect(); + return GUI.Toggle(rect, value, "Check"); + } + + void GUI_Enum(string value) + { + Rect rect = EditorGUILayout.GetControlRect(); + GUI.Label(rect, value); + } + } -} \ No newline at end of file +} \ No newline at end of file diff --git a/Assets/ActionTool/Editor/ActionColliderEditor.cs.meta b/Assets/ActionTool/Editor/ActionColliderEditor.cs.meta index 393c3deb..2fd8e91f 100644 --- a/Assets/ActionTool/Editor/ActionColliderEditor.cs.meta +++ b/Assets/ActionTool/Editor/ActionColliderEditor.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 3fcd174d4fc741a4986f1a08413e6ada +guid: 8507f595519bce344b9b7f27fa2f0f32 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Assets/ActionTool/Editor/ActionColliderFrameEditor.cs b/Assets/ActionTool/Editor/ActionColliderFrameEditor.cs new file mode 100644 index 00000000..4f716be3 --- /dev/null +++ b/Assets/ActionTool/Editor/ActionColliderFrameEditor.cs @@ -0,0 +1,82 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; + +namespace ActionTool +{ + + // 编辑collider帧 + public class ActionColliderFrameEditor : EditorWindow + { + EditorWindow sceneView; + + private void OnEnable() + { + titleContent = new GUIContent("Collider Frame Editor"); + maxSize = new Vector2(300, 150); + minSize = maxSize; + + if(!sceneView) + sceneView = EditorWindow.GetWindow(); + } + + private void OnDisable() + { + // sceneView = null; + ActionManager.OnSelectColliderFrame(null); + } + + private void Update() + { + } + + private void OnGUI() + { + var frame = ActionManager.editColliderFrame; + if (frame == null) + { + this.Close(); + return; + } + + GUI.changed = false; + + GUILayout.Space(5); + + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("frame: "); + EditorGUILayout.LabelField(frame.frame.ToString()); + EditorGUILayout.EndHorizontal(); + + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("active: "); + frame.active = EditorGUILayout.Toggle(frame.active); + EditorGUILayout.EndHorizontal(); + + EditorGUILayout.LabelField("position: "); + frame.position = EditorGUILayout.Vector3Field("", frame.position); + + EditorGUILayout.LabelField("size: "); + frame.size = EditorGUILayout.Vector3Field("", frame.size); + + GUILayout.Space(10); + + Color prevColor = GUI.backgroundColor; + GUI.backgroundColor = Color.red; + if (GUILayout.Button("Delete")) + { + ActionManager.DeleteCurFrame(); + } + GUI.backgroundColor = prevColor; + + if (GUI.changed) + { + if (sceneView != null) + sceneView.Repaint(); + if (ActionManager.PreviewWindow != null) + ActionManager.PreviewWindow.Repaint(); + } + } + } +} \ No newline at end of file diff --git a/Assets/ActionTool/Editor/ActionColliderFrameEditor.cs.meta b/Assets/ActionTool/Editor/ActionColliderFrameEditor.cs.meta new file mode 100644 index 00000000..393c3deb --- /dev/null +++ b/Assets/ActionTool/Editor/ActionColliderFrameEditor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3fcd174d4fc741a4986f1a08413e6ada +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/ActionTool/Editor/ActionManager.cs b/Assets/ActionTool/Editor/ActionManager.cs index 4fe3138b..7becca02 100644 --- a/Assets/ActionTool/Editor/ActionManager.cs +++ b/Assets/ActionTool/Editor/ActionManager.cs @@ -25,6 +25,7 @@ namespace ActionTool public static ActionEditor AnimationWindow; public static ActionPreviewEditor PreviewWindow; public static ActionEventEditor EventEditWindow; + public static ActionColliderFrameEditor ColliderFrameWindow; public static ActionColliderEditor ColliderWindow; public static ActionToolSettings Settings; @@ -170,7 +171,7 @@ namespace ActionTool OnSelectColliderFrame(null); OnSelectBox(null); if (EventEditWindow) EventEditWindow.Close(); - if (ColliderWindow) ColliderWindow.Close(); + if (ColliderFrameWindow) ColliderFrameWindow.Close(); } public static bool HasSelectObj() @@ -352,9 +353,18 @@ namespace ActionTool } } + public static void EditCollider() + { + if (s_CurColliderData == null) + return; + ColliderWindow = EditorWindow.GetWindow(true); + } + public static void OnSelectBox(ColliderData collider) { s_CurColliderData = collider; + if (ColliderWindow != null) + ColliderWindow.Repaint(); } public static void AddNewBoxFrame(object param) @@ -396,7 +406,7 @@ namespace ActionTool if (frame != null) { - ColliderWindow = EditorWindow.GetWindow(true); + ColliderFrameWindow = EditorWindow.GetWindow(true); ActionData action = ActionManager.actionData; float normaltime = frame.frame / action.totalFrame; diff --git a/Assets/ActionTool/Editor/ActionPreviewEditor.cs b/Assets/ActionTool/Editor/ActionPreviewEditor.cs index f0a828fc..ecec6dde 100644 --- a/Assets/ActionTool/Editor/ActionPreviewEditor.cs +++ b/Assets/ActionTool/Editor/ActionPreviewEditor.cs @@ -475,11 +475,12 @@ namespace ActionTool void GUI_Toolbar_Detail(ref float x, ref float y) { - x += kToolbarControlMargin; + x += kToolbarControlMargin + 20; Rect rect = new Rect(x, y, kToolbarControlSize, kToolbarControlSize); GUI.enabled = ActionManager.colliderData != null; if (GUI.Button(rect, new GUIContent(styles.infoIcon, "Detail"))) { + ActionManager.EditCollider(); } GUI.enabled = true; x += kToolbarControlSize; diff --git a/Assets/Bundle/Unit/PC/Erika/AnimationData/Take 001.asset b/Assets/Bundle/Unit/PC/Erika/AnimationData/Take 001.asset index bb83d93a..0de79a47 100644 --- a/Assets/Bundle/Unit/PC/Erika/AnimationData/Take 001.asset +++ b/Assets/Bundle/Unit/PC/Erika/AnimationData/Take 001.asset @@ -21,8 +21,12 @@ MonoBehaviour: - {fileID: 114750047321414068} - {fileID: 114541332933305096} hurtBoxes: - - type: 1 - pivot: 0 + - collider: + type: 1 + pivot: 0 + useGravity: 1 + hitBack: {x: 0, y: 0, z: 0} + multiHit: 0 frames: - frame: 0 active: 1 @@ -81,8 +85,12 @@ MonoBehaviour: position: {x: 0, y: 0, z: 0} size: {x: 1, y: 1.3, z: 0.5} hitBoxes: - - type: 0 - pivot: 1 + - collider: + type: 0 + pivot: 0 + useGravity: 0 + hitBack: {x: 0, y: 0, z: 0} + multiHit: 0 frames: - frame: 11 active: 1 @@ -92,8 +100,12 @@ MonoBehaviour: active: 1 position: {x: 0, y: 0.58, z: 1} size: {x: 1, y: 1, z: 0.5} - - type: 0 - pivot: 1 + - collider: + type: 0 + pivot: 0 + useGravity: 0 + hitBack: {x: 0, y: 0, z: 0} + multiHit: 0 frames: - frame: 24 active: 1 @@ -103,8 +115,12 @@ MonoBehaviour: active: 1 position: {x: 0, y: 1.37, z: 1.31} size: {x: 1, y: 1.62, z: 0.49} - - type: 0 - pivot: 1 + - collider: + type: 0 + pivot: 0 + useGravity: 0 + hitBack: {x: 0, y: 0, z: 0} + multiHit: 0 frames: - frame: 40 active: 1 @@ -114,8 +130,12 @@ MonoBehaviour: active: 1 position: {x: 0, y: 0.52, z: 1.08} size: {x: 1, y: 1.43, z: 0.5} - - type: 0 - pivot: 1 + - collider: + type: 0 + pivot: 0 + useGravity: 0 + hitBack: {x: 0, y: 0, z: 0} + multiHit: 0 frames: - frame: 44 active: 1 @@ -125,8 +145,12 @@ MonoBehaviour: active: 1 position: {x: 0, y: 0.3, z: 0.85} size: {x: 1, y: 1, z: 0.5} - - type: 0 - pivot: 1 + - collider: + type: 0 + pivot: 0 + useGravity: 0 + hitBack: {x: 0, y: 0, z: 0} + multiHit: 0 frames: - frame: 48 active: 1 diff --git a/Assets/Scripts/Unit/Collider/ColliderBox.cs b/Assets/Scripts/Unit/Collider/ColliderBox.cs index 5bbce427..9bf2628d 100644 --- a/Assets/Scripts/Unit/Collider/ColliderBox.cs +++ b/Assets/Scripts/Unit/Collider/ColliderBox.cs @@ -3,13 +3,17 @@ using System.Collections; using System.Collections.Generic; using UnityEngine; +[Serializable] public class ColliderBox { + // pivot public enum Pivot { MiddleBottom = 0, MiddleCenter = 1, } + + // 分化为不同的collider类型 public enum EColliderType { HitBox, @@ -18,8 +22,22 @@ public class ColliderBox BlockBox, DefendBox, } + + [DisallowModifiyInGUI] public EColliderType type; - public Vector3 position; - public Vector3 size; - public bool active; + [DisallowModifiyInGUI] + public Pivot pivot; + + #region Hurtbox + [ColliderType(EColliderType.HurtBox)] + public bool useGravity; + #endregion + + #region Hitbox + [ColliderType(EColliderType.HitBox)] + public Vector3 hitBack; + [ColliderType(EColliderType.HitBox)] + public bool multiHit; + #endregion + } \ No newline at end of file diff --git a/Assets/Scripts/Unit/Collider/ColliderData.cs b/Assets/Scripts/Unit/Collider/ColliderData.cs index ad4df73f..ad3b7326 100644 --- a/Assets/Scripts/Unit/Collider/ColliderData.cs +++ b/Assets/Scripts/Unit/Collider/ColliderData.cs @@ -22,17 +22,20 @@ public class ColliderData public Vector3 size; } - public ColliderBox.EColliderType type; + public ColliderBox.EColliderType type { get { return collider.type; } } + public ColliderBox.Pivot pivot { get { return collider.pivot; } } - public ColliderBox.Pivot pivot; + public ColliderBox collider; public List frames; public ColliderData(ColliderBox.EColliderType type, ColliderBox.Pivot pivot) { - this.type = type; - this.pivot = pivot; this.frames = new List(); + if (collider == null) + collider = new ColliderBox(); + collider.type = type; + collider.pivot = pivot; } public ColliderInfo GetColliderInfo(float frame) diff --git a/Assets/Scripts/Unit/Collider/ColliderDifferentiationAttribute.cs b/Assets/Scripts/Unit/Collider/ColliderDifferentiationAttribute.cs new file mode 100644 index 00000000..7d634b93 --- /dev/null +++ b/Assets/Scripts/Unit/Collider/ColliderDifferentiationAttribute.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class ColliderTypeAttribute : Attribute +{ + public ColliderTypeAttribute(ColliderBox.EColliderType type) + { + this.type = type; + } + + public ColliderBox.EColliderType type; +} diff --git a/Assets/Scripts/Unit/Collider/ColliderDifferentiationAttribute.cs.meta b/Assets/Scripts/Unit/Collider/ColliderDifferentiationAttribute.cs.meta new file mode 100644 index 00000000..73ff8d73 --- /dev/null +++ b/Assets/Scripts/Unit/Collider/ColliderDifferentiationAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9aa9fd1fcb8a10341bbf8b8fdeb54599 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Unit/Events/Editor/AnimationDataInspector.cs b/Assets/Scripts/Unit/Events/Editor/AnimationDataInspector.cs index 0787e74f..1ca321c8 100644 --- a/Assets/Scripts/Unit/Events/Editor/AnimationDataInspector.cs +++ b/Assets/Scripts/Unit/Events/Editor/AnimationDataInspector.cs @@ -20,18 +20,20 @@ public class AnimationDataEditor : Editor public override void OnInspectorGUI() { - if (animData == null) - return; - EditorGUI.BeginChangeCheck(); - - GUILayout.Label("Animation File:"); - GUILayout.TextField(animData.animationName); - - if(EditorGUI.EndChangeCheck()) - { - EditorUtility.SetDirty(animData); - AssetDatabase.SaveAssets(); - } + this.DrawDefaultInspector(); + + //if (animData == null) + // return; + //EditorGUI.BeginChangeCheck(); + + //GUILayout.Label("Animation File:"); + //GUILayout.TextField(animData.animationName); + + //if(EditorGUI.EndChangeCheck()) + //{ + // EditorUtility.SetDirty(animData); + // AssetDatabase.SaveAssets(); + //} } } diff --git a/Assets/Scripts/Utils/DisallowModifiyInGUI.cs b/Assets/Scripts/Utils/DisallowModifiyInGUI.cs new file mode 100644 index 00000000..660d2f0e --- /dev/null +++ b/Assets/Scripts/Utils/DisallowModifiyInGUI.cs @@ -0,0 +1,9 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +// 有这个标记时表示这个属性是GUI.enabled = false +public class DisallowModifiyInGUI : Attribute +{ +} diff --git a/Assets/Scripts/Utils/DisallowModifiyInGUI.cs.meta b/Assets/Scripts/Utils/DisallowModifiyInGUI.cs.meta new file mode 100644 index 00000000..afc8de79 --- /dev/null +++ b/Assets/Scripts/Utils/DisallowModifiyInGUI.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 28afd9ec15889e540aed85386e9d33f7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: -- cgit v1.1-26-g67d0