using System; using TMPro; using UnityEngine; public class WorldSpaceText : MonoBehaviour { public Vector3 moveSpeed = new Vector3(0.25f, 0.75f, 0); public float oscillationsPerSecond = 1.0f; public float timeToFade = 1f; public float startToFade = 1f; private float timeElapsed = 0f; public bool randomStartingPoint = false; private float randomStartingPointX = 0f; private float randomStartingPointY = 0f; private Vector3 startingPosition; private TextMeshProUGUI textMeshPro; private void Awake() { textMeshPro = GetComponent(); startingPosition = transform.position; // Add random starting position for text if (randomStartingPoint) { randomStartingPointX = UnityEngine.Random.value - 0.5f; randomStartingPointY = UnityEngine.Random.value * 0.15f; } transform.position = new Vector3(transform.position.x, transform.position.y + randomStartingPointY, transform.position.z); // Ensure text faces camera transform.rotation = Camera.main.transform.rotation; } private void Update() { timeElapsed += Time.deltaTime; float deltaTime = Time.deltaTime; // Always face camera transform.rotation = Camera.main.transform.rotation; if (timeElapsed >= startToFade) { // Start fading when "startToFade" time is reached textMeshPro.alpha = (1 - ((timeElapsed - startToFade) / timeToFade)); if (timeElapsed >= (startToFade + timeToFade)) { Destroy(gameObject); } } // Calculate oscillation phase float phase = ((randomStartingPointX + timeElapsed) * oscillationsPerSecond * (2f * Mathf.PI)); // Set new position of object (using world space values) transform.position = new Vector3( startingPosition.x + (Mathf.Sin(phase) * moveSpeed.x), transform.position.y + (moveSpeed.y * deltaTime), transform.position.z + (moveSpeed.z * deltaTime)); } }