using System.Collections; using System.Collections.Generic; using UnityEngine; #if UNITY_EDITOR using UnityEditor; #endif /// /// 用于TopDown的Transform,支持模拟垂直高度 /// [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; Project(); } } 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 { z = value; } } // 地表坐标(Topdown空间) public Vector3 positionOnGround { set { Vector3 pos = position; pos.x = value.x; pos.y = value.y; position = pos; Project(); } get { Vector3 pos = position; pos.z = 0; return pos; } } /// /// “投影”,把坐标转换到Transform上 /// public void Project() { Vector3 pos = transform.localPosition; pos.x = m_LocalPosition.x; pos.y = m_LocalPosition.y + m_LocalPosition.z; transform.localPosition = pos; } private void Start() { SpriteRenderer sr = GetComponent(); if (sr) { gameObject.AddOrGetComponent(); gameObject.AddOrGetComponent(); } } private void Update() { Project(); } #region 转换到3D笛卡尔空间 public Vector3 Get3DPosition() { Vector3 pos = new Vector3(); pos.x = m_LocalPosition.x; pos.y = m_LocalPosition.y + m_LocalPosition.z; pos.z = transform.localPosition.z; return pos; } /// /// 注意是在3D空间下 /// /// public Vector3 GetGround3DPosition() { Vector3 pos = new Vector3(); pos.x = m_LocalPosition.x; pos.y = m_LocalPosition.y ; pos.z = transform.localPosition.z; return pos; } #endregion #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 }