没接触NGUI之前,因为有个老师跟我们讲,NGUI这个东西已经被淘汰啦 bla bla bla

然后有个师兄在外面找U3D的工作,回来之后,面试 问到 NGUI ,没学过这个东西啊.. bla bla bla

之前用UGUI方法做的打字机思路是这样, 在开始时,把字体存在一个string变量里面,然后在update 里用equal去判断是否完成,再 将其substr 一下。字符截取一下。

下面的源码  UGUI 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;public class TextTween : MonoBehaviour {Text m_text;string TextString;float Timer=0f;bool isFinish;public float Speed=2f;// Use this for initializationvoid Start () {   m_text = GetComponent<Text> ();TextString = m_text.text;m_text.text = "";}// Update is called once per framevoid Update () {if (m_text.text.Equals (TextString)) {isFinish = true;//字体播放结束 finish  执行 Finsh } else{m_text.text = TextString.Substring (0, (int)(Timer * Speed));Timer += Time.deltaTime;}}
}

而 NGUI 呢。

主要在

在 typewriterEffect中封装好了

chars per Second就是每秒多少字符。

Fade in Time 就是 Fade后显示的时间。

Delay On period 就是 在一句后的 延迟。

Delay On New Line 呢就是 每一行后的延迟。

Scoll view 就是滚动栏啦。其实意思就是 跟随滚动的意思。

源码如下

//-------------------------------------------------
//            NGUI: Next-Gen UI kit
// Copyright © 2011-2018 Tasharen Entertainment Inc
//-------------------------------------------------using UnityEngine;
using System.Text;
using System.Collections.Generic;/// <summary>
/// This script is able to fill in the label's text gradually, giving the effect of someone typing or fading in the content over time.
/// </summary>[RequireComponent(typeof(UILabel))]
[AddComponentMenu("NGUI/Interaction/Typewriter Effect")]
public class TypewriterEffect : MonoBehaviour
{static public TypewriterEffect current;struct FadeEntry{public int index;public string text;public float alpha;}/// <summary>/// How many characters will be printed per second./// </summary>public int charsPerSecond = 20;/// <summary>/// How long it takes for each character to fade in./// </summary>public float fadeInTime = 0f;/// <summary>/// How long to pause when a period is encountered (in seconds)./// </summary>public float delayOnPeriod = 0f;/// <summary>/// How long to pause when a new line character is encountered (in seconds)./// </summary>public float delayOnNewLine = 0f;/// <summary>/// If a scroll view is specified, its UpdatePosition() function will be called every time the text is updated./// </summary>public UIScrollView scrollView;/// <summary>/// If set to 'true', the label's dimensions will be that of a fully faded-in content./// </summary>
Chat快问 new  public bool keepFullDimensions = false;/// <summary>/// Event delegate triggered when the typewriter effect finishes./// </summary>public List<EventDelegate> onFinished = new List<EventDelegate>();UILabel mLabel;string mFullText = "";int mCurrentOffset = 0;float mNextChar = 0f;bool mReset = true;bool mActive = false;BetterList<FadeEntry> mFade = new BetterList<FadeEntry>();/// <summary>/// Whether the typewriter effect is currently active or not./// </summary>public bool isActive { get { return mActive; } }/// <summary>/// Reset the typewriter effect to the beginning of the label./// </summary>public void ResetToBeginning (){Finish();mReset = true;mActive = true;mNextChar = 0f;mCurrentOffset = 0;Update();}/// <summary>/// Finish the typewriter operation and show all the text right away./// </summary>public void Finish (){if (mActive){mActive = false;if (!mReset){mCurrentOffset = mFullText.Length;mFade.Clear();mLabel.text = mFullText;}if (keepFullDimensions && scrollView != null)scrollView.UpdatePosition();current = this;EventDelegate.Execute(onFinished);current = null;}}void OnEnable () { mReset = true; mActive = true; }void OnDisable () { Finish(); }void Update (){if (!mActive) return;if (mReset){mCurrentOffset = 0;mReset = false;mLabel = GetComponent<UILabel>();mFullText = mLabel.processedText;mFade.Clear();if (keepFullDimensions && scrollView != null) scrollView.UpdatePosition();}if (string.IsNullOrEmpty(mFullText)) return;var len = mFullText.Length;while (mCurrentOffset < len && mNextChar <= RealTime.time){int lastOffset = mCurrentOffset;charsPerSecond = Mathf.Max(1, charsPerSecond);// Automatically skip all symbolsif (mLabel.supportEncoding)while (NGUIText.ParseSymbol(mFullText, ref mCurrentOffset)) { }++mCurrentOffset;// Reached the end? We're done.if (mCurrentOffset > len) break;// Periods and end-of-line characters should pause for a longer time.float delay = 1f / charsPerSecond;char c = (lastOffset < len) ? mFullText[lastOffset] : '\n';if (c == '\n'){delay += delayOnNewLine;}else if (lastOffset + 1 == len || mFullText[lastOffset + 1] <= ' '){if (c == '.'){if (lastOffset + 2 < len && 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){// There is smooth fading involvedFadeEntry fe = new FadeEntry();fe.index = lastOffset;fe.alpha = 0f;fe.text = mFullText.Substring(lastOffset, mCurrentOffset - lastOffset);mFade.Add(fe);}else{// No smooth fading necessarymLabel.text = keepFullDimensions ?mFullText.Substring(0, mCurrentOffset) + "[00]" + mFullText.Substring(mCurrentOffset) :mFullText.Substring(0, mCurrentOffset);// If a scroll view was specified, update its positionif (!keepFullDimensions && scrollView != null) scrollView.UpdatePosition();}}// Alpha-based fadingif (mCurrentOffset >= len && mFade.size == 0){mLabel.text = mFullText;current = this;EventDelegate.Execute(onFinished);current = null;mActive = false;}else if (mFade.size != 0){for (int i = 0; i < mFade.size; ){FadeEntry fe = mFade[i];fe.alpha += RealTime.deltaTime / fadeInTime;if (fe.alpha < 1f){mFade[i] = fe;++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){FadeEntry fe = mFade[i];if (i == 0){sb.Append(mFullText.Substring(0, fe.index));}sb.Append('[');sb.Append(NGUIText.EncodeAlpha(fe.alpha));sb.Append(']');sb.Append(fe.text);}if (keepFullDimensions){sb.Append("[00]");sb.Append(mFullText.Substring(mCurrentOffset));}mLabel.text = sb.ToString();}}}
}
Chat快问 new  public bool keepFullDimensions = false;/// <summary>/// Event delegate triggered when the typewriter effect finishes./// </summary>public List<EventDelegate> onFinished = new List<EventDelegate>();UILabel mLabel;string mFullText = "";int mCurrentOffset = 0;float mNextChar = 0f;bool mReset = true;bool mActive = false;BetterList<FadeEntry> mFade = new BetterList<FadeEntry>();/// <summary>/// Whether the typewriter effect is currently active or not./// </summary>public bool isActive { get { return mActive; } }/// <summary>/// Reset the typewriter effect to the beginning of the label./// </summary>public void ResetToBeginning (){Finish();mReset = true;mActive = true;mNextChar = 0f;mCurrentOffset = 0;Update();}/// <summary>/// Finish the typewriter operation and show all the text right away./// </summary>public void Finish (){if (mActive){mActive = false;if (!mReset){mCurrentOffset = mFullText.Length;mFade.Clear();mLabel.text = mFullText;}if (keepFullDimensions && scrollView != null)scrollView.UpdatePosition();current = this;EventDelegate.Execute(onFinished);current = null;}}void OnEnable () { mReset = true; mActive = true; }void OnDisable () { Finish(); }void Update (){if (!mActive) return;if (mReset){mCurrentOffset = 0;mReset = false;mLabel = GetComponent<UILabel>();mFullText = mLabel.processedText;mFade.Clear();if (keepFullDimensions && scrollView != null) scrollView.UpdatePosition();}if (string.IsNullOrEmpty(mFullText)) return;var len = mFullText.Length;while (mCurrentOffset < len && mNextChar <= RealTime.time){int lastOffset = mCurrentOffset;charsPerSecond = Mathf.Max(1, charsPerSecond);// Automatically skip all symbolsif (mLabel.supportEncoding)while (NGUIText.ParseSymbol(mFullText, ref mCurrentOffset)) { }++mCurrentOffset;// Reached the end? We're done.if (mCurrentOffset > len) break;// Periods and end-of-line characters should pause for a longer time.float delay = 1f / charsPerSecond;char c = (lastOffset < len) ? mFullText[lastOffset] : '\n';if (c == '\n'){delay += delayOnNewLine;}else if (lastOffset + 1 == len || mFullText[lastOffset + 1] <= ' '){if (c == '.'){if (lastOffset + 2 < len && 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){// There is smooth fading involvedFadeEntry fe = new FadeEntry();fe.index = lastOffset;fe.alpha = 0f;fe.text = mFullText.Substring(lastOffset, mCurrentOffset - lastOffset);mFade.Add(fe);}else{// No smooth fading necessarymLabel.text = keepFullDimensions ?mFullText.Substring(0, mCurrentOffset) + "[00]" + mFullText.Substring(mCurrentOffset) :mFullText.Substring(0, mCurrentOffset);// If a scroll view was specified, update its positionif (!keepFullDimensions && scrollView != null) scrollView.UpdatePosition();}}// Alpha-based fadingif (mCurrentOffset >= len && mFade.size == 0){mLabel.text = mFullText;current = this;EventDelegate.Execute(onFinished);current = null;mActive = false;}else if (mFade.size != 0){for (int i = 0; i < mFade.size; ){FadeEntry fe = mFade[i];fe.alpha += RealTime.deltaTime / fadeInTime;if (fe.alpha < 1f){mFade[i] = fe;++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){FadeEntry fe = mFade[i];if (i == 0){sb.Append(mFullText.Substring(0, fe.index));}sb.Append('[');sb.Append(NGUIText.EncodeAlpha(fe.alpha));sb.Append(']');sb.Append(fe.text);}if (keepFullDimensions){sb.Append("[00]");sb.Append(mFullText.Substring(mCurrentOffset));}mLabel.text = sb.ToString();}}}
}
 scrollView.UpdatePosition();
 StringBuilder sb = new StringBuilder();

这个 是为了减少内存的使用,优化方面的。

就是 更新位置啦,

做打字机效果

Unity学习之打字机效果 NGUIUGUI相关推荐

  1. Unity 对话系统 文字打字机效果实现

    功能: 1.文字逐个出现 2.支持富文本 3.添加<float>标签可以延迟显示 4.想快速展示完调用函数 ImmediatelyShow 准备: 代码: using System; us ...

  2. Unity学习笔记(4)-----粒子效果的实现

    Unity学习笔记(4)-–粒子效果的实现 一.效果展示 下面用若干张张动图展示效果: 大概就是这样,并不是很难. 实际效果要比图中的好一点(顺畅得多). 实现步骤 大致可以分为如下几个步骤,然后逐个 ...

  3. Unity学习shader笔记[一百]简单焦散Caustic效果

    焦散是模仿光透过水底的一个投影景象 有两个版本,改版最后效果如下 这里是简单的基于物体的焦散,基于水体的焦散思路是水面物体的shader中拿到ColorBuffer,然后用水体的屏幕空间坐标取采集Co ...

  4. unity_NGUI系统学习(十)_PlaySound添加声音_添加打字机效果TypewriterEffect

    unity_NGUI系统学习(十)_PlaySound添加声音_添加打字机效果TypewriterEffect<7/10/2017> 1.因为要实现声音的交互,首先你得给目标对象添加一个B ...

  5. 关于Unity中NGUI的Tab商城、Scrollview和打字机效果的实现

    Tab商城实例 UIToggle 和 UIToggledObjects+ Box Collider(实现商城功能必备) 1.创建两个个UI Sprite,Sprite1和Sprite2 2.给Spri ...

  6. Unity Shader学习:油画效果

    Unity Shader学习:油画效果 油画效果在学习浅墨大神的文章时看到的比较有趣,但是原文中也没详细的算法介绍如何实现,这里就先直接拿来用吧,UI和屏幕后处理都可以用,算法也看的不是很明白,好像是 ...

  7. 【Unity】带有字符淡入效果的TextMeshPro打字机效果组件

    [Unity]带有字符淡入效果的TextMeshPro打字机效果组件 在TextMeshPro中,可以通过 TMP_Text.maxVisibleCharacters 属性控制可见字符的个数,实现简单 ...

  8. Unity之富文本打字机效果

    前段时间需要做一个打字机效果的案子,网上也有很多UGUI的打字机插件,利用tweener动画制作的.不过后来我发现很多都不默认支持富文本,所以需要自己改写代码.这里我简化了代码,做了一个精简版的打字机 ...

  9. Unity学习笔记(8) Unity残影效果整理,3D、2D、通用方案

    Unity做残影效果是个不难的工作. 但是一些细节会对使用方法产生限制,这里整理一下各种情况下推荐的残影效果实现方案 1.3D网格 (高性能) 2.2D人物 (非骨骼动画) (高性能) 3.其它场景 ...

最新文章

  1. 【linux】shell中整数运算的加、减、乘、除
  2. 【青少年编程竞赛交流】12月份微信图文索引
  3. beyond compare 4 的30天试用期已过-解决方法
  4. Java笔记-多线程中同步加锁相关
  5. 50元打造双网卡负载均衡服务器
  6. 物联网思维导图_物联网将如何改变我们的思维方式
  7. BZOJ 1801 中国象棋(DP)
  8. 简明 python 教程 书_Python简明教程是不是这本书(简明python教程书本)
  9. 蛋白质分子动力学模拟
  10. 【定制开发】【M3】基于Python+pygame实现的人机AI对战五子棋游戏(保姆级入门讲解)
  11. 基于opencv 的OCR小票识别(1)
  12. Fisher精确检验的通俗理解
  13. NOI Linux 2.0版发布
  14. I2S/IIS总线介绍及相关EMC问题
  15. PDF - 使用 Adobe Acrobat 压缩 PDF 大小
  16. Java使用当前日期加四位数实现每日自增单号工具类
  17. 【软件教程】解决kali无法和windows实现复制黏贴互通
  18. 如何将每日新闻添加到自己博客中,发送到微信群中
  19. 2013年9月16日
  20. linux之pmap命令!

热门文章

  1. ubuntu18.04安装xmind思维导图 + 创建软件的快捷方式
  2. 数据治理系列2:元数据管理—企业数据治理的基础
  3. OPC包深度解析及工业防火墙 (上)
  4. Deformable ConvNets v2: More Deformable, Better Results
  5. 引用echerts图表
  6. 超级刀片计算机是什么处理机,戴尔拟开发ARM处理器的超级计算机
  7. SOLID原则:单一职责原则(SRP)
  8. [15]深入浅出工作开源框架Camunda:定时任务
  9. 拓嘉启远电商:如何合理安排拼多多上下架时间
  10. cmder 窗口,λ后面总会多一个字母