76 lines
2.9 KiB
C#
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;
|
|
}
|
|
} |