From 9e786f6aa623aa7d9bf69ccfe6037d83bb181637 Mon Sep 17 00:00:00 2001 From: herbst Date: Wed, 22 Mar 2017 12:56:21 +0100 Subject: [PATCH] added monospacing script and added TextEffects example scene --- Examples/TextEffects.meta | 9 + Examples/TextEffects/TextEffects.unity | Bin 0 -> 36328 bytes Examples/TextEffects/TextEffects.unity.meta | 8 + Scripts/Effects/MonoSpacing.cs | 180 ++++++++++++++++++++ Scripts/Effects/MonoSpacing.cs.meta | 12 ++ 5 files changed, 209 insertions(+) create mode 100644 Examples/TextEffects.meta create mode 100644 Examples/TextEffects/TextEffects.unity create mode 100644 Examples/TextEffects/TextEffects.unity.meta create mode 100644 Scripts/Effects/MonoSpacing.cs create mode 100644 Scripts/Effects/MonoSpacing.cs.meta diff --git a/Examples/TextEffects.meta b/Examples/TextEffects.meta new file mode 100644 index 0000000..af0e258 --- /dev/null +++ b/Examples/TextEffects.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: afd482c1b3a787a47be2acc874c4fc44 +folderAsset: yes +timeCreated: 1490183285 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Examples/TextEffects/TextEffects.unity b/Examples/TextEffects/TextEffects.unity new file mode 100644 index 0000000000000000000000000000000000000000..678592152b4d7c92a865f8e342cbdbebbb23d320 GIT binary patch literal 36328 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 verts = new List(); + vh.GetUIVertexStream(verts); + + Text text = GetComponent(); + if (text == null) + { + Debug.LogWarning("LetterSpacing: Missing Text component"); + return; + } + + string[] lines = text.text.Split('\n'); + // Vector3 pos; + float letterOffset = spacing * (float)text.fontSize / 100f; + float alignmentFactor = 0; + int glyphIdx = 0; + + switch (text.alignment) + { + case TextAnchor.LowerLeft: + case TextAnchor.MiddleLeft: + case TextAnchor.UpperLeft: + alignmentFactor = 0f; + break; + + case TextAnchor.LowerCenter: + case TextAnchor.MiddleCenter: + case TextAnchor.UpperCenter: + alignmentFactor = 0.5f; + break; + + case TextAnchor.LowerRight: + case TextAnchor.MiddleRight: + case TextAnchor.UpperRight: + alignmentFactor = 1f; + break; + } + + for (int lineIdx=0; lineIdx < lines.Length; lineIdx++) + { + string line = lines[lineIdx]; + float lineOffset = (line.Length -1) * letterOffset * alignmentFactor; + + var offsetX = - lineOffset + letterOffset / 2; + for (int charIdx = 0; charIdx < line.Length; charIdx++) + { + int idx1 = glyphIdx * 6 + 0; + int idx2 = glyphIdx * 6 + 1; + int idx3 = glyphIdx * 6 + 2; + 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) + if (idx6 > verts.Count - 1) return; + + UIVertex vert1 = verts[idx1]; + UIVertex vert2 = verts[idx2]; + UIVertex vert3 = verts[idx3]; + UIVertex vert4 = verts[idx4]; + UIVertex vert5 = verts[idx5]; + UIVertex vert6 = verts[idx6]; + + // pos = Vector3.right * (letterOffset * (charIdx) - lineOffset); + float charWidth = (vert2.position - vert1.position).x; + var smallChar = charWidth < halfCharWidth; + + var smallCharOffset = smallChar ? -letterOffset/4 : 0; + + vert1.position += new Vector3(-vert1.position.x + offsetX + -.5f * charWidth + smallCharOffset, 0, 0); + vert2.position += new Vector3(-vert2.position.x + offsetX + .5f * charWidth + smallCharOffset, 0, 0); + vert3.position += new Vector3(-vert3.position.x + offsetX + .5f * charWidth + smallCharOffset, 0, 0); + vert4.position += new Vector3(-vert4.position.x + offsetX + .5f * charWidth + smallCharOffset, 0, 0); + vert5.position += new Vector3(-vert5.position.x + offsetX + -.5f * charWidth + smallCharOffset, 0, 0); + vert6.position += new Vector3(-vert6.position.x + offsetX + -.5f * charWidth + smallCharOffset, 0, 0); + + if (smallChar) + offsetX += letterOffset / 2; + else + offsetX += letterOffset; + + verts[idx1] = vert1; + verts[idx2] = vert2; + verts[idx3] = vert3; + verts[idx4] = vert4; + verts[idx5] = vert5; + verts[idx6] = vert6; + + glyphIdx++; + } + + // Offset for carriage return character that still generates verts + glyphIdx++; + } + vh.Clear(); + vh.AddUIVertexTriangleStream(verts); + } + } +} diff --git a/Scripts/Effects/MonoSpacing.cs.meta b/Scripts/Effects/MonoSpacing.cs.meta new file mode 100644 index 0000000..775d928 --- /dev/null +++ b/Scripts/Effects/MonoSpacing.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 97a58789aa01843488ef44dc747ee8e8 +timeCreated: 1490183235 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: