summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2022-04-20 10:50:04 +0800
committerchai <chaifix@163.com>2022-04-20 10:50:04 +0800
commitb18eb9e8b28fc56438760bc7f1823fdeabe979db (patch)
treeb0361b56dc09495d45e7f165971ff70849db4721
parentba49cb4da7cae683585cc34b7adba46429c22af9 (diff)
* topdown transform
-rw-r--r--AlienSurvival/Assets/Scripts/Physics/Editor/TopDownTransformInspector.cs10
-rw-r--r--AlienSurvival/Assets/Scripts/Physics/TopDownTransform.cs9
-rw-r--r--AlienSurvival/Assets/Scripts/Rendering/TopDownShadowCaster.cs37
-rw-r--r--AlienSurvival/Assets/Test/Scenes/6_PixelCanvas 1.unity36
-rw-r--r--AlienSurvival/Assets/Tools/EditorGUIHelper/Editor/EditorHandlesHelper.cs125
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();