summaryrefslogtreecommitdiff
path: root/AlienSurvival/Assets/Scripts/TopDown
diff options
context:
space:
mode:
Diffstat (limited to 'AlienSurvival/Assets/Scripts/TopDown')
-rw-r--r--AlienSurvival/Assets/Scripts/TopDown/Editor.meta8
-rw-r--r--AlienSurvival/Assets/Scripts/TopDown/Editor/TopDownTransformInspector.cs50
-rw-r--r--AlienSurvival/Assets/Scripts/TopDown/Editor/TopDownTransformInspector.cs.meta11
-rw-r--r--AlienSurvival/Assets/Scripts/TopDown/TopDownShadowCaster.cs57
-rw-r--r--AlienSurvival/Assets/Scripts/TopDown/TopDownShadowCaster.cs.meta11
-rw-r--r--AlienSurvival/Assets/Scripts/TopDown/TopDownSorting.cs25
-rw-r--r--AlienSurvival/Assets/Scripts/TopDown/TopDownSorting.cs.meta11
-rw-r--r--AlienSurvival/Assets/Scripts/TopDown/TopDownTransform.cs150
-rw-r--r--AlienSurvival/Assets/Scripts/TopDown/TopDownTransform.cs.meta11
9 files changed, 334 insertions, 0 deletions
diff --git a/AlienSurvival/Assets/Scripts/TopDown/Editor.meta b/AlienSurvival/Assets/Scripts/TopDown/Editor.meta
new file mode 100644
index 0000000..fa70114
--- /dev/null
+++ b/AlienSurvival/Assets/Scripts/TopDown/Editor.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 80c8d9ba082ca27419e9d6e6bbb39f6d
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/AlienSurvival/Assets/Scripts/TopDown/Editor/TopDownTransformInspector.cs b/AlienSurvival/Assets/Scripts/TopDown/Editor/TopDownTransformInspector.cs
new file mode 100644
index 0000000..b1ceaab
--- /dev/null
+++ b/AlienSurvival/Assets/Scripts/TopDown/Editor/TopDownTransformInspector.cs
@@ -0,0 +1,50 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEditor;
+
+
+[CustomEditor(typeof(TopDownTransform))]
+public class TopDownTransformInspector : Editor
+{
+
+ TopDownTransform m_TopDownTransform;
+
+ private void OnEnable()
+ {
+ m_TopDownTransform = target as TopDownTransform;
+ }
+
+ private void OnDisable()
+ {
+ }
+
+ public override void OnInspectorGUI()
+ {
+ base.OnInspectorGUI();
+ }
+
+ protected override void OnHeaderGUI()
+ {
+ base.OnHeaderGUI();
+ }
+
+ //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.PositionArrow(pos3d, Vector3.right, 1f, arrowSize).x;
+
+ Handles.color = Handles.yAxisColor;
+ m_TopDownTransform.y -= EditorHandlesHelper.PositionArrow(pos3d, Vector3.up, 1f, arrowSize).y;
+
+ Handles.color = Handles.zAxisColor;
+ m_TopDownTransform.z -= EditorHandlesHelper.PositionArrow(pos3d + new Vector3(0, -m_TopDownTransform.z - 0.1f, 0), Vector3.up, m_TopDownTransform.z, arrowSize, true).y;
+
+ }
+
+} \ No newline at end of file
diff --git a/AlienSurvival/Assets/Scripts/TopDown/Editor/TopDownTransformInspector.cs.meta b/AlienSurvival/Assets/Scripts/TopDown/Editor/TopDownTransformInspector.cs.meta
new file mode 100644
index 0000000..09d9899
--- /dev/null
+++ b/AlienSurvival/Assets/Scripts/TopDown/Editor/TopDownTransformInspector.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: a1871ab3b887e6b41ba4a43777b53192
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/AlienSurvival/Assets/Scripts/TopDown/TopDownShadowCaster.cs b/AlienSurvival/Assets/Scripts/TopDown/TopDownShadowCaster.cs
new file mode 100644
index 0000000..e027771
--- /dev/null
+++ b/AlienSurvival/Assets/Scripts/TopDown/TopDownShadowCaster.cs
@@ -0,0 +1,57 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+[ExecuteInEditMode, DisallowMultipleComponent]
+[RequireComponent(typeof(TopDownTransform))]
+[RequireComponent(typeof(SpriteRenderer))]
+public class TopDownShadowCaster : MonoBehaviour
+{
+ [SerializeField] private Color m_Color = new Color32(0,0,0, 58);
+ [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;
+
+ public void Flip(bool flip)
+ {
+ m_ShadowRenderer.flipX = flip;
+ }
+
+ private void Start()
+ {
+ m_Coord = GetComponent<TopDownTransform>();
+ m_SpriteRenderer = GetComponent<SpriteRenderer>();
+
+ if (m_Shadow == null)
+ {
+ m_Shadow = new GameObject("shadow");
+ m_Shadow.hideFlags = HideFlags.HideAndDontSave;
+ 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;
+
+ m_ShadowRenderer.color = m_Color;
+ m_ShadowRenderer.sprite = m_SpriteRenderer.sprite;
+
+ Vector3 pos = m_Coord.GetGround3DPosition();
+ m_Shadow.transform.position = pos;
+ }
+
+}
diff --git a/AlienSurvival/Assets/Scripts/TopDown/TopDownShadowCaster.cs.meta b/AlienSurvival/Assets/Scripts/TopDown/TopDownShadowCaster.cs.meta
new file mode 100644
index 0000000..f81ad1b
--- /dev/null
+++ b/AlienSurvival/Assets/Scripts/TopDown/TopDownShadowCaster.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: f1ce201566412034c99687a8c5b94075
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/AlienSurvival/Assets/Scripts/TopDown/TopDownSorting.cs b/AlienSurvival/Assets/Scripts/TopDown/TopDownSorting.cs
new file mode 100644
index 0000000..d7ce933
--- /dev/null
+++ b/AlienSurvival/Assets/Scripts/TopDown/TopDownSorting.cs
@@ -0,0 +1,25 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+[DisallowMultipleComponent]
+[RequireComponent(typeof(SpriteRenderer))]
+[RequireComponent(typeof(TopDownTransform))]
+public class TopDownSorting : MonoBehaviour
+{
+ private SpriteRenderer m_SpriteRenderer;
+ private TopDownTransform m_Coord;
+
+ private void Start()
+ {
+ m_SpriteRenderer = GetComponent<SpriteRenderer>();
+ m_Coord = GetComponent<TopDownTransform>();
+ }
+
+ private void Update()
+ {
+ // 根据y设置sortOrder
+ m_SpriteRenderer.sortingOrder = (int)(-m_Coord.y * 100);
+ }
+
+}
diff --git a/AlienSurvival/Assets/Scripts/TopDown/TopDownSorting.cs.meta b/AlienSurvival/Assets/Scripts/TopDown/TopDownSorting.cs.meta
new file mode 100644
index 0000000..fa499d2
--- /dev/null
+++ b/AlienSurvival/Assets/Scripts/TopDown/TopDownSorting.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 7a9f0293bd6e86e43bbbefc99b5e2722
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/AlienSurvival/Assets/Scripts/TopDown/TopDownTransform.cs b/AlienSurvival/Assets/Scripts/TopDown/TopDownTransform.cs
new file mode 100644
index 0000000..7e4c261
--- /dev/null
+++ b/AlienSurvival/Assets/Scripts/TopDown/TopDownTransform.cs
@@ -0,0 +1,150 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+#if UNITY_EDITOR
+using UnityEditor;
+#endif
+
+/// <summary>
+/// 用于TopDown的Transform,支持模拟垂直高度
+/// </summary>
+[ExecuteInEditMode]
+[RequireComponent(typeof(Transform))]
+public class TopDownTransform : MonoBehaviour
+{
+ // 右手系
+ // z
+ // |
+ // | /y
+ // | /
+ // |/______x
+
+ // x, y, z ( z = height)
+ [SerializeField] private Vector3 m_LocalPosition;
+
+ // 只能绕一个虚拟轴旋转
+ [SerializeField] private float m_LocalRotation;
+
+ // x, z
+ [SerializeField] private Vector2 m_LocalScale;
+
+ public Vector3 position
+ {
+ get
+ {
+ return m_LocalPosition;
+ }
+ set
+ {
+ m_LocalPosition = value;
+ }
+ }
+
+ public float x
+ {
+ get
+ {
+ return m_LocalPosition.x;
+ }
+ set
+ {
+ m_LocalPosition.x = value;
+ Project();
+ }
+ }
+ public float y
+ {
+ get
+ {
+ return m_LocalPosition.y;
+ }
+ set
+ {
+ m_LocalPosition.y = value;
+ Project();
+ }
+ }
+
+ public float z
+ {
+ get
+ {
+ return m_LocalPosition.z;
+ }
+ set
+ {
+ m_LocalPosition.z = value;
+ Project();
+ }
+ }
+ public float height
+ {
+ get
+ {
+ return z;
+ }
+ set
+ {
+ m_LocalPosition.z = value;
+ Project();
+ }
+ }
+
+ /// <summary>
+ /// “投影”,把坐标转换到Transform上
+ /// </summary>
+ public void Project()
+ {
+ Vector3 pos = transform.position;
+ pos.x = m_LocalPosition.x;
+ pos.y = m_LocalPosition.y + m_LocalPosition.z;
+
+ transform.position = pos;
+ }
+
+ private void Start()
+ {
+ SpriteRenderer sr = GetComponent<SpriteRenderer>();
+ if (sr)
+ {
+ gameObject.AddOrGetComponent<TopDownSorting>();
+ gameObject.AddOrGetComponent<TopDownShadowCaster>();
+ }
+ }
+
+ private void Update()
+ {
+ Project();
+ }
+
+ public Vector3 Get3DPosition()
+ {
+ Vector3 pos = new Vector3();
+ pos.x = m_LocalPosition.x;
+ pos.y = m_LocalPosition.y + m_LocalPosition.z;
+ pos.z = transform.position.z;
+ 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()
+ {
+ // dash line
+ Vector3 start = transform.position;
+ Vector3 end = start - new Vector3(0, m_LocalPosition.z, 0);
+
+ Handles.DrawDottedLine(start, end, 1f);
+ Handles.DrawWireCube(end, new Vector3(0.1f, 0.1f, 0f));
+ }
+#endif
+
+} \ No newline at end of file
diff --git a/AlienSurvival/Assets/Scripts/TopDown/TopDownTransform.cs.meta b/AlienSurvival/Assets/Scripts/TopDown/TopDownTransform.cs.meta
new file mode 100644
index 0000000..cc1445d
--- /dev/null
+++ b/AlienSurvival/Assets/Scripts/TopDown/TopDownTransform.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 2b1fbd797bf03674e9d1b81edc11e3f1
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {fileID: 2800000, guid: b7cb09ba3d43de2418ea93e3aa9cd4e4, type: 3}
+ userData:
+ assetBundleName:
+ assetBundleVariant: