示例#1
0
        void Update()
        {
            if (!mActive)
            {
                return;
            }

            if (mReset)
            {
                mCurrentOffset = 0;
                mReset         = false;
                mLabel         = GetComponent <Text>();
                mFullText      = mLabel.text;
                mFade.Clear();
            }

            while (mCurrentOffset < mFullText.Length && mNextChar <= Time.unscaledTime)
            {
                int lastOffset = mCurrentOffset;
                charsPerSecond = Mathf.Max(1, charsPerSecond);

                // FIXME: 对于Rich Text的Text,仅仅Skip符号是不行的,还需要找到对应的结束符号,并把结束符号给添加到尾部,而如果有嵌套存在,还需要把嵌套的都添加到尾部
                while (KGUIUtil.ParseSymbol(mFullText, ref mCurrentOffset))
                {
                }
                ++mCurrentOffset;

                if (mCurrentOffset > mFullText.Length)
                {
                    break;
                }

                float delay = 1f / charsPerSecond;
                char  c     = (lastOffset < mFullText.Length) ? mFullText[lastOffset] : '\n';

                if (c == '\n')
                {
                    delay += delayOnNewLine;
                }
                else if (lastOffset + 1 == mFullText.Length || mFullText[lastOffset + 1] <= ' ')
                {
                    if (c == '.')
                    {
                        if (lastOffset + 2 < mFullText.Length && mFullText[lastOffset + 1] == '.' && mFullText[lastOffset + 2] == '.')
                        {
                            delay      += delayOnPeriod * 3f;
                            lastOffset += 2;
                        }
                        else
                        {
                            delay += delayOnPeriod;
                        }
                    }
                    else if (c == '!' || c == '?')
                    {
                        delay += delayOnPeriod;
                    }
                }

                if (mNextChar == 0f)
                {
                    mNextChar = Time.unscaledTime + delay;
                }
                else
                {
                    mNextChar += delay;
                }

                if (fadeInTime != 0f)
                {
                    fadeData tempFade = new fadeData();
                    tempFade.index = lastOffset;
                    tempFade.alpha = 0f;
                    tempFade.text  = mFullText.Substring(lastOffset, mCurrentOffset - lastOffset);
                    mFade.Add(tempFade);
                }
                else
                {
                    mLabel.text = keepFullDimensions ?
                                  mFullText.Substring(0, mCurrentOffset) + "<color=#00000000>" + mFullText.Substring(mCurrentOffset) + "</color>" :
                                  mFullText.Substring(0, mCurrentOffset);
                }
            }

            if (mFade.size != 0)
            {
                for (int i = 0; i < mFade.size;)
                {
                    fadeData tempFade = mFade[i];
                    tempFade.alpha += Time.unscaledDeltaTime / fadeInTime;

                    if (tempFade.alpha < 1f)
                    {
                        mFade[i] = tempFade;
                        ++i;
                    }
                    else
                    {
                        mFade.RemoveAt(i);
                    }
                }

                if (mFade.size == 0)
                {
                    if (keepFullDimensions)
                    {
                        mLabel.text = mFullText.Substring(0, mCurrentOffset) + "<color=#00000000>" + mFullText.Substring(mCurrentOffset) + "</color>";
                    }
                    else
                    {
                        mLabel.text = mFullText.Substring(0, mCurrentOffset);
                    }
                }
                else
                {
                    StringBuilder sb = new StringBuilder();

                    string color = ColorUtility.ToHtmlStringRGB(mLabel.color);
                    for (int i = 0; i < mFade.size; ++i)
                    {
                        fadeData tempFade = mFade[i];

                        if (i == 0)
                        {
                            sb.Append(mFullText.Substring(0, tempFade.index));
                        }

                        sb.Append("<color=#" + color);
                        sb.Append(KGUIUtil.EncodeAlpha(tempFade.alpha));
                        sb.Append(">");
                        sb.Append(tempFade.text);
                        sb.Append("</color>");
                    }

                    if (keepFullDimensions)
                    {
                        sb.Append("<color=#00000000>");
                        sb.Append(mFullText.Substring(mCurrentOffset));
                        sb.Append("</color>");
                    }

                    mLabel.text = sb.ToString();
                }
            }
            else if (mCurrentOffset == mFullText.Length)
            {
                Instance = this;
                //EventDelegate.Execute(onFinished);
                Instance = null;
                mActive  = false;
            }
        }
示例#2
0
    void Update()
    {
        if (!mActive)
        {
            return;
        }

        if (mReset)
        {
            mCurrentOffset = 0;
            mReset         = false;
            mLabel         = GetComponent <Text>();
            mFullText      = mLabel.text;
            mFade.Clear();
        }

        while (mCurrentOffset < mFullText.Length && mNextChar <= RealTime.time)
        {
            int lastOffset = mCurrentOffset;
            charsPerSecond = Mathf.Max(1, charsPerSecond);

            while (NGUIText.ParseSymbol(mFullText, ref mCurrentOffset))
            {
            }
            ++mCurrentOffset;

            if (mCurrentOffset > mFullText.Length)
            {
                break;
            }

            float delay = 1f / charsPerSecond;
            char  c     = (lastOffset < mFullText.Length) ? mFullText[lastOffset] : '\n';

            if (c == '\n')
            {
                delay += delayOnNewLine;
            }
            else if (lastOffset + 1 == mFullText.Length || mFullText[lastOffset + 1] <= ' ')
            {
                if (c == '.')
                {
                    if (lastOffset + 2 < mFullText.Length && mFullText[lastOffset + 1] == '.' && mFullText[lastOffset + 2] == '.')
                    {
                        delay      += delayOnPeriod * 3f;
                        lastOffset += 2;
                    }
                    else
                    {
                        delay += delayOnPeriod;
                    }
                }
                else if (c == '!' || c == '?')
                {
                    delay += delayOnPeriod;
                }
            }

            if (mNextChar == 0f)
            {
                mNextChar = RealTime.time + delay;
            }
            else
            {
                mNextChar += delay;
            }

            if (fadeInTime != 0f)
            {
                fadeData tempFade = new fadeData();
                tempFade.index = lastOffset;
                tempFade.alpha = 0f;
                tempFade.text  = mFullText.Substring(lastOffset, mCurrentOffset - lastOffset);
                mFade.Add(tempFade);
            }
            else
            {
                mLabel.text = keepFullDimensions ?
                              mFullText.Substring(0, mCurrentOffset) + "[00]" + mFullText.Substring(mCurrentOffset) :
                              mFullText.Substring(0, mCurrentOffset);
            }
        }

        if (mFade.size != 0)
        {
            for (int i = 0; i < mFade.size;)
            {
                fadeData tempFade = mFade[i];
                tempFade.alpha += RealTime.deltaTime / fadeInTime;

                if (tempFade.alpha < 1f)
                {
                    mFade[i] = tempFade;
                    ++i;
                }
                else
                {
                    mFade.RemoveAt(i);
                }
            }

            if (mFade.size == 0)
            {
                if (keepFullDimensions)
                {
                    mLabel.text = mFullText.Substring(0, mCurrentOffset) + "[00]" + mFullText.Substring(mCurrentOffset);
                }
                else
                {
                    mLabel.text = mFullText.Substring(0, mCurrentOffset);
                }
            }
            else
            {
                StringBuilder sb = new StringBuilder();

                for (int i = 0; i < mFade.size; ++i)
                {
                    fadeData tempFade = mFade[i];

                    if (i == 0)
                    {
                        sb.Append(mFullText.Substring(0, tempFade.index));
                    }

                    sb.Append('[');
                    sb.Append(NGUIText.EncodeAlpha(tempFade.alpha));
                    sb.Append(']');
                    sb.Append(tempFade.text);
                }

                if (keepFullDimensions)
                {
                    sb.Append("[00]");
                    sb.Append(mFullText.Substring(mCurrentOffset));
                }

                mLabel.text = sb.ToString();
            }
        }
        else if (mCurrentOffset == mFullText.Length)
        {
            Instance = this;
            EventDelegate.Execute(onFinished);
            Instance = null;
            mActive  = false;
        }
    }