在制作人物会话时,一般喜欢文笔内容逐字显示,但ngui自带的TypewriterEffect不能满足多次使用要求,然后就自己改了改:
用法:每次给UILabel控件赋值完成后,调用Reset函数。 lab.text = str; effect.Reset(str);
修改后的脚本内容如下:
//----------------------------------------------
// NGUI: Next-Gen UI kit
// Copyright © 2011-2014 Tasharen Entertainment
//----------------------------------------------
using UnityEngine;
/// <summary>
/// Trivial script that fills the label's contents gradually, as if someone was typing.
/// </summary>
[RequireComponent(typeof(UILabel))]
[AddComponentMenu("NGUI/Examples/Typewriter Effect")]
public class TypewriterEffect : MonoBehaviour
{
public int charsPerSecond = 40;
UILabel mLabel;
string mText;
int mOffset = 0;
float mNextChar = 0f;
bool mReset = false;
//void OnEnable() { mReset = true; m_bEndEffect = false; }
bool m_bEndEffect;
public float Reset(string str)
{
if (mReset == false)
{
m_bEndEffect = false;
mReset = true;
Update();
}
if(str.Length > 40)
{
charsPerSecond = str.Length;
return 1;
}
else
{
charsPerSecond = 40;
return str.Length / 40.0f;
}
}
void Update ()
{
if(m_bEndEffect)
{
return;
}
if (mReset)
{
mNextChar = 0;
mOffset = 0;
mReset = false;
mLabel = GetComponent<UILabel>();
mText = mLabel.processedText;
}
if (mText != null)
{
if (mOffset < mText.Length && mNextChar <= RealTime.time)
{
charsPerSecond = Mathf.Max(1, charsPerSecond);
// Periods and end-of-line characters should pause for a longer time.
float delay = 1f / charsPerSecond;
char c = mText[mOffset];
if (c == '.' || c == '\n' || c == '!' || c == '?') delay *= 4f;
// Automatically skip all symbols
NGUIText.ParseSymbol(mText, ref mOffset);
mNextChar = RealTime.time + delay;
mLabel.text = mText.Substring(0, ++mOffset);
}
if (mOffset == mText.Length)
{
m_bEndEffect = true;
}
}
}
}