fixed letter spacing for 5.2.1+ (6 verts per character instead of 4);

added cylindrical text bending

--HG--
branch : letterspacing_fix
release
herbst 2015-12-10 19:01:54 +01:00
parent 0dc0bc4e94
commit 6ebd7de12b
2 changed files with 79 additions and 12 deletions

View File

@ -0,0 +1,59 @@
/// Credit Breyer
/// Sourced from - http://forum.unity3d.com/threads/scripts-useful-4-6-scripts-collection.264161/#post-1777407
namespace UnityEngine.UI.Extensions
{
[RequireComponent(typeof(Text), typeof(RectTransform))]
[AddComponentMenu("UI/Effects/Extensions/Cylinder Text")]
public class CylinderText : BaseMeshEffect
{
public float radius;
private RectTransform rectTrans;
#if UNITY_EDITOR
protected override void OnValidate()
{
base.OnValidate();
if (rectTrans == null)
rectTrans = GetComponent<RectTransform>();
}
#endif
protected override void Awake()
{
base.Awake();
rectTrans = GetComponent<RectTransform>();
OnRectTransformDimensionsChange();
}
protected override void OnEnable()
{
base.OnEnable();
rectTrans = GetComponent<RectTransform>();
OnRectTransformDimensionsChange();
}
public override void ModifyMesh(VertexHelper vh)
{
Vector3 center = transform.position;
int count = vh.currentVertCount;
if (!IsActive() || count == 0)
{
return;
}
for (int index = 0; index < vh.currentVertCount; index++)
{
UIVertex uiVertex = new UIVertex();
vh.PopulateUIVertex(ref uiVertex, index);
// get x position
var x = uiVertex.position.x;
// calculate bend based on pivot and radius
uiVertex.position.z = -radius * Mathf.Cos(x / radius);
uiVertex.position.x = radius * Mathf.Sin(x / radius);
vh.SetUIVertex(uiVertex, index);
}
}
}
}

View File

@ -47,7 +47,7 @@ namespace UnityEngine.UI.Extensions
{ {
[AddComponentMenu("UI/Effects/Extensions/Letter Spacing")] [AddComponentMenu("UI/Effects/Extensions/Letter Spacing")]
///Summary ///Summary
/// Note, LetterSpacing is now non-functional in 5.2.1p+ / 5.3, seems the vertex order has changed? /// Note, Vertex Count has changed in 5.2.1+, is now 6 (two tris) instead of 4 (tri strip).
public class LetterSpacing : BaseMeshEffect public class LetterSpacing : BaseMeshEffect
{ {
[SerializeField] [SerializeField]
@ -122,18 +122,22 @@ namespace UnityEngine.UI.Extensions
for (int charIdx = 0; charIdx < line.Length; charIdx++) for (int charIdx = 0; charIdx < line.Length; charIdx++)
{ {
int idx1 = glyphIdx * 4 + 0; int idx1 = glyphIdx * 6 + 0;
int idx2 = glyphIdx * 4 + 1; int idx2 = glyphIdx * 6 + 1;
int idx3 = glyphIdx * 4 + 2; int idx3 = glyphIdx * 6 + 2;
int idx4 = glyphIdx * 4 + 3; int idx4 = glyphIdx * 6 + 3;
int idx5 = glyphIdx * 6 + 4;
int idx6 = glyphIdx * 6 + 5;
// Check for truncated text (doesn't generate verts for all characters) // Check for truncated text (doesn't generate verts for all characters)
if (idx4 > verts.Count - 1) return; if (idx6 > verts.Count - 1) return;
UIVertex vert1 = verts[idx1]; UIVertex vert1 = verts[idx1];
UIVertex vert2 = verts[idx2]; UIVertex vert2 = verts[idx2];
UIVertex vert3 = verts[idx3]; UIVertex vert3 = verts[idx3];
UIVertex vert4 = verts[idx4]; UIVertex vert4 = verts[idx4];
UIVertex vert5 = verts[idx5];
UIVertex vert6 = verts[idx6];
pos = Vector3.right * (letterOffset * charIdx - lineOffset); pos = Vector3.right * (letterOffset * charIdx - lineOffset);
@ -141,11 +145,15 @@ namespace UnityEngine.UI.Extensions
vert2.position += pos; vert2.position += pos;
vert3.position += pos; vert3.position += pos;
vert4.position += pos; vert4.position += pos;
vert5.position += pos;
vert6.position += pos;
verts[idx1] = vert1; verts[idx1] = vert1;
verts[idx2] = vert2; verts[idx2] = vert2;
verts[idx3] = vert3; verts[idx3] = vert3;
verts[idx4] = vert4; verts[idx4] = vert4;
verts[idx5] = vert5;
verts[idx6] = vert6;
glyphIdx++; glyphIdx++;
} }