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 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(); } } /// /// “投影”,把坐标转换到Transform上 /// 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 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 }