You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

371 lines
11 KiB
C#

1 year ago
using UnityEngine;
using UnityEngine.EventSystems;
using System.Collections;
namespace TMPro
{
public enum TextContainerAnchors { TopLeft = 0, Top = 1, TopRight = 2, Left = 3, Middle = 4, Right = 5, BottomLeft = 6, Bottom = 7, BottomRight = 8, Custom = 9 };
[RequireComponent(typeof(RectTransform))]
//[AddComponentMenu("Layout/Text Container")]
public class TextContainer : UIBehaviour
{
#pragma warning disable 0618 // Disabled warning related to deprecated properties. This is for backwards compatibility.
public bool hasChanged
{
get { return m_hasChanged; }
set { m_hasChanged = value; }
}
private bool m_hasChanged;
// Pivot / Transform Position
public Vector2 pivot
{
get { return m_pivot; }
set { /*Debug.Log("Pivot has changed.");*/ if (m_pivot != value) { m_pivot = value; m_anchorPosition = GetAnchorPosition(m_pivot); m_hasChanged = true; OnContainerChanged(); } }
}
[SerializeField]
private Vector2 m_pivot;
public TextContainerAnchors anchorPosition
{
get { return m_anchorPosition; }
set { /*Debug.Log("Anchor has changed.");*/ if (m_anchorPosition != value) { m_anchorPosition = value; m_pivot = GetPivot(m_anchorPosition); m_hasChanged = true; OnContainerChanged(); } }
}
[SerializeField]
private TextContainerAnchors m_anchorPosition = TextContainerAnchors.Middle;
// Rect which defines the Rectangle
public Rect rect
{
get { return m_rect; }
set { /*Debug.Log("Rectangle has changed.");*/ if (m_rect != value) { m_rect = value; /*m_size = new Vector2(m_rect.width, m_rect.height);*/ m_hasChanged = true; OnContainerChanged(); } }
}
[SerializeField]
private Rect m_rect;
public Vector2 size
{
get { return new Vector2(m_rect.width, m_rect.height); }
set { /*Debug.Log("Size has changed.");*/ if (new Vector2(m_rect.width, m_rect.height) != value) { SetRect(value); m_hasChanged = true; m_isDefaultWidth = false; m_isDefaultHeight = false; OnContainerChanged(); } }
}
// Sets the width of the Text Container.
public float width
{
get { return m_rect.width; }
set { /*Debug.Log("Width has changed.");*/ SetRect(new Vector2(value, m_rect.height)); m_hasChanged = true; m_isDefaultWidth = false; OnContainerChanged(); }
}
// Sets the height of the Text Container.
public float height
{
get { return m_rect.height; }
set { SetRect(new Vector2(m_rect.width, value)); m_hasChanged = true; m_isDefaultHeight = false; OnContainerChanged(); }
}
// Used to determine if the user has changed the width of the Text Container.
public bool isDefaultWidth
{
get { return m_isDefaultWidth; }
}
private bool m_isDefaultWidth;
// Used to determine if the user has changed the height of the Text Container.
public bool isDefaultHeight
{
get { return m_isDefaultHeight; }
}
private bool m_isDefaultHeight;
public bool isAutoFitting
{
get { return m_isAutoFitting; }
set { m_isAutoFitting = value; }
}
private bool m_isAutoFitting = false;
// Corners of the Text Container
public Vector3[] corners
{
get { return m_corners; }
}
private Vector3[] m_corners = new Vector3[4];
public Vector3[] worldCorners
{
get { return m_worldCorners; }
}
private Vector3[] m_worldCorners = new Vector3[4];
//public Vector3 normal
//{
// get { return m_normal; }
//}
//private Vector3 m_normal;
// The margin offset from the Rectangle Bounds
public Vector4 margins
{
get { return m_margins; }
set { if (m_margins != value) { /*Debug.Log("Margins have changed.");*/ m_margins = value; m_hasChanged = true; OnContainerChanged(); } }
}
[SerializeField]
private Vector4 m_margins;
/// <summary>
/// The RectTransform used by the object
/// </summary>
public RectTransform rectTransform
{
get
{
if (m_rectTransform == null) m_rectTransform = GetComponent<RectTransform>();
return m_rectTransform;
}
}
private RectTransform m_rectTransform;
//private Transform m_transform;
//private bool m_isAddingRectTransform;
private static Vector2 k_defaultSize = new Vector2(100, 100);
/// <summary>
///
/// </summary>
public TextMeshPro textMeshPro
{
get
{
if (m_textMeshPro == null) m_textMeshPro = GetComponent<TextMeshPro>();
return m_textMeshPro;
}
}
private TextMeshPro m_textMeshPro;
protected override void Awake()
{
Debug.LogWarning("The Text Container component is now Obsolete and can safely be removed from [" + gameObject.name + "].", this);
return;
}
/// <summary>
///
/// </summary>
protected override void OnEnable()
{
//Debug.Log("Text Container OnEnable() called.");
OnContainerChanged();
}
/// <summary>
///
/// </summary>
protected override void OnDisable()
{
//Debug.Log("OnDisable() called.");
}
/// <summary>
///
/// </summary>
void OnContainerChanged()
{
//Debug.Log("OnContainerChanged");
UpdateCorners();
//UpdateWorldCorners();
if (this.m_rectTransform != null)
{
m_rectTransform.sizeDelta = this.size;
m_rectTransform.hasChanged = true;
}
if (this.textMeshPro != null)
{
m_textMeshPro.SetVerticesDirty();
m_textMeshPro.margin = m_margins;
}
}
#if UNITY_EDITOR
/// <summary>
///
/// </summary>
protected override void OnValidate()
{
//Debug.Log("OnValidate() called.");
m_hasChanged = true;
OnContainerChanged();
}
#endif
/*
void LateUpdate()
{
// Used by the Run Time Text Input Component ... This will have to be changed.
if (m_transform.hasChanged)
UpdateWorldCorners();
}
*/
/// <summary>
/// Callback from Unity to handle RectTransform changes.
/// </summary>
protected override void OnRectTransformDimensionsChange()
{
// Required to add a RectTransform to objects created in previous releases.
if (this.rectTransform == null) m_rectTransform = gameObject.AddComponent<RectTransform>();
if (m_rectTransform.sizeDelta != k_defaultSize)
this.size = m_rectTransform.sizeDelta;
pivot = m_rectTransform.pivot;
m_hasChanged = true;
OnContainerChanged();
}
private void SetRect(Vector2 size)
{
m_rect = new Rect(m_rect.x, m_rect.y, size.x, size.y);
//UpdateCorners();
}
private void UpdateCorners()
{
m_corners[0] = new Vector3(-m_pivot.x * m_rect.width, (- m_pivot.y) * m_rect.height);
m_corners[1] = new Vector3(-m_pivot.x * m_rect.width, (1 - m_pivot.y) * m_rect.height);
m_corners[2] = new Vector3((1 - m_pivot.x) * m_rect.width, (1 - m_pivot.y) * m_rect.height);
m_corners[3] = new Vector3((1 - m_pivot.x) * m_rect.width, (- m_pivot.y) * m_rect.height);
//Debug.Log("Pivot " + m_pivot + " Corners 0: " + m_corners[0] + " 1: " + m_corners[1] + " 2: " + m_corners[2] + " 3: " + m_corners[3]);
if (m_rectTransform != null)
m_rectTransform.pivot = m_pivot;
}
//private void UpdateWorldCorners()
//{
// if (m_transform == null)
// return;
// Vector3 position = m_transform.position;
// m_worldCorners[0] = position + m_transform.TransformDirection(m_corners[0]);
// m_worldCorners[1] = position + m_transform.TransformDirection(m_corners[1]);
// m_worldCorners[2] = position + m_transform.TransformDirection(m_corners[2]);
// m_worldCorners[3] = position + m_transform.TransformDirection(m_corners[3]);
// m_normal = Vector3.Cross(worldCorners[1] - worldCorners[0], worldCorners[3] - worldCorners[0]);
//}
//public Vector3[] GetWorldCorners()
//{
// UpdateWorldCorners();
// return m_worldCorners;
//}
Vector2 GetPivot(TextContainerAnchors anchor)
{
Vector2 pivot = Vector2.zero;
switch (anchor)
{
case TextContainerAnchors.TopLeft:
pivot = new Vector2(0, 1);
break;
case TextContainerAnchors.Top:
pivot = new Vector2(0.5f, 1);
break;
case TextContainerAnchors.TopRight:
pivot = new Vector2(1, 1);
break;
case TextContainerAnchors.Left:
pivot = new Vector2(0, 0.5f);
break;
case TextContainerAnchors.Middle:
pivot = new Vector2(0.5f, 0.5f);
break;
case TextContainerAnchors.Right:
pivot = new Vector2(1, 0.5f);
break;
case TextContainerAnchors.BottomLeft:
pivot = new Vector2(0, 0);
break;
case TextContainerAnchors.Bottom:
pivot = new Vector2(0.5f, 0);
break;
case TextContainerAnchors.BottomRight:
pivot = new Vector2(1, 0);
break;
}
return pivot;
}
// Method which returns the Anchor position based on pivot value.
TextContainerAnchors GetAnchorPosition(Vector2 pivot)
{
if (pivot == new Vector2(0, 1))
return TextContainerAnchors.TopLeft;
else if (pivot == new Vector2(0.5f, 1))
return TextContainerAnchors.Top;
else if (pivot == new Vector2(1f, 1))
return TextContainerAnchors.TopRight;
else if (pivot == new Vector2(0, 0.5f))
return TextContainerAnchors.Left;
else if (pivot == new Vector2(0.5f, 0.5f))
return TextContainerAnchors.Middle;
else if (pivot == new Vector2(1, 0.5f))
return TextContainerAnchors.Right;
else if (pivot == new Vector2(0, 0))
return TextContainerAnchors.BottomLeft;
else if (pivot == new Vector2(0.5f, 0))
return TextContainerAnchors.Bottom;
else if (pivot == new Vector2(1, 0))
return TextContainerAnchors.BottomRight;
else
return TextContainerAnchors.Custom;
}
}
}