123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- using UnityEngine;
- using UnityEngine.EventSystems;
- using System.Collections;
- namespace TMPro.Examples
- {
- public class TMP_TextSelector_A : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler
- {
- private TextMeshPro m_TextMeshPro;
- private Camera m_Camera;
- private bool m_isHoveringObject;
- private int m_selectedLink = -1;
- private int m_lastCharIndex = -1;
- private int m_lastWordIndex = -1;
- void Awake()
- {
- m_TextMeshPro = gameObject.GetComponent<TextMeshPro>();
- m_Camera = Camera.main;
- // Force generation of the text object so we have valid data to work with. This is needed since LateUpdate() will be called before the text object has a chance to generated when entering play mode.
- m_TextMeshPro.ForceMeshUpdate();
- }
- void LateUpdate()
- {
- m_isHoveringObject = false;
- if (TMP_TextUtilities.IsIntersectingRectTransform(m_TextMeshPro.rectTransform, Input.mousePosition, Camera.main))
- {
- m_isHoveringObject = true;
- }
- if (m_isHoveringObject)
- {
- #region Example of Character Selection
- int charIndex = TMP_TextUtilities.FindIntersectingCharacter(m_TextMeshPro, Input.mousePosition, Camera.main, true);
- if (charIndex != -1 && charIndex != m_lastCharIndex && (Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift)))
- {
- //Debug.Log("[" + m_TextMeshPro.textInfo.characterInfo[charIndex].character + "] has been selected.");
- m_lastCharIndex = charIndex;
- int meshIndex = m_TextMeshPro.textInfo.characterInfo[charIndex].materialReferenceIndex;
- int vertexIndex = m_TextMeshPro.textInfo.characterInfo[charIndex].vertexIndex;
- Color32 c = new Color32((byte)Random.Range(0, 255), (byte)Random.Range(0, 255), (byte)Random.Range(0, 255), 255);
- Color32[] vertexColors = m_TextMeshPro.textInfo.meshInfo[meshIndex].colors32;
- vertexColors[vertexIndex + 0] = c;
- vertexColors[vertexIndex + 1] = c;
- vertexColors[vertexIndex + 2] = c;
- vertexColors[vertexIndex + 3] = c;
- //m_TextMeshPro.mesh.colors32 = vertexColors;
- m_TextMeshPro.textInfo.meshInfo[meshIndex].mesh.colors32 = vertexColors;
- }
- #endregion
- #region Example of Link Handling
- // Check if mouse intersects with any links.
- int linkIndex = TMP_TextUtilities.FindIntersectingLink(m_TextMeshPro, Input.mousePosition, m_Camera);
- // Clear previous link selection if one existed.
- if ((linkIndex == -1 && m_selectedLink != -1) || linkIndex != m_selectedLink)
- {
- //m_TextPopup_RectTransform.gameObject.SetActive(false);
- m_selectedLink = -1;
- }
- // Handle new Link selection.
- if (linkIndex != -1 && linkIndex != m_selectedLink)
- {
- m_selectedLink = linkIndex;
- TMP_LinkInfo linkInfo = m_TextMeshPro.textInfo.linkInfo[linkIndex];
- // The following provides an example of how to access the link properties.
- //Debug.Log("Link ID: \"" + linkInfo.GetLinkID() + "\" Link Text: \"" + linkInfo.GetLinkText() + "\""); // Example of how to retrieve the Link ID and Link Text.
- Vector3 worldPointInRectangle;
- RectTransformUtility.ScreenPointToWorldPointInRectangle(m_TextMeshPro.rectTransform, Input.mousePosition, m_Camera, out worldPointInRectangle);
- switch (linkInfo.GetLinkID())
- {
- case "id_01": // 100041637: // id_01
- //m_TextPopup_RectTransform.position = worldPointInRectangle;
- //m_TextPopup_RectTransform.gameObject.SetActive(true);
- //m_TextPopup_TMPComponent.text = k_LinkText + " ID 01";
- break;
- case "id_02": // 100041638: // id_02
- //m_TextPopup_RectTransform.position = worldPointInRectangle;
- //m_TextPopup_RectTransform.gameObject.SetActive(true);
- //m_TextPopup_TMPComponent.text = k_LinkText + " ID 02";
- break;
- }
- }
- #endregion
- #region Example of Word Selection
- // Check if Mouse intersects any words and if so assign a random color to that word.
- int wordIndex = TMP_TextUtilities.FindIntersectingWord(m_TextMeshPro, Input.mousePosition, Camera.main);
- if (wordIndex != -1 && wordIndex != m_lastWordIndex)
- {
- m_lastWordIndex = wordIndex;
- TMP_WordInfo wInfo = m_TextMeshPro.textInfo.wordInfo[wordIndex];
- Vector3 wordPOS = m_TextMeshPro.transform.TransformPoint(m_TextMeshPro.textInfo.characterInfo[wInfo.firstCharacterIndex].bottomLeft);
- wordPOS = Camera.main.WorldToScreenPoint(wordPOS);
- //Debug.Log("Mouse Position: " + Input.mousePosition.ToString("f3") + " Word Position: " + wordPOS.ToString("f3"));
- Color32[] vertexColors = m_TextMeshPro.textInfo.meshInfo[0].colors32;
- Color32 c = new Color32((byte)Random.Range(0, 255), (byte)Random.Range(0, 255), (byte)Random.Range(0, 255), 255);
- for (int i = 0; i < wInfo.characterCount; i++)
- {
- int vertexIndex = m_TextMeshPro.textInfo.characterInfo[wInfo.firstCharacterIndex + i].vertexIndex;
- vertexColors[vertexIndex + 0] = c;
- vertexColors[vertexIndex + 1] = c;
- vertexColors[vertexIndex + 2] = c;
- vertexColors[vertexIndex + 3] = c;
- }
- m_TextMeshPro.mesh.colors32 = vertexColors;
- }
- #endregion
- }
- }
- public void OnPointerEnter(PointerEventData eventData)
- {
- Debug.Log("OnPointerEnter()");
- m_isHoveringObject = true;
- }
- public void OnPointerExit(PointerEventData eventData)
- {
- Debug.Log("OnPointerExit()");
- m_isHoveringObject = false;
- }
- }
- }
|