using UnityEngine; using System.Collections; namespace TMPro.Examples { public class TextMeshProFloatingText : MonoBehaviour { public Font TheFont; private GameObject m_floatingText; private TextMeshPro m_textMeshPro; private TextMesh m_textMesh; private Transform m_transform; private Transform m_floatingText_Transform; private Transform m_cameraTransform; Vector3 lastPOS = Vector3.zero; Quaternion lastRotation = Quaternion.identity; public int SpawnType; //private int m_frame = 0; void Awake() { m_transform = transform; m_floatingText = new GameObject(this.name + " floating text"); // Reference to Transform is lost when TMP component is added since it replaces it by a RectTransform. //m_floatingText_Transform = m_floatingText.transform; //m_floatingText_Transform.position = m_transform.position + new Vector3(0, 15f, 0); m_cameraTransform = Camera.main.transform; } void Start() { if (SpawnType == 0) { // TextMesh Pro Implementation m_textMeshPro = m_floatingText.AddComponent(); m_textMeshPro.rectTransform.sizeDelta = new Vector2(3, 3); m_floatingText_Transform = m_floatingText.transform; m_floatingText_Transform.position = m_transform.position + new Vector3(0, 15f, 0); //m_textMeshPro.fontAsset = Resources.Load("Fonts & Materials/JOKERMAN SDF", typeof(TextMeshProFont)) as TextMeshProFont; // User should only provide a string to the resource. //m_textMeshPro.fontSharedMaterial = Resources.Load("Fonts & Materials/LiberationSans SDF", typeof(Material)) as Material; m_textMeshPro.alignment = TextAlignmentOptions.Center; m_textMeshPro.color = new Color32((byte)Random.Range(0, 255), (byte)Random.Range(0, 255), (byte)Random.Range(0, 255), 255); m_textMeshPro.fontSize = 24; //m_textMeshPro.enableExtraPadding = true; //m_textMeshPro.enableShadows = false; m_textMeshPro.enableKerning = false; m_textMeshPro.text = string.Empty; StartCoroutine(DisplayTextMeshProFloatingText()); } else if (SpawnType == 1) { //Debug.Log("Spawning TextMesh Objects."); m_floatingText_Transform = m_floatingText.transform; m_floatingText_Transform.position = m_transform.position + new Vector3(0, 15f, 0); m_textMesh = m_floatingText.AddComponent(); m_textMesh.font = Resources.Load("Fonts/ARIAL"); m_textMesh.GetComponent().sharedMaterial = m_textMesh.font.material; m_textMesh.color = new Color32((byte)Random.Range(0, 255), (byte)Random.Range(0, 255), (byte)Random.Range(0, 255), 255); m_textMesh.anchor = TextAnchor.LowerCenter; m_textMesh.fontSize = 24; StartCoroutine(DisplayTextMeshFloatingText()); } else if (SpawnType == 2) { } } //void Update() //{ // if (SpawnType == 0) // { // m_textMeshPro.SetText("{0}", m_frame); // } // else // { // m_textMesh.text = m_frame.ToString(); // } // m_frame = (m_frame + 1) % 1000; //} public IEnumerator DisplayTextMeshProFloatingText() { float CountDuration = 2.0f; // How long is the countdown alive. float starting_Count = Random.Range(5f, 20f); // At what number is the counter starting at. float current_Count = starting_Count; Vector3 start_pos = m_floatingText_Transform.position; Color32 start_color = m_textMeshPro.color; float alpha = 255; int int_counter = 0; float fadeDuration = 3 / starting_Count * CountDuration; while (current_Count > 0) { current_Count -= (Time.deltaTime / CountDuration) * starting_Count; if (current_Count <= 3) { //Debug.Log("Fading Counter ... " + current_Count.ToString("f2")); alpha = Mathf.Clamp(alpha - (Time.deltaTime / fadeDuration) * 255, 0, 255); } int_counter = (int)current_Count; m_textMeshPro.text = int_counter.ToString(); //m_textMeshPro.SetText("{0}", (int)current_Count); m_textMeshPro.color = new Color32(start_color.r, start_color.g, start_color.b, (byte)alpha); // Move the floating text upward each update m_floatingText_Transform.position += new Vector3(0, starting_Count * Time.deltaTime, 0); // Align floating text perpendicular to Camera. if (!lastPOS.Compare(m_cameraTransform.position, 1000) || !lastRotation.Compare(m_cameraTransform.rotation, 1000)) { lastPOS = m_cameraTransform.position; lastRotation = m_cameraTransform.rotation; m_floatingText_Transform.rotation = lastRotation; Vector3 dir = m_transform.position - lastPOS; m_transform.forward = new Vector3(dir.x, 0, dir.z); } yield return new WaitForEndOfFrame(); } //Debug.Log("Done Counting down."); yield return new WaitForSeconds(Random.Range(0.1f, 1.0f)); m_floatingText_Transform.position = start_pos; StartCoroutine(DisplayTextMeshProFloatingText()); } public IEnumerator DisplayTextMeshFloatingText() { float CountDuration = 2.0f; // How long is the countdown alive. float starting_Count = Random.Range(5f, 20f); // At what number is the counter starting at. float current_Count = starting_Count; Vector3 start_pos = m_floatingText_Transform.position; Color32 start_color = m_textMesh.color; float alpha = 255; int int_counter = 0; float fadeDuration = 3 / starting_Count * CountDuration; while (current_Count > 0) { current_Count -= (Time.deltaTime / CountDuration) * starting_Count; if (current_Count <= 3) { //Debug.Log("Fading Counter ... " + current_Count.ToString("f2")); alpha = Mathf.Clamp(alpha - (Time.deltaTime / fadeDuration) * 255, 0, 255); } int_counter = (int)current_Count; m_textMesh.text = int_counter.ToString(); //Debug.Log("Current Count:" + current_Count.ToString("f2")); m_textMesh.color = new Color32(start_color.r, start_color.g, start_color.b, (byte)alpha); // Move the floating text upward each update m_floatingText_Transform.position += new Vector3(0, starting_Count * Time.deltaTime, 0); // Align floating text perpendicular to Camera. if (!lastPOS.Compare(m_cameraTransform.position, 1000) || !lastRotation.Compare(m_cameraTransform.rotation, 1000)) { lastPOS = m_cameraTransform.position; lastRotation = m_cameraTransform.rotation; m_floatingText_Transform.rotation = lastRotation; Vector3 dir = m_transform.position - lastPOS; m_transform.forward = new Vector3(dir.x, 0, dir.z); } yield return new WaitForEndOfFrame(); } //Debug.Log("Done Counting down."); yield return new WaitForSeconds(Random.Range(0.1f, 1.0f)); m_floatingText_Transform.position = start_pos; StartCoroutine(DisplayTextMeshFloatingText()); } } }