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

news2024/12/23 4:34:06

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('\n');

        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('\n');

        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:\Windows\Fonts 获取支持中文的字体(其他支持中文的字体也行)

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 常用中文字

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/439546.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

mysql性能调优开篇介绍、错误代码总结(处理方法)和参数文件详解(持续更新中ing)

前言 MySQL是一个关系型数据库管理系统&#xff0c;由瑞典MySQL AB 公司开发&#xff0c;属于 Oracle 旗下产品。MySQL是最流行的关系型数据库管理系统之一&#xff0c;在 WEB 应用方面&#xff0c;MySQL是最好的 RDBMS (Relational Database Management System&#xff0c;关系…

园区路线地图指引图怎么画?园区地图三维图怎么画?

目前在园区信息化应用形式中&#xff0c;广泛缺乏专业电子地图的使用&#xff0c;因此&#xff0c;使这种高效的信息化工具的应用受到了很大限制。有些仅以图片代替&#xff0c;但图片没有空间计算、检索、路径设计的能力&#xff0c;在地图应用形式中&#xff0c;使用价值很低…

一文!解决恒定磁场的基本方程(有介质)

目录 引言 磁化过程 磁偶极矩 磁化强度 方程的化简 磁场强度 磁化率 磁导率 相对磁导率 现实生活中的应用 引言 为什么介质在磁场中会被磁化呢? 首先因为电子绕着原子核转动&#xff0c;所以就可以形成一个环形电流&#xff0c;&#xff0c;环形电流就可以产生磁场。…

SAR型ADC结构原理

SAR型 ADC&#xff0c;即逐次渐进逼近型 ADC&#xff0c;采用的是多次比较的方式来获得最终的输出结果&#xff0c;具有简单易用&#xff0c;功耗低的特点。下图这个结构可以帮助我们容易地理解SAR型 ADC的工作过程&#xff1a; 如上图&#xff0c;假设输入信号的伪代码为 45&…

YOLOv5+单目测距(python)

YOLOv5单目测距&#xff08;python&#xff09; 1. 相关配置2. 测距原理3. 相机标定3.1&#xff1a;标定方法13.2&#xff1a;标定方法2 4. 相机测距4.1 测距添加4.2 细节修改&#xff08;可忽略&#xff09;4.3 主代码 5. 实验效果 相关链接 1. YOLOV7 单目测距&#xff08;p…

今晚直播 | 思码逸陆春蕊:面对研发效能度量落地难点,如何让数据说话?

本期分享 本期 DevData Talks 邀请到了思码逸高级咨询专家陆春蕊老师。陆春蕊老师曾就职于 Oracle 美国&#xff0c;在软件质量、项目管理方面有着丰富的经验。在研发效能领域为上百家客户提供了技术、数据分析、实践落地等方面的咨询&#xff0c;协助客户提升研发效能10%-30%…

Revit问题:墙体被楼板剪切及材质库被锁定问题

一、Revit 墙体被楼板剪切怎么办? 建模的时候画的墙总是到楼板就停了&#xff0c;这是为什么&#xff1f;明明顶部约束到标高2了&#xff0c;这种情况如何解决&#xff1f; 首先来分析问题产生的原因是&#xff0c;我们在绘制楼板的时候选择了用楼板剪切重复部分的墙体。 解决…

junit的基本使用

1 依赖引入&#xff1a; 只需要在maven项目中引入&#xff1a; <dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version> </dependency> 2 常用注解 Test Before after BeforeClass…

BUG——DM -3217: 第1 行附近出现错误: 列[***]未编制全文索引或全文索引数据错误(全文索引、是否包含某些字符串)

文章目录 一、情景二、报错三、解决四、说明1、CONTAINS的使用前景2、全文索引2.1.全文索引定义语句2.2.全文索引修改语句2.3.全文索引删除语句 一、情景 统计某字段中&#xff0c;包含某些字符串的行数 # 使用CONTAINS select sum(case when CONTAINS(my_column,123) then 1…

12种优雅的接口优化方案

12种优雅的接口优化方案 一、背景二、接口优化方案总结1.批处理2.异步处理3.空间换时间4.预处理5.池化思想6.串行改并行7.索引8.避免大事务9.优化程序结构10.深分页问题11.SQL优化12.锁粒度避免过粗欲速则不达,欲达则欲速! —— 佚名 一、背景 针对老项目,做了许多降本增效…

4、Symbol-ES6新基础类型

symbol是 ES6 新增的一种基本数据类型&#xff0c;它和 number、string、boolean、undefined 和 null 是同类型的&#xff0c;object 是引用类型。它用来表示独一无二的值&#xff0c;通过 Symbol 函数生成。 本小节代码都是纯JavaScript代码&#xff0c;建议在非TypeScript环境…

Rasa实现百度UNIT智能客服教学机器人

背景 上一篇文章提到了百度UNIT智能客服教学机器人&#xff0c;下面用Rasa实现同样的效果。环境如下 Rasa Version : 3.1.0 Minimum Compatible Version: 3.0.0 Rasa SDK Version : 3.1.1 Rasa X Version : 1.1.0 Python Version : …

【LeetCode: 354. 俄罗斯套娃信封问题 | 暴力递归=>记忆化搜索=>动态规划+二分】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

2023年4月份上新的目标检测系列论文(附下载链接)

来源&#xff1a;投稿 作者&#xff1a;王老师 编辑&#xff1a;学姐 目标检测-预训练相关 论文标题&#xff1a;DetCLIPv2: Scalable Open-Vocabulary Object Detection Pre-training via Word-Region Alignment 论文链接&#xff1a; https://arxiv.org/abs/2304.04514代码链…

Auto-GPT免费尝鲜之初体验-使用攻略和总结

Auto-GPT免费尝鲜之初体验-使用攻略和总结 写在前面的废话一、部署 Auto-GPT二、试运行 Auto-GPT三、我踩过的坑四、后续探索 写在前面的废话 ChatGPT 的交互模式&#xff0c;是和一个 “人” 对话聊天。 如果你想了解更多ChatGPT和AI绘画的相关知识&#xff0c;请参考&#…

【代码调试】《Frustratingly Simple Few-Shot Object Detection》

更多问题可参考&#xff1a; https://blog.csdn.net/qiankendeNMY/article/details/128450196 论文地址&#xff1a;https://arxiv.org/abs/2003.06957 论文代码&#xff1a;https://github.com/ucbdrive/few-shot-object-detection 我的配置&#xff1a; Python &#xff1a…

从零开始,详解亚马逊店铺注册流程及技巧指南

近几年跨境电商的势头越来越猛&#xff0c;所以很多新手都想去闯荡一番。很多人的第一选择都是亚马逊&#xff0c;毕竟亚马逊是世界上最大的电商平台之一&#xff0c;因此今天东哥就跟大家分享亚马逊店铺的注册方法&#xff0c;想在亚马逊开店的朋友不要错过&#xff01; 亚马逊…

设计模式 -- 工厂方法模式以及抽象工厂模式

前言 月是一轮明镜,晶莹剔透,代表着一张白纸(啥也不懂) 央是一片海洋,海乃百川,代表着一块海绵(吸纳万物) 泽是一柄利剑,千锤百炼,代表着千百锤炼(输入输出) 月央泽,学习的一种过程,从白纸->吸收各种知识->不断输入输出变成自己的内容 希望大家一起坚持这个过程,也同…

Mysql MVCC实现

文章目录 背景MVCC定义快照读和当前读当前读快照读 MVCC实现原理隐式字段undo log版本链1.插入一条记录2.修改记录3.修改记录 Read View读视图属性&#xff1a;Read View可见性算法 隔离级别长事务为什么要避免长事务 背景 并发事务可能产生的问题&#xff1a; 读读&#xff…

zk111111111111111111

Zookeeper 1 zookeeper(作为 dubbo 的注册中心): 概述: zookeper 是 一个分布式的、开源的分布式应用程序的协调服务,管理分布式应 用 作用: 配置管理,分布式锁,集群管理 2 zookeeper 的安装 (dubbo 的资料中已经整理) 3 zookeeper 的数据模型 zookeeper 是一个树形的服…