您现在的位置是:首页 >其他 >Unity 工具控件 之 Text 文本字间距调整(老版本的Unity编写工具控件/新版本Unity使用TMP)网站首页其他

Unity 工具控件 之 Text 文本字间距调整(老版本的Unity编写工具控件/新版本Unity使用TMP)

仙魁XAN 2023-05-28 20:00:03
简介Unity 工具控件 之 Text 文本字间距调整(老版本的Unity编写工具控件/新版本Unity使用TMP)

Unity 工具控件 之 Text 文本字间距调整(老版本的Unity编写工具控件/新版本Unity使用TMP)

目录

Unity 工具控件 之 Text 文本字间距调整(老版本的Unity编写工具控件/新版本Unity使用TMP)

一、简单介绍

二、老版本 Unity Text 使用工具控件调整行间距

三、新版本 Unity Text(TMP)自带调整行间距

附录:

新版本 Unity Text(TMP) 中文字体支持(介绍生成中文字体资源的方法之一)


一、简单介绍

Unity 工具控件类,自己整理的一些游戏开发可能用到的模块,单独独立使用,方便游戏开发。

本节介绍,在原始的 Unity Text 中,只能调整文本的行间,字间距确实默认的值,要调整的自己额外的编写工具空间来调整;如果使用新版的 Unity Text(TMP)组件,里面就有现成的设置了,这里简单说明,如果你有更好的方法,欢迎留言交流。

(可能两种方法都存在使用局限性,可能根据需要使用)
 

二、老版本 Unity Text 使用工具控件调整行间距

1、正常的字间距效果

 

 2、可调整的字间距效果

 3、参考的代码 TextSpacing

using UnityEngine;
using UnityEngine.UI;
using System.Collections.Generic;
using System.Linq;

[AddComponentMenu("UI/Effects/TextSpacing")]
public class TextSpacing : BaseMeshEffect
{

    [SerializeField]
    private float spacing_x;
    //[SerializeField]
    private float spacing_y=0;
    private const int VERTEXT_RANGE = 6;

    private List<UIVertex> mVertexList;

    public override void ModifyMesh(VertexHelper vh)
    {
        if (spacing_x == 0 && spacing_y == 0) { return; }
        if (!IsActive()) { return; }
        int count = vh.currentVertCount;
        if (count == 0) { return; }
        if (mVertexList == null) { mVertexList = new List<UIVertex>(); }
        vh.GetUIVertexStream(mVertexList);
        int row = 1;
        int column = 2;
        List<UIVertex> sub_vertexs = mVertexList.GetRange(0, VERTEXT_RANGE);
        float min_row_left = sub_vertexs.Min(v => v.position.x);
        int vertex_count = mVertexList.Count;
        for (int i = VERTEXT_RANGE; i < vertex_count;)
        {
            if (i % VERTEXT_RANGE == 0)
            {
                sub_vertexs = mVertexList.GetRange(i, VERTEXT_RANGE);
                float tem_row_left = sub_vertexs.Min(v => v.position.x);
                if (min_row_left - tem_row_left >= -10)
                {
                    min_row_left = tem_row_left;
                    ++row;
                    column = 1;
                    //continue;
                }
            }

            for (int j = 0; j < VERTEXT_RANGE; j++)
            {
                UIVertex vertex = mVertexList[i];
                vertex.position += Vector3.right * (column - 1) * spacing_x;
                vertex.position += Vector3.down * (row - 1) * spacing_y;
                mVertexList[i] = vertex;
                ++i;
            }
            ++column;

        }
        vh.Clear();
        vh.AddUIVertexTriangleStream(mVertexList);
    }
}

4、参考的代码 TextSpacing1


using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

[AddComponentMenu("UI/Effects/TextSpacing1")]
public class TextSpacing1 : BaseMeshEffect
{
    public float TextHorizontalSpacing = 1f;

    public override void ModifyMesh(VertexHelper vh)
    {
        if (!IsActive() || vh.currentVertCount == 0)
        {
            return;
        }

        Text text = GetComponent<Text>();
        if (text == null)
        {
            Debug.LogError("Missing Text component");
            return;
        }

        List<UIVertex> vertexs = new List<UIVertex>();
        vh.GetUIVertexStream(vertexs);
        int indexCount = vh.currentIndexCount;

        string[] lineTexts = text.text.Split('
');

        Line[] lines = new Line[lineTexts.Length];

        //根据lines数组中各个元素的长度计算每一行中第一个点的索引,每个字、字母、空母均占6个点
        for (int i = 0; i < lines.Length; i++)
        {
            //除最后一行外,vertexs对于前面几行都有回车符占了6个点
            if (i == 0)
            {
                lines[i] = new Line(0, lineTexts[i].Length + 1);
            }
            else if (i > 0 && i < lines.Length - 1)
            {
                lines[i] = new Line(lines[i - 1].EndVertexIndex + 1, lineTexts[i].Length + 1);
            }
            else
            {
                lines[i] = new Line(lines[i - 1].EndVertexIndex + 1, lineTexts[i].Length);
            }
        }

        UIVertex vt;

        for (int i = 0; i < lines.Length; i++)
        {
            Vector3 startPos = Vector3.zero;
            Vector3 endPos = Vector3.zero;
            Vector3 defaultStartPos = Vector3.zero;
            Vector3 defaultEndPos = Vector3.zero;
            for (int j = lines[i].StartVertexIndex; j <= lines[i].EndVertexIndex; j++)
            {
                if (j < 0 || j >= vertexs.Count)
                {
                    continue;
                }
                vt = vertexs[j];
                if (defaultStartPos == Vector3.zero)
                {
                    defaultStartPos = new Vector3(vt.position.x, vt.position.y, vt.position.z);
                }
                defaultEndPos = new Vector3(vt.position.x, vt.position.y, vt.position.z);
                if (j != 0)
                {
                    vt.position += new Vector3(TextHorizontalSpacing * ((j - lines[i].StartVertexIndex) / 6), 0, 0);
                }
                if (startPos == Vector3.zero)
                {
                    startPos = new Vector3(vt.position.x, vt.position.y, vt.position.z);
                }
                endPos = new Vector3(vt.position.x, vt.position.y, vt.position.z);
                vertexs[j] = vt;
                //以下注意点与索引的对应关系
                if (j % 6 <= 2)
                {
                    vh.SetUIVertex(vt, (j / 6) * 4 + j % 6);
                }
                if (j % 6 == 4)
                {
                    vh.SetUIVertex(vt, (j / 6) * 4 + j % 6 - 1);
                }
            }
            if (text.alignment == TextAnchor.MiddleCenter || text.alignment == TextAnchor.UpperCenter || text.alignment == TextAnchor.LowerCenter)
            {
                Vector3 defaultCenterPos = defaultStartPos + (defaultEndPos - defaultStartPos) / 2;
                Vector3 centerPos = startPos + (endPos - startPos) / 2;
                for (int j = lines[i].StartVertexIndex; j <= lines[i].EndVertexIndex; j++)
                {
                    if (j < 0 || j >= vertexs.Count)
                    {
                        continue;
                    }
                    vt = vertexs[j];
                    vt.position = vt.position + defaultCenterPos - centerPos;
                    vertexs[j] = vt;
                    //以下注意点与索引的对应关系
                    if (j % 6 <= 2)
                    {
                        vh.SetUIVertex(vt, (j / 6) * 4 + j % 6);
                    }
                    if (j % 6 == 4)
                    {
                        vh.SetUIVertex(vt, (j / 6) * 4 + j % 6 - 1);
                    }
                }
            }
            if (text.alignment == TextAnchor.MiddleRight || text.alignment == TextAnchor.UpperRight || text.alignment == TextAnchor.LowerRight)
            {
                Vector3 defaultRightPos = defaultEndPos;
                Vector3 rightPos = endPos;
                for (int j = lines[i].StartVertexIndex; j <= lines[i].EndVertexIndex; j++)
                {
                    if (j < 0 || j >= vertexs.Count)
                    {
                        continue;
                    }
                    vt = vertexs[j];
                    vt.position = vt.position + defaultRightPos - rightPos;
                    vertexs[j] = vt;
                    //以下注意点与索引的对应关系
                    if (j % 6 <= 2)
                    {
                        vh.SetUIVertex(vt, (j / 6) * 4 + j % 6);
                    }
                    if (j % 6 == 4)
                    {
                        vh.SetUIVertex(vt, (j / 6) * 4 + j % 6 - 1);
                    }
                }
            }
        }
    }
}

public class Line
{

    private int _startVertexIndex = 0;
    /// <summary>
    /// 起点索引
    /// </summary>
    public int StartVertexIndex
    {
        get
        {
            return _startVertexIndex;
        }
    }

    private int _endVertexIndex = 0;
    /// <summary>
    /// 终点索引
    /// </summary>
    public int EndVertexIndex
    {
        get
        {
            return _endVertexIndex;
        }
    }

    private int _vertexCount = 0;
    /// <summary>
    /// 该行占的点数目
    /// </summary>
    public int VertexCount
    {
        get
        {
            return _vertexCount;
        }
    }

    public Line(int startVertexIndex, int length)
    {
        _startVertexIndex = startVertexIndex;
        _endVertexIndex = length * 6 - 1 + startVertexIndex;
        _vertexCount = length * 6;
    }
}

5、参考的代码 TextSpacing2

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

[AddComponentMenu("UI/Effects/TextSpacing2")]
public class TextSpacing2 : BaseMeshEffect
{
    #region Struct

    public enum HorizontalAligmentType
    {
        Left,
        Center,
        Right
    }

    public class Line
    {
        // 起点索引
        public int StartVertexIndex { get { return _startVertexIndex; } }
        private int _startVertexIndex = 0;

        // 终点索引
        public int EndVertexIndex { get { return _endVertexIndex; } }
        private int _endVertexIndex = 0;

        // 该行占的点数目
        public int VertexCount { get { return _vertexCount; } }
        private int _vertexCount = 0;

        public Line(int startVertexIndex, int length)
        {
            _startVertexIndex = startVertexIndex;
            _endVertexIndex = length * 6 - 1 + startVertexIndex;
            _vertexCount = length * 6;
        }
    }

    #endregion

    public float Spacing = 1f;

    public override void ModifyMesh(VertexHelper vh)
    {
        if (!IsActive() || vh.currentVertCount == 0)
        {
            return;
        }

        var text = GetComponent<Text>();

        if (text == null)
        {
            Debug.LogError("Missing Text component");
            return;
        }

        // 水平对齐方式
        HorizontalAligmentType alignment;
        if (text.alignment == TextAnchor.LowerLeft || text.alignment == TextAnchor.MiddleLeft || text.alignment == TextAnchor.UpperLeft)
        {
            alignment = HorizontalAligmentType.Left;
        }
        else if (text.alignment == TextAnchor.LowerCenter || text.alignment == TextAnchor.MiddleCenter || text.alignment == TextAnchor.UpperCenter)
        {
            alignment = HorizontalAligmentType.Center;
        }
        else
        {
            alignment = HorizontalAligmentType.Right;
        }

        var vertexs = new List<UIVertex>();
        vh.GetUIVertexStream(vertexs);
        // var indexCount = vh.currentIndexCount;

        var lineTexts = text.text.Split('
');

        var lines = new Line[lineTexts.Length];

        // 根据lines数组中各个元素的长度计算每一行中第一个点的索引,每个字、字母、空母均占6个点
        for (var i = 0; i < lines.Length; i++)
        {
            // 除最后一行外,vertexs对于前面几行都有回车符占了6个点
            if (i == 0)
            {
                lines[i] = new Line(0, lineTexts[i].Length + 1);
            }
            else if (i > 0 && i < lines.Length - 1)
            {
                lines[i] = new Line(lines[i - 1].EndVertexIndex + 1, lineTexts[i].Length + 1);
            }
            else
            {
                lines[i] = new Line(lines[i - 1].EndVertexIndex + 1, lineTexts[i].Length);
            }
        }

        UIVertex vt;

        for (var i = 0; i < lines.Length; i++)
        {
            for (var j = lines[i].StartVertexIndex; j <= lines[i].EndVertexIndex; j++)
            {
                if (j < 0 || j >= vertexs.Count)
                {
                    continue;
                }

                vt = vertexs[j];

                var charCount = lines[i].EndVertexIndex - lines[i].StartVertexIndex;
                if (i == lines.Length - 1)
                {
                    charCount += 6;
                }

                if (alignment == HorizontalAligmentType.Left)
                {
                    vt.position += new Vector3(Spacing * ((j - lines[i].StartVertexIndex) / 6), 0, 0);
                }
                else if (alignment == HorizontalAligmentType.Right)
                {
                    vt.position += new Vector3(Spacing * (-(charCount - j + lines[i].StartVertexIndex) / 6 + 1), 0, 0);
                }
                else if (alignment == HorizontalAligmentType.Center)
                {
                    var offset = (charCount / 6) % 2 == 0 ? 0.5f : 0f;
                    vt.position += new Vector3(Spacing * ((j - lines[i].StartVertexIndex) / 6 - charCount / 12 + offset), 0, 0);
                }

                vertexs[j] = vt;
                // 以下注意点与索引的对应关系
                if (j % 6 <= 2)
                {
                    vh.SetUIVertex(vt, (j / 6) * 4 + j % 6);
                }

                if (j % 6 == 4)
                {
                    vh.SetUIVertex(vt, (j / 6) * 4 + j % 6 - 1);
                }
            }
        }
    }
}

三、新版本 Unity Text(TMP)自带调整行间距

1、默认字间距

2、使用 Text(TMP)的 Charactor 调整字间距

附录:

新版本 Unity Text(TMP) 中文字体支持(介绍生成中文字体资源的方法之一)

1、首先 C:WindowsFonts 获取支持中文的字体(其他支持中文的字体也行)

2、当然,Unity 也要添加 TextMeshPro 相关工具插件(获取方式,1、添加 Text-TextMeshPro会自动添加;2、Package Manager 中下载添加)

3、打开 TextMeshPro - Font Asset Creator

 

4、添加支持中文的字体font, Atlas Resolution 根据需要设置,然后 Charactor Set 选择 Charactors from file ,然后添加常用的中文字txt

注意: Atlas Resolution 是关键,过小 可能文字显示不出来,太大生成的.asset 较大耗费空间

 

 5、生成 Atlas ,然后保存即可生成 Text(TMP)需要的字体资源

 

 6、zh-cn_Commonly_used.txt 常用中文字

的一是了我不人在他有这个上们来到时大地为子中你说生国年着就那和要她出也得里后自以会家可下而过天去能对小多然于心学么之都好看起发当没成只如事把还用第样道想作种开美总从无情己面最女但现前些所同日手又行意动方期它头经长儿回位分爱老因很给名法间斯知世什两次使身者被高已亲其进此话常与活正感见明问力理尔点文几定本公特做外孩相西果走将月十实向声车全信重三机工物气每并别真打太新比才便夫再书部水像眼等体却加电主界门利海受听表德少克代员许稜先口由死安写性马光白或住难望教命花结乐色更拉东神记处让母父应直字场平报友关放至张认接告入笑内英军候民岁往何度山觉路带万男边风解叫任金快原吃妈变通师立象数四失满战远格士音轻目条呢病始达深完今提求清王化空业思切怎非找片罗钱紶吗语元喜曾离飞科言干流欢约各即指合反题必该论交终林请医晚制球决窢传画保读运及则房早院量苦火布品近坐产答星精视五连司巴奇管类未朋且婚台夜青北队久乎越观落尽形影红爸百令周吧识步希亚术留市半热送兴造谈容极随演收首根讲整式取照办强石古华諣拿计您装似足双妻尼转诉米称丽客南领节衣站黑刻统断福城故历惊脸选包紧争另建维绝树系伤示愿持千史谁准联妇纪基买志静阿诗独复痛消社算义竟确酒需单治卡幸兰念举仅钟怕共毛句息功官待究跟穿室易游程号居考突皮哪费倒价图具刚脑永歌响商礼细专黄块脚味灵改据般破引食仍存众注笔甚某沉血备习校默务土微娘须试怀料调广蜖苏显赛查密议底列富梦错座参八除跑亮假印设线温虽掉京初养香停际致阳纸李纳验助激够严证帝饭忘趣支春集丈木研班普导顿睡展跳获艺六波察群皇段急庭创区奥器谢弟店否害草排背止组州朝封睛板角况曲馆育忙质河续哥呼若推境遇雨标姐充围案伦护冷警贝著雪索剧啊船险烟依斗值帮汉慢佛肯闻唱沙局伯族低玩资屋击速顾泪洲团圣旁堂兵七露园牛哭旅街劳型烈姑陈莫鱼异抱宝权鲁简态级票怪寻杀律胜份汽右洋范床舞秘午登楼贵吸责例追较职属渐左录丝牙党继托赶章智冲叶胡吉卖坚喝肉遗救修松临藏担戏卫药悲敢靠伊村戴词森耳差短祖云规窗散迷油旧适乡架恩投弹铁博雷府压超负勒杂醒洗采毫嘴毕九冰既状乱景席珍童顶派素脱农疑练野按犯拍征坏骨余承置臓彩灯巨琴免环姆暗换技翻束增忍餐洛塞缺忆判欧层付阵玛批岛项狗休懂武革良恶恋委拥娜妙探呀营退摇弄桌熟诺宣银势奖宫忽套康供优课鸟喊降夏困刘罪亡鞋健模败伴守挥鲜财孤枪禁恐伙杰迹妹藸遍盖副坦牌江顺秋萨菜划授归浪凡预奶雄升碃编典袋莱含盛济蒙棋端腿招释介烧误软件坛央政辞杨洁汗扎齐兹龙佩盟佐协迄届旨讨昨幕评聚焦促郑略瞻篇闭签署丰硕拓倡毅兼绕携互赢鉴努执描绘幅晰源企涵申核益贸措弘扬策沟施畅域吹宁繁荣朗威胁亿税妥善省厅县织潮摘网哈滨塌腐谓防杜侵蚀伞涉码掩漫延恣二拔率检效患积胆疯狂货媒曝鼓励舆笼潜振渔弊服监督惰租映矿审挑滋减遵循竭泽嗅寄培竞坊啃硬钢妨抓庆伟艰猛搞摆悠础蕴厚序甘肃暴洪悉损毁灾镇葬湾踪抛尸横岩崎徒刑嫌籍控泛轨测倍均镜偏港垄违芯销售补估滥阻碍罚款遭户迟订奔屈湿透桂圆莆姓尺绿乔粗壮枝薄椭披针侧梗瓣乳卵柔褐灰稍凸瘤季栽亦疏蔗蛋荔葡萄疫苗吴昊尤零输储箱诊链配疾射综障绪慌舟途径恰喻咬犬撰轮巡馈括辽川湖沈暂贿彻召忠诚净奉献秀唯贤符裙档弱涣述敷衍虚磋纷晓鸿津姜虎熙劣旗帜驳田韩隋芝凤限融冒驻壁隔阂览圈颜插哔哩渠庞占巧陆构堆灿瞩择填卷屏榜伍秒触碰掌萝莉频播淹荧棒挡妆荡勤奋迅盈爆俗尹载蹈碎访磨郭绍烹饪荐俊慧幽欲艾咨询趋捧赏睐逐狼吞咽赞夸曰趁危惜哗宠吐槽迎猎赚仿昌尝借训陌牢汇粉诈骗娱纯享宜悖络跨覆篮贾磊酝酿拢帽册姚赔移冻董芳孙晒删舒屁股溢肤皙嘟迪旦驾驭呆艳雅蜜桃胸傲纤拨魅材尖劲震厂址猜塔轴版舰捷乘辆额液虑滑扩池驱姿纺奏郊腾疲削拒罢缩墨廷缓纬启折吨柴梳涨跌搁浅累抵卓讯弈撑概呈稳固欠宇芬帷驶杆键混倾斜叠航逻辑替钥匙椅甲醛析搭跃秉旺卢兄巩柱翰堡暨谱附辱尊韦睹予彼宽贷缴埃丹劝框俄贡伏宕凭迁牵币尚邻筑巢贫惠谋浇灌谊珊抢敞拦惕末摄岔亭沿拟吊澎湃隶凉岗稽歉详汲邮阅誓仪衔晕猝汕饺闷凌晨辩捂胃讼尾履渡蔡殊摊偿隆陷幻递遥吁谭忧蒂霍羞谴避贪饮冬疗顽炎瓜汤糖豆楂烦渴痈肿毒枣茶泡添茄竹蔬紫胶癌辣甜惹瞬崩浮淡辅援搜贺滚峪截稿押朴狱叛泳赦泰愚渺茫敦唐抗歧躺迫酵购罹染琦蒸拘盘允券宏隐瑞崔偷漏沸梁攻番誉毯坎坷饰珠锁脍炙爷谣奸嫖宿幼诬逼徐楚陕栈崖绳伸卧沃躲憾玉桥骸浩距炉浙嘉私垃圾废诱洼淀暑埔译纠肢宋寂塑匈荷裁彭棉麦猪宗仓库霸摩擦耿爽抨贴剂慰弃斥拖酷砖峰衡衷畔厦颇枢纽匆偶傍缕箭寒崭仔庄挝坝兆瓦湄柬寨井刨溃峡堵旱竣蓄雾揭蓝蚁穴敬哀岸墓犹豫赴灭疆凝阔攸捍伐秩彰贯歪僵孰坡乃镑绩铝垒侠矛盾赖丢槛裸赤钩舱渲搬窃扭剩肆昔阱粤澳逆夕宵橙悬夹洞尘辐喷粒撞宙膨胀穷虫壳拜账扣圳桩桑蓬渗崇刷罕邀函煞乌嫁宪怖勇牺牲践辰苑霞樊弦冠返涛扰役侦聊捕刊挽操纵骂溪残抚恤曙浸狠夺砸颗闪握欣闹鹅肥宅痴杯赫缘叹豪吵窝撮乏勾兑艘瞠舌锐炮婪拆昙侃艇君磅惩尴尬润亏鲍掐掰滴铺挣挫拼琼曼邦逾狐骇鑫募浏搅逞燥钉苹逊奈谷挤割盎氢燃攀页孚勘薪酬恒乙丁卜刀寸巾乞勺丸弓刃叉匹屯冈仁仆仇斤爪凶氏勿匀丑孔扑扒扔丙厉轧帅叮叼叨禾丘仗仙丛甩饥汁奴孕扛寺扫芒朽臣厌匠邪迈贞吓屿帆岂朱乒乓仰伪肌旬妄闯羊污讽阶阴羽驰寿戒扶扯抄扮孝坟坑抖劫芽芹苍芦杠杏歼盯旷串吩呜吼帐秃伶佣皂肝肚肠龟亩辛冶闲灶汪尿忌妖鸡纱纲纹驴抹拣抽拐拌抬茂茎茅柜枕丧刺厕轰顷斩叔齿虏肾昆昂咐鸣咏帖岭凯贩钓垂牧乖刮秆佳侍侄侨爬舍斧肺昏兔饱饲庙盲闸炒炊炕沫泄沾泊泻泥泼怜帘郎肩衬衫诞孟驼玻挂垮挎挠赵挺拴拾垫挖挪巷茧荒枯柄栋柏柳柿栏咸厘砌砍耐耍殃鸦皆竖盼眨哄哑畏趴虹虾蚂咱咳炭贱钞卸缸矩竿俩侮俭俘泉鬼叙剑逃盆胞胖脉勉狭狮狡怨饶饼弯疮疤阀阁炼炸烂剃洒浊洽浑浓恢恼恨扁袄祝诵垦昼陡眉娃姥姨姻娇怒怠绑绒骄骆绞耕耗蚕盏匪捞盐捎捏埋捉捆捐哲逝捡壶挨耻耽恭莲晋桐株逗栗翅唇轿毙眠鸭晃晌蚊哨唤唉贼钳钻铃铅氧敌秤秧笋债倚倘俱俯倦臭躬爹颂翁脆脂胳脏狸逢皱饿桨浆衰脊症疼剖畜瓶拳烤烘烛涝涂浴烫涌悟悄悔悦宴宾窄宰诸扇袜袖袍祥冤谅剥恳屑陵陶陪绢绣掀掏掠掘萌菌菊萍菠械梢梅梯桶戚聋袭雀睁眯啦啄蛇铜铲梨犁笨笛敏盒鸽脖猫馅凑麻痒痕廊庸鹿盗旋粘剪兽淋淘婆惭悼惧惨惯寇窑谎祸谜逮屠婶颈骑绵绸斑堪堤揪煮搂揉欺葛葱辜葵椒棵棍棚棕惑厨雁殖裂辈辉晴晶喇蛙蛛蜓喂喘喉赌铸锄锅锈锋稀筐筛筒筋筝傅御禽腊脾腔猾猴馋蛮羡粪焰渣溉愤愧愉慨窜裕裤谦屡粥隙絮嫂缎魂摸搏塘蒜鹊槐榆碗碌雹龄睬鄙暖歇跪遣蛾蜂嗓罩锡锣锤锦锯矮稠愁筹舅鼠催傻愈腰腥腹酱痰廉韵粮煎慈煤煌漠滤滔溜粱滩慎谨殿辟缝缠碧璃墙撇摧摔蔽慕暮蔑榴榨酸磁裳嗽蜻蜡蝇蜘锹锻箩僚鼻魄貌膜膊膀馒裹敲膏遮瘦熄熔漆漂嫩翠熊凳骡撕撒趟撤聪蕉樱橡飘醋醉霉瞒瞎踢踏踩蝶蝴嘱稻黎稼僻膝膛糊劈燕薯颠橘蹄赠雕辨糕澡懒鞠霜瞧螺穗辫糟糠臂翼骤鞭蹦镰鹰蹲颤壤耀躁嚼嚷魔蠢囊罐汰舶匕刁丐歹戈夭仑讥冗邓夯叭叽皿凹囚艂乍冯玄迂邢芋芍吏夷吕吆屹臼舋肋旭凫艁亥汛讳讶讹诀弛驮驯纫玖韧抠扼汞扳抡坞抑抒芙芜苇芥芭杖杉巫杈甫匣轩卤肖吱吠呕呐吟呛吻吭邑囤吮岖撍佑佃伺囱肛舔甸狈鸠彤灸庇吝庐闰艖沐沛沥沦汹沪忱诅艉妓姊妒玫卦坯坪坤舦拧拂艎撌拗茉苛苫苟苞艒苔枉枚枫杭郁矾奄殴艏哎咕呵咙舗舖咆咖帕贬舮氛岳侥侣侈卑刽刹肴觅忿瓮肮肪狞疟疙疚卒氓炬沽沮泣泞泌沼怔怯宛衩祈诡舕屉弧弥陋撈撏舷叁舜驹绊绎契贰玷玲拭拷拱挟垢垛拯荆茸茬荚茵茴荞荠荤萦柑栅柠枷迊砂泵砚鸥舓韭虐昧盹咧昵昭舃勋哆咪萯钙钝钠钦钧钮毡秕俏俐侯徊胚胧胎狰饵峦奕飒闺闽籽娄烁炫柒涎恃恍恬宦诫祠诲艄陨蚤舸耘耙秦匿埂袁捌挚捣捅聂荸莽莹莺梆栖桦栓桅舾艓砰砾殉哮唠剔蚌蚜蚣蚪蚓圃鸯唁哼唆峭唧峻赂赃钾铆氨秫笆俺赁倔殷耸舀豺豹颁胯胰脐脓逛卿鸵鸳馁凄斋疹紊瓷羔烙浦涡涤涧涕涩悍悯窍诽袒艋祟恕娩骏琐麸琉琅捺捶舎迚捻掂掖掷掸掺娶菱菲萎菩萤乾萧菇辴梧梭曹酗厢硅奢盔匾颅辭眶晤晦冕啡畦趾蛆蚯蛉舭唬啰唾啤啥啸婴赊铐铛铡铣铭矫秸秽笙笤偎傀躯兜衅徘徙舵敛翎脯逸凰猖祭庶庵痊阎阐眷焊焕涯淑淌淮淆渊淫淳淤涮惦悴惋舁谍谐裆袱祷谒谚尉堕隅婉绰绷绽艊琳艑揍堰揩揽揖揣搀搓壹搔葫撔蒋棱椰焚艅棺榔粟棘酣酥硝硫颊雳翘凿棠鼎喳遏晾畴跋跛蛔蜒蛤鹃啼喧嵌赋赎赐锉锌舧氮氯黍筏牍腌腋腕猩猬惫痘痢痪翔奠遂焙臿湘迓溅愕惶窖窘雇谤犀隘媚婿缅缆缔骚瑟鹉瑰搪聘斟靴靶蓖蒿蒲蓉楔椿楷榄楞楣酪碘硼碉撘瞄嗜嗦暇畸跷跺蜈蜗蜕蛹嗡嗤蜀幌锚艆锨锭锰臻颓筷魁衙腻腮腺鹏肄猿萬雏馍馏禀痹廓靖誊漓溯溶滓溺窥窟寝褂谬媳嫉缚缤剿艈熬蔫摹蔓蔼蔚兢榛榕碟碴碱碳辕辖雌墅嘁踊蝉嘀幔镀熏箍箕箫僧孵瘩瘟粹漱漩漾慷寡寥褪隧嫡缨撵撩撬擒墩舻鞍蕊樟橄豌醇磕碾嘶嘲嘹蝠蝎蝌蝗蝙嘿幢镊镐篓辮鲤鲫褒辳瘫凛潭潦潘澈澜澄憔懊憎翩褥鹤憨嬉缭撼擂擅蕾薛薇擎噩橱瓢蟥霎辙冀踱蹂蟆螃螟噪鹦黔撚篡篷篙篱儒膳鲸瘾瘸糙燎辶懈窿缰壕藐檬檐檩檀礁磷瞭瞳瞪蹋蟋蟀嚎赡镣魏簇儡徽爵朦臊鳄糜懦豁臀藕藤嚣鳍癞瀑襟璧戳攒孽摺藻蹭蹬簸蟹靡癣羹鬓攘蠕巍鳞糯譬霹躏髓蘸镶瓤矗

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。