diff options
5 files changed, 173 insertions, 44 deletions
diff --git a/AlienSurvival/Assets/Scripts/Physics/Editor/TopDownTransformInspector.cs b/AlienSurvival/Assets/Scripts/Physics/Editor/TopDownTransformInspector.cs index b1139f2..b1ceaab 100644 --- a/AlienSurvival/Assets/Scripts/Physics/Editor/TopDownTransformInspector.cs +++ b/AlienSurvival/Assets/Scripts/Physics/Editor/TopDownTransformInspector.cs @@ -32,14 +32,18 @@ public class TopDownTransformInspector : Editor //https://answers.unity.com/questions/463207/how-do-you-make-a-custom-handle-respond-to-the-mou.html private void OnSceneGUI() { + Vector3 pos3d = m_TopDownTransform.Get3DPosition(); + + float arrowSize = 2f; + Handles.color = Handles.xAxisColor; - m_TopDownTransform.x = EditorHandlesHelper.ScaleValue(m_TopDownTransform.x, m_TopDownTransform.Get3DPosition(), Vector3.right, 1f, Handles.ConeHandleCap, Quaternion.Euler(0, 90, 0), 1f, 0.1f); + m_TopDownTransform.x += EditorHandlesHelper.PositionArrow(pos3d, Vector3.right, 1f, arrowSize).x; Handles.color = Handles.yAxisColor; - m_TopDownTransform.y = EditorHandlesHelper.ScaleValue(m_TopDownTransform.y, m_TopDownTransform.Get3DPosition(), Vector3.up, 1f, Handles.ConeHandleCap, Quaternion.Euler(-90, 0, 0), 1f, 0.1f); + m_TopDownTransform.y -= EditorHandlesHelper.PositionArrow(pos3d, Vector3.up, 1f, arrowSize).y; Handles.color = Handles.zAxisColor; - m_TopDownTransform.z = EditorHandlesHelper.ScaleValue(m_TopDownTransform.z, m_TopDownTransform.Get3DPosition() + new Vector3(0, -1.1f, 0), Vector3.up, 1f, Handles.ConeHandleCap, Quaternion.Euler(-90, 0, 0), 1f, 0.1f); + m_TopDownTransform.z -= EditorHandlesHelper.PositionArrow(pos3d + new Vector3(0, -m_TopDownTransform.z - 0.1f, 0), Vector3.up, m_TopDownTransform.z, arrowSize, true).y; } diff --git a/AlienSurvival/Assets/Scripts/Physics/TopDownTransform.cs b/AlienSurvival/Assets/Scripts/Physics/TopDownTransform.cs index 3bb51b1..d93a453 100644 --- a/AlienSurvival/Assets/Scripts/Physics/TopDownTransform.cs +++ b/AlienSurvival/Assets/Scripts/Physics/TopDownTransform.cs @@ -91,6 +91,15 @@ public class TopDownTransform : MonoBehaviour return pos; } + public Vector3 GetGround3DPosition() + { + Vector3 pos = new Vector3(); + pos.x = m_LocalPosition.x; + pos.y = m_LocalPosition.y ; + pos.z = transform.position.z; + return pos; + } + #if UNITY_EDITOR private void OnDrawGizmos() { diff --git a/AlienSurvival/Assets/Scripts/Rendering/TopDownShadowCaster.cs b/AlienSurvival/Assets/Scripts/Rendering/TopDownShadowCaster.cs index 2ef26a0..9e3a3ee 100644 --- a/AlienSurvival/Assets/Scripts/Rendering/TopDownShadowCaster.cs +++ b/AlienSurvival/Assets/Scripts/Rendering/TopDownShadowCaster.cs @@ -4,10 +4,45 @@ using UnityEngine; [DisallowMultipleComponent] [RequireComponent(typeof(TopDownTransform))] +[RequireComponent(typeof(SpriteRenderer))] public class TopDownShadowCaster : MonoBehaviour { - [SerializeField] private Color m_Color = Color.black; [SerializeField] private Vector2 m_Scale = new Vector2(1, 0.5f); + private GameObject m_Shadow; + private SpriteRenderer m_ShadowRenderer; + + private TopDownTransform m_Coord; + private SpriteRenderer m_SpriteRenderer; + + private void Start() + { + m_Coord = GetComponent<TopDownTransform>(); + m_SpriteRenderer = GetComponent<SpriteRenderer>(); + + if (m_Shadow == null) + { + m_Shadow = new GameObject("shadow"); + m_Shadow.transform.SetParent(transform); + + m_Shadow.transform.localScale = m_Scale; + + m_ShadowRenderer = m_Shadow.AddComponent<SpriteRenderer>(); + m_ShadowRenderer.color = m_Color; + m_ShadowRenderer.sprite = m_SpriteRenderer.sprite; + m_ShadowRenderer.sortingLayerName = "Shadow"; + + } + } + + private void Update() + { + if (m_Shadow == null) + return; + + Vector3 pos = m_Coord.GetGround3DPosition(); + m_Shadow.transform.position = pos; + } + } diff --git a/AlienSurvival/Assets/Test/Scenes/6_PixelCanvas 1.unity b/AlienSurvival/Assets/Test/Scenes/6_PixelCanvas 1.unity index 5f7efd9..e5b731d 100644 --- a/AlienSurvival/Assets/Test/Scenes/6_PixelCanvas 1.unity +++ b/AlienSurvival/Assets/Test/Scenes/6_PixelCanvas 1.unity @@ -8887,7 +8887,7 @@ SpriteRenderer: m_LightmapParameters: {fileID: 0} m_SortingLayerID: 0 m_SortingLayer: 0 - m_SortingOrder: -1071 + m_SortingOrder: -1098 m_Sprite: {fileID: -3685877254663532703, guid: a75b74e89c53fb043902fbe6216cd330, type: 3} m_Color: {r: 1, g: 1, b: 1, a: 1} m_FlipX: 0 @@ -8907,7 +8907,7 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 895402452} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0.0019090377, y: 6.621127, z: 0} + m_LocalPosition: {x: -2.0757914, y: 5.1800003, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_Children: [] m_Father: {fileID: 0} @@ -8925,7 +8925,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 2b1fbd797bf03674e9d1b81edc11e3f1, type: 3} m_Name: m_EditorClassIdentifier: - m_LocalPosition: {x: 0.0019090377, y: 4.7122717, z: 1.9088556} + m_LocalPosition: {x: -2.0757914, y: 3, z: 2.18} m_LocalRotation: 0 m_LocalScale: {x: 0, y: 0} --- !u!114 &895402457 @@ -18508,36 +18508,6 @@ SpriteRenderer: m_WasSpriteAssigned: 1 m_MaskInteraction: 0 m_SpriteSortPoint: 0 ---- !u!1 &2117414729 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 2117414730} - m_Layer: 0 - m_Name: GameObject - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &2117414730 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2117414729} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 1.93, y: 8.76, z: -0.42769396} - m_LocalScale: {x: 1, y: 1, z: 1} - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 28 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &2126951608 GameObject: m_ObjectHideFlags: 0 diff --git a/AlienSurvival/Assets/Tools/EditorGUIHelper/Editor/EditorHandlesHelper.cs b/AlienSurvival/Assets/Tools/EditorGUIHelper/Editor/EditorHandlesHelper.cs index 0585894..fb9fb53 100644 --- a/AlienSurvival/Assets/Tools/EditorGUIHelper/Editor/EditorHandlesHelper.cs +++ b/AlienSurvival/Assets/Tools/EditorGUIHelper/Editor/EditorHandlesHelper.cs @@ -8,13 +8,16 @@ using UnityEditor; // Scene视图中的自定义handles public static class EditorHandlesHelper { - static int s_ValueScaleHandleHash; + static int s_ValueScaleHandleHash; + static int s_PositionArrowHandleHash; // limit value 数据 static float s_StartScale; static float s_ValueDrag; static float s_ScaleDrawLength; + static Vector3 s_LastPosition; + // style static GUIStyle s_StyleBlackLabel; static GUIStyle s_StyleWhiteLabel; @@ -22,9 +25,11 @@ public static class EditorHandlesHelper static EditorHandlesHelper() { - s_ValueScaleHandleHash = "ValueScaleHandleHash".GetHashCode(); + s_ValueScaleHandleHash = "ValueScaleHandle".GetHashCode(); + s_PositionArrowHandleHash = "PositionArrowHandle".GetHashCode(); + - SetupStyles(); + SetupStyles(); } static void SetupStyles() @@ -38,7 +43,14 @@ public static class EditorHandlesHelper #region 单一handle - // 箭头 + /// <summary> + /// 无事件箭头 + /// </summary> + /// <param name="position"></param> + /// <param name="direction"></param> + /// <param name="length"></param> + /// <param name="arrowSize"></param> + /// <param name="dotted"></param> public static void Arrow(Vector3 position, Vector3 direction, float length = 1f, float arrowSize = 0.1f, bool dotted = false) { direction = direction.normalized; @@ -49,8 +61,106 @@ public static class EditorHandlesHelper Handles.ConeHandleCap(0, position + direction * length, Quaternion.LookRotation(direction, Vector3.up), arrowSize, EventType.Repaint); } - // 控制数值的箭头 - public static float ScaleValue(float value, Vector3 position, Vector3 direction, float length, Handles.CapFunction capFunc, Quaternion capRot, float size, float snap = 0) + /// <summary> + /// 处理位置的可拖拽箭头 + /// </summary> + /// <param name="currentValue"></param> + /// <param name="position"></param> + /// <param name="direction"></param> + /// <param name="length"></param> + /// <param name="arrowSize"></param> + /// <param name="dotted"></param> + /// <returns></returns> + public static Vector3 PositionArrow(Vector3 position, Vector3 direction, float length, float arrowSize, bool dotted = false) + { + direction = direction.normalized; + + Vector3 value = Vector3.zero; + Handles.CapFunction capFunc = Handles.ConeHandleCap; + + Quaternion capRot = Quaternion.LookRotation(direction, Vector3.up); + float size = arrowSize; + Vector3 arrowPos = position + direction * length; + + int id = GUIUtility.GetControlID(s_PositionArrowHandleHash, FocusType.Keyboard); + + Event current = Event.current; + switch (current.GetTypeForControl(id)) + { + case EventType.MouseDown: + if ((HandleUtility.nearestControl == id && current.button == 0) || (GUIUtility.keyboardControl == id && current.button == 2)) + { + s_LastPosition = Camera.current.ScreenToWorldPoint(Event.current.mousePosition); + + GUIUtility.keyboardControl = id; + GUIUtility.hotControl = id; + current.Use(); + EditorGUIUtility.SetWantsMouseJumping(1); + } + break; + case EventType.MouseUp: + if (GUIUtility.hotControl == id && (current.button == 0 || current.button == 2)) + { + GUIUtility.keyboardControl = 0; + GUIUtility.hotControl = 0; + current.Use(); + EditorGUIUtility.SetWantsMouseJumping(0); + } + break; + case EventType.MouseDrag: + if (GUIUtility.hotControl == id) + { + Vector3 worldpos = Camera.current.ScreenToWorldPoint(Event.current.mousePosition); + value = worldpos - s_LastPosition; + + s_LastPosition = worldpos; + + GUI.changed = true; + current.Use(); + } + break; + //case EventType.KeyDown: + // if (GUIUtility.hotControl == id && current.keyCode == KeyCode.Escape) + // { + // GUIUtility.hotControl = 0; + // GUI.changed = true; + // current.Use(); + // } + // break; + case EventType.Repaint: + { + Color color = Color.white; + if (id == GUIUtility.keyboardControl) + { + color = Handles.color; + Handles.color = Handles.selectedColor; + } + capFunc(id, arrowPos, capRot, size * 0.15f, EventType.Repaint); + DottedLine(position, arrowPos, 1f, dotted); + if (id == GUIUtility.keyboardControl) + { + Handles.color = color; + } + break; + } + case EventType.Layout: + HandleUtility.AddControl(id, HandleUtility.DistanceToCircle(arrowPos, size * 0.15f)); + break; + } + + return value; + } + + public static void DottedLine(Vector3 p1, Vector3 p2, float length, bool dotted = true) + { + if (!dotted) + Handles.DrawLine(p1, p2); + else + Handles.DrawDottedLine(p1, p2, 1f); + } + + // 控制数值的箭头 + public static float ScaleValue(float value, Vector3 position, Vector3 direction, float length, Handles.CapFunction capFunc, Quaternion capRot, float size, float snap = 0) { Handles.DrawLine(position, position + direction * length); value = ScaleValue(value, position + direction, capRot, size, capFunc, snap); @@ -89,7 +199,8 @@ public static class EditorHandlesHelper if (GUIUtility.hotControl == id) { s_ValueDrag += HandleUtility.niceMouseDelta * 0.01f; - value = (Handles.SnapValue(s_ValueDrag, snap) + 1f) * s_StartScale; + //value = (Handles.SnapValue(s_ValueDrag, snap) + 1f) * s_StartScale; + value = Camera.current.ScreenToWorldPoint(Event.current.mousePosition).x - 1; s_ScaleDrawLength = value / s_StartScale; GUI.changed = true; current.Use(); |