NGUI的TypewriterEffect

2 篇文章 0 订阅
1 篇文章 0 订阅

在制作人物会话时,一般喜欢文笔内容逐字显示,但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;
            }
        }      
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值