diff options
Diffstat (limited to 'AlienSurvival/Assets/Scripts/TopDown')
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: |