void Start() { // Set text TMP_Text textMesh = GetComponent <TMP_Text>(); textMesh.text = "DETERMINATION"; CharTweener tweener = textMesh.GetCharTweener(); for (int i = 0; i < tweener.CharacterCount; i++) { // Move characters in a circle Tween circleTween = tweener.DOMoveCircle(i, 0.05f, 0.5f) .SetLoops(-1, LoopType.Restart); // Fade character color between yellow and white Tween colorTween = tweener.DOColor(i, Color.yellow, 0.5f) .SetLoops(-1, LoopType.Yoyo); // Offset animations based on character index in string float timeOffset = (float)i / tweener.CharacterCount; circleTween.fullPosition = timeOffset; colorTween.fullPosition = timeOffset; } }
private Sequence BounceIn(TMP_Text text, float distance = 50, int?charsAhead = null) { Sequence textSequence = DOTween.Sequence(); CharTweener tweener = text.GetCharTweener(); int count = charsAhead ?? tweener.CharacterCount; for (int i = 0; i < count; i++) { tweener.SetAlpha(i, 0); tweener.SetLocalEulerAngles(i, Vector3.forward * 45); tweener.SetLocalScale(i, 1); tweener.ResetPosition(i); tweener.UpdateCharProperties(); } for (int i = 0; i < count; i++) { Sequence charSequence = DOTween.Sequence(); charSequence.Insert(0, tweener.DOFade(i, 1, 1)); charSequence.Insert(0, tweener.DOOffsetMoveY(i, distance, 0.25f).SetEase(Ease.OutCubic)); charSequence.Insert(0.25f, tweener.DOOffsetMoveY(i, 0, 0.75f).SetEase(Ease.OutBounce)); charSequence.Insert(0.25f, tweener.DOLocalRotate(i, Vector3.zero, 0.75f).SetEase(Ease.OutBounce)); textSequence.Insert((float)i / count, charSequence); } textSequence.SetTarget(text); return(textSequence); }
public void UpdatePrompt(StoryText text, Action <int> callback, string characterIndex = "") { textMeshPro.gameObject.SetActive(true); button.enabled = true; textMeshPro.text = text.ProcessText(); SetTextSettings(text); if (GameState.Instance.characters.ContainsKey(characterIndex)) { Character target = GameState.Instance.characters[characterIndex]; GetComponent <InfoView>().SetInfo(target); } List <Color> ColorMapping = text.MapColor(attributesLookup); CharTweener _tweener = textMeshPro.GetCharTweener(); var sequence = DOTween.Sequence(); for (var i = 0; i < textMeshPro.text.Length; i++) { _tweener.DOColor(i, ColorMapping[i], 0.1f); } ActivateButton(text.settings, callback); }
public override void ProcessFrame(Playable playable, FrameData info, object playerData) { if (!Application.isPlaying) { return; } if (textMesh == null) { textMesh = playerData as TextMeshProUGUI; charTweener = textMesh.GetCharTweener(); if (!textMesh.gameObject.activeInHierarchy) { return; } } if (!Application.isPlaying) { // PrepareTween(playable); // DOTweenEditorPreview.PrepareTweenForPreview(sequence, true, true, false); // sequence.SetUpdate(UpdateType.Manual); // DOTweenEditorPreview.Start(); // sequence.Goto((float)playable.GetTime()); // DOTween.ManualUpdate(0, 0); return; } Play(playable); }
// CharTweener black magic happens here. private IEnumerator AnimateText() { CharTweener charTweener = text.GetCharTweener(); Tween[] resets = GetResetTweens(charTweener); foreach (KeyValuePair <TextEffect, MatchCollection> pair in effectSubstrings) { foreach (Match match in pair.Value) { for (int i = match.Index; i < (match.Index + match.Length); i++) { resets[i].Kill(); var timeOffset = Mathf.Lerp(0, 1, i / (float)(text.text.Length - 1)); Tween tween = pair.Key.DoEffect(i, charTweener); currentEffects.Add(tween); tween.fullPosition += timeOffset; } } } for (int i = 0; i < text.text.Length; i++) { // Otherwise we'll linger too long on zero width spaces while (i < text.text.Length && text.text[i] == ZERO_WIDTH_SPACE) { i++; } text.maxVisibleCharacters = (i + 1); yield return(null); } }
async void Start() { text = GetComponent <TMP_Text>(); await new WaitUntil(() => text.text.Length > 0); tweener = text.GetCharTweener(); ApplyTweenToLine(BubblyText); }
public void Start() { _tweener = Target.GetCharTweener(); ApplyTweenToLine(0, Tween1); ApplyTweenToLine(1, Tween2); ApplyTweenToLine(2, Tween3); ApplyTweenToLine(3, Tween4); }
private Tween TweenText(string childName, TextTweenOutput output) { TMP_Text textMesh = currentSlide.Find(childName).GetComponent <TMP_Text>(); CharTweener tweener = textMesh.GetCharTweener(); Tween tween = output(textMesh, tweener); tween.SetId(currentSlide); return(tween); }
private void TweenChars(string childName, CharTweenOutput output) { TMP_Text textMesh = currentSlide.Find(childName).GetComponent <TMP_Text>(); CharTweener tweener = textMesh.GetCharTweener(); for (int charIndex = 0; charIndex < tweener.CharacterCount; charIndex++) { Tween tween = output(textMesh, tweener, charIndex); tween.SetId(currentSlide); tween.fullPosition = Mathf.Lerp(0, tween.Duration(includeLoops: false), charIndex / (float)tweener.CharacterCount); } }
// Reset state between runs so we don't have random colors from last call everywhere private Tween[] GetResetTweens(CharTweener charTweener) { Tween[] resets = new Tween[text.text.Length]; for (int i = 0; i < text.text.Length; i++) { resets[i] = DOTween.Sequence() .Append(charTweener.DOColor(i, Color.white, 0)) .Append(charTweener.DOCircle(i, 0, 0)); } return(resets); }
public void SetTextSettings(StoryText text) { textMeshPro.fontStyle = text.settings.strikethrough ? FontStyles.Strikethrough : FontStyles.Normal; CharTweener _tweener = textMeshPro.GetCharTweener(); shakeSequence?.Kill(); shakeSequence = DOTween.Sequence(); for (var i = 0; i < textMeshPro.textInfo.characterCount; i++) { _tweener.DOShakePosition(i, 1, text.settings.shake, 50, 90, false, false) .SetLoops(-1, LoopType.Restart); } }
private Sequence Drift(TMP_Text text, float strength = 2, int?charsAhead = null) { Sequence textSequence = DOTween.Sequence(); CharTweener tweener = text.GetCharTweener(); int count = charsAhead ?? tweener.CharacterCount; for (int i = 0; i < count; i++) { textSequence.Insert(0, tweener.DODriftPosition(i, Vector3.one * strength, Vector3.one * 0.5f, 5)); } textSequence.SetId(driftTweenId); return(textSequence); }
private void Name_OnValueChanged(string value) { if (value.Length > lastNameValue.Length) { CharTweener tweener = NameInput.textComponent.GetCharTweener(); for (int i = lastNameValue.Length; i < value.Length; i++) { tweener.SetLocalScale(i, Vector3.one); NameInput.textComponent.GetCharTweener().DOPunchScale(i, Vector3.up * 0.25f, 0.5f); } } lastNameValue = value; UpdateCharLimitPrompt(); }
private Sequence AnimatePerCharacter(StoryText text, Action <int> callback, string characterIndex = "") { textMeshPro.color = Color.clear; textMeshPro.text = text.ProcessText(); List <Color> ColorMapping = text.MapColor(attributesLookup); CharTweener _tweener = textMeshPro.GetCharTweener(); SetTextSettings(text); SoundEffectProfile textBlip = defaultTextTic; if (characterIndex != "") { textBlip = attributesLookup.GetCharacterAttributes(characterIndex).soundPing; } var sequence = DOTween.Sequence(); for (var i = 0; i < textMeshPro.text.Length; i++) { var timeOffset = Mathf.Lerp(0, 1, i / (float)(textMeshPro.text.Length + 1)); var charSequence = DOTween.Sequence(); if ((i % 2 == 0 && textMeshPro.text.Length < 20) || i % 4 == 0) { charSequence.AppendCallback(() => textBlip?.Play()); } charSequence.Join(_tweener.DOColor(i, ColorMapping[i], 0.01f)) .Join(_tweener.DOScale(i, 0, 0.01f).From()); if (i == textMeshPro.text.Length - 1) { charSequence.AppendInterval(0.1f) .AppendCallback(() => { ActivateButton(text.settings, callback); }); } sequence.Insert(timeOffset * text.settings.speed, charSequence); } return(sequence); }
private Sequence ScaleOut(TMP_Text text, float distance = 100, int?charsAhead = null) { Sequence textSequence = DOTween.Sequence(); CharTweener tweener = text.GetCharTweener(); int count = charsAhead ?? tweener.CharacterCount; for (int i = 0; i < count; i++) { Sequence charSequence = DOTween.Sequence(); charSequence.Insert(0, tweener.DOFade(i, 0, 0.5f).SetEase(Ease.InCubic)); charSequence.Insert(0, tweener.DOScale(i, 0, 0.5f).SetEase(Ease.InBack)); textSequence.Insert((float)i / count * 0.5f, charSequence); } textSequence.SetTarget(text); return(textSequence); }
private void Error(TMP_Text text, int?charsAhead = null) { Sequence textSequence = DOTween.Sequence(); CharTweener tweener = text.GetCharTweener(); DOTween.Kill(tweener, complete: true); int count = charsAhead ?? tweener.CharacterCount; for (int i = 0; i < count; i++) { Sequence charSequence = DOTween.Sequence(); Color oldColor = tweener.GetColor(i); tweener.SetColor(i, Color.red); charSequence.Insert(0, tweener.DOColor(i, oldColor, 0.5f).SetTarget(tweener)); charSequence.Insert(0, tweener.DOShakeRotation(i, 0.5f, Vector3.forward * 25, 20).SetTarget(tweener)); textSequence.Insert((float)i / count * 0.25f, charSequence); } textSequence.SetId(errorId); }
private Sequence AnimatePerWord(StoryText text, Action <int> callback) { textMeshPro.text = text.ProcessText(); List <Color> ColorMapping = text.MapColor(attributesLookup); CharTweener _tweener = textMeshPro.GetCharTweener(); SoundEffectProfile textBlip = defaultTextTic; textMeshPro.color = Color.clear; var sequence = DOTween.Sequence(); sequence.AppendInterval(text.settings.speed); int i = 0; while (i < textMeshPro.text.Length) { int j = i; sequence.AppendCallback(() => textBlip?.Play()); while (j < textMeshPro.text.Length - 1 && textMeshPro.text[j] != ' ') { sequence.Join(_tweener.DOColor(j, ColorMapping[j], 0.01f)) .Join(_tweener.DOScale(j, 0, 0.01f).From()); j++; } sequence.AppendInterval(text.settings.speed); i = j; i++; } sequence.AppendInterval(0.1f) .AppendCallback(() => { ActivateButton(text.settings, callback); }); return(sequence); }
private void Awake() { text = GetComponent <TextMeshProUGUI>(); _tweener = text.GetCharTweener(); }
private void Awake() { text = GetComponent <TMP_Text>(); charTween = text.GetCharTweener(); StartCharacterTween(); }
private void Start() { _tweener = text.GetCharTweener(); PlayString(_index, PlayNextString); }