popcorn/Scripts/UI/TextWithCaptionSpeedParent.cs

76 lines
2.9 KiB
C#

using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UI;
using System;
public abstract class TextWithCaptionSpeedParent : Text {
public UnityEvent onEndChangingCaption;
public float intervalForCharacterDisplay = 0.05f;
private bool isChangingCaption;
public bool IsChangingCaption{
get{ return isChangingCaption; }
}
private float timeUntilDisplay = 0.0f;
public float TimeUnitlDisplay{
get{ return timeUntilDisplay; }
}
protected string currentText = string.Empty;
protected float timeElapsed = 1;
protected int lastUpdateCharacter = -1;
protected int textLength;
void Update(){
if(isChangingCaption){
int displayCharacterCount = (int)(Mathf.Clamp01((Time.realtimeSinceStartup - timeElapsed) / timeUntilDisplay) * textLength);
if(displayCharacterCount != lastUpdateCharacter){
UpdateText(currentText, displayCharacterCount);
lastUpdateCharacter = displayCharacterCount;
if(displayCharacterCount == currentText.Length){
ImmidiateEnd();
}
}
}
}
protected abstract void UpdateText(string currentText, int displayCharacterCount);
public void BeginChangingCaption(string text, float intervalForCharacterDisplay){
BeginChangingCaption(text, intervalForCharacterDisplay, ActionExtensions.EmptyAction);
}
public void BeginChangingCaption(string text, float intervalForCharacterDisplay, Action callback){
this.intervalForCharacterDisplay = intervalForCharacterDisplay;
BeginChangingCaption(text, callback);
}
public void BeginChangingCaption(float intervalForCharacterDisplay){
BeginChangingCaption(intervalForCharacterDisplay, ActionExtensions.EmptyAction);
}
public void BeginChangingCaption(float intervalForCharacterDisplay, Action callback){
this.intervalForCharacterDisplay = intervalForCharacterDisplay;
BeginChangingCaption(callback);
}
public void BeginChangingCaption(string text){
BeginChangingCaption(text, ActionExtensions.EmptyAction);
}
public void BeginChangingCaption(){
BeginChangingCaption(text, ActionExtensions.EmptyAction);
}
public void BeginChangingCaption(Action callback){
BeginChangingCaption(text, callback);
}
public void BeginChangingCaption(string text, Action callback){
isChangingCaption = true;
currentText = text;
onEndChangingCaption.AddListener(() => callback());
timeUntilDisplay = currentText.Length * intervalForCharacterDisplay;
textLength = currentText.Length;
timeElapsed = Time.realtimeSinceStartup;
lastUpdateCharacter = -1;
}
public void ImmidiateEnd(){
isChangingCaption = false;
onEndChangingCaption.Invoke();
text = currentText;
}
}