|
|
|
|
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;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|