Unity Console 窗口输出对齐

news2024/9/25 3:25:26

起因:做了个工具在console窗口罗列一些信息,基本结构是 [ 文件名        :行号 ],因为文件,行号长度不一,想要做到如下效果。

初步尝试,用以下方法:

string format = "{0,-10} {1,5}";  // -10 表示左对齐,10个字符宽;5 表示右对齐,5个字符宽
Debug.Log(string.Format(format, "File", "Line"));
Debug.Log(string.Format(format, "UI/Titan/UI_Titan_Main", "1"));
Debug.Log(string.Format(format, "Utils/GlobalFunction", "8"));

实际效果如下:

竟然没对齐?拷贝到IntelliJ 里查看

Utils/GlobalFunction                              |        :8
Lua/HookReloadLuaFuc                              |       :35
Lua/HookReloadLuaFuc                              |     :1290

IntelliJ用了等宽字符,所以看起来是对齐的。

后续就简单了,拿到console里字体的宽度就行了。

这里贴一个大概的实现,宽度表放在最后

一个简单的lua实现

local _QuickJumpTab = {
    "Utils/GlobalFunction:8",
    "Lua/HookReloadLuaFuc:35:print_table",
    "Lua/HookReloadLuaFuc:1290:print_table",
    "UI/Titan/TitanUtil:10:泰坦相关Gid",
}

local function GetFileLine(str)
    local strTab = split(str,":")
    return unpack(strTab)
end

-- 判断是否是中文字符 并且返回字符长度
local function IsChineseChar(char)
    local byte = string.byte(char)
    if byte >= 0x80 then
        return true,2
    else
        return false,1
    end
end

local function Utf8StringLen(str)
    local len = 0
    local strTab = StringToUtf8Table(str)
    for i, v in ipairs(strTab) do
        if IsChineseChar(v) then
            len = len + 12
        else
            len = len + _ConsoleCharWidth[v] or 3 -- 3 is width of space
        end
    end
    return len
end

local longestStr = ""
for k, v in pairs(_QuickJumpTab) do
    local fileStr = GetFileLine(v)
    if Utf8StringLen(fileStr) > Utf8StringLen(longestStr) then
        longestStr = fileStr
    end
end
local longestStrLen = Utf8StringLen(longestStr)
--logGreen("longestStrLen\t" .. longestStrLen)

local _wrapColor = function(color,str)
    return concat({"<color=",color,">",str,"</color>"})
end

-- 自己实现一个往左边或者右边加空格补齐长度的函数
-- 用于打印的时候对齐
local FillLen = function(str,len,align,fillStr)
    align = align or "left"
    local strLen = Utf8StringLen(str)
    if strLen >= len then
        return str
    end
    local spaceLen = len - strLen
    local needFillCount = max(spaceLen,1)
    if not fillStr then
        fillStr = " "
        needFillCount = needFillCount/_ConsoleCharWidth[fillStr]
    end
    local spaceStr = string.rep(fillStr,ceil(needFillCount))
    if align == "right" then
        return concat({str,spaceStr})
    else
        return concat({spaceStr,str})
    end
end

local exSymbolLen = _ConsoleCharWidth[":"] + _ConsoleCharWidth["["] + _ConsoleCharWidth["]"]

local _WrapDebugStr = function(file,line,des,fileColor,lineColor)
    fileColor = fileColor or "#CA550C"
    --"cyan"
    lineColor = lineColor or "#00FFFF"
    local maxFileLen = longestStrLen+8
    local fileStr = FillLen(file,maxFileLen,"right")
    local lineStr = FillLen(":" .. line,36,"left")
    fileStr = _wrapColor(fileColor,fileStr)
    lineStr = _wrapColor(lineColor,lineStr)
    local desFillStr = "-"
    local fillCharWidth = _ConsoleCharWidth[desFillStr]
    maxFileLen = maxFileLen + 36 + exSymbolLen
    if des then
        local colorLen = Utf8StringLen("<color=white></color>")
        des = _wrapColor("white",des)
        des = FillLen(des,(maxFileLen+colorLen)/fillCharWidth,"right",desFillStr)
    else
        des = FillLen("",maxFileLen/fillCharWidth,"left",desFillStr)
    end
    str = format("[%s%s]\n%s",fileStr,lineStr,des)
    return str
end
_ConsoleCharWidth = {
    [" "] = 3,
    ["!"] = 3,
    ["\""] = 5,
    ["#"] = 8,
    ["$"] = 7,
    ["%"] = 11,
    ["&"] = 9,
    ["'"] = 3,
    ["("] = 4,
    [")"] = 4,
    ["*"] = 6,
    ["+"] = 8,
    [","] = 3,
    ["-"] = 6, -- 4 original
    ["."] = 3,
    ["/"] = 4,
    [":"] = 3,
    [";"] = 3,
    ["<"] = 8,
    ["="] = 8,
    [">"] = 8,
    ["?"] = 7,
    ["@"] = 12,
    ["["] = 4,
    ["\\"] = 4,
    ["]"] = 4,
    ["^"] = 6,
    ["_"] = 5,
    ["`"] = 3,
    ["{"] = 5,
    ["|"] = 3,
    ["}"] = 5,
    ["~"] = 8,
    A = 8,
    B = 8,
    C = 9,
    D = 9,
    E = 7,
    F = 7,
    G = 9,
    H = 9,
    I = 3,
    J = 7,
    K = 8,
    L = 7,
    M = 11,
    N = 9,
    O = 9,
    P = 8,
    Q = 9,
    R = 8,
    S = 8,
    T = 8,
    U = 9,
    V = 8,
    W = 11,
    X = 8,
    Y = 8,
    Z = 8,
    a = 7,
    b = 7,
    c = 7,
    d = 7,
    e = 7,
    f = 4,
    g = 7,
    h = 7,
    i = 3,
    j = 3,
    k = 7,
    l = 3,
    m = 10,
    n = 7,
    o = 7,
    p = 7,
    q = 7,
    r = 4,
    s = 6,
    t = 4,
    u = 7,
    v = 7,
    w = 10,
    x = 6,
    y = 6,
    z = 6,
    ["0"] = 8,
    ["1"] = 6,
    ["2"] = 7,
    ["3"] = 8,
    ["4"] = 8,
    ["5"] = 7,
    ["6"] = 7,
    ["7"] = 7,
    ["8"] = 7,
    ["9"] = 7,
}

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

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

相关文章

凯伦股份子公司中标中建八局发展建设分公司年度多项工程集采

近日&#xff0c;凯伦股份旗下全资子公司——苏州凯瑞伦建筑工程有限公司凭借其卓越的专业素养和服务能力&#xff0c;顺利中标中国建筑第八工程局有限公司发展建设分公司-北京分公司2024年度-北京、天津、河北、内蒙等区域防水工程集采。 中国建筑第八工程局有限公司发展建设分…

书生大模型实战营-入门关卡-Linux 前置基础

任务&#xff1a;Tutorial/docs/L0/Linux at camp3 InternLM/Tutorial GitHub 完成&#xff1a;

长在客户审美点上的可视化大屏,大概率就是这个样子。

要想使可视化大屏长在客户审美点上&#xff0c;需要具备以下特征&#xff1a; 布局合理&#xff1a;有良好的整体结构和布局&#xff0c;各个元素之间的关系清晰&#xff0c;避免视觉上的混乱和杂乱无章感。信息展示清晰有序&#xff0c;重点突出&#xff0c;能够让客户快速找…

Granger-因果检验及 Stata 具体操作步骤

目录 一、文献综述 二、理论原理 三、实证模型 四、程序代码及解释 五、代码运行结果 一、文献综述 Granger 因果检验作为一种重要的时间序列分析方法&#xff0c;在众多学科领域中都发挥着关键作用&#xff0c;并引发了广泛的研究和应用。 在宏观经济学领域&#xff0c;学…

探秘C# LINQ元素运算:原理阐释与实践指南

文章目录 一、LINQ元素运算符概述二. ElementAt 和 ElementAtOrDefault三. First 和 FirstOrDefault四. Last 和 LastOrDefault五. Single 和 SingleOrDefault六. Where 和 Select七、实际应用场景示例总结 LINQ&#xff08;Language-Integrated Query&#xff09;是C#中强大且…

Linux基础IO——重定向与文件缓冲区

文章目录 重定向重定向的系统调用C语言中的FILE结构体 文件缓冲区C语言缓冲区 重定向 我们在学习Linux的基本内容时候&#xff0c;知道>> >都可以用来表示重定向&#xff0c;那么重定向的本质是什么呢&#xff0c;其实就是更改了标号为1的文件描述符 1表示标准输出&…

虚实共生:数字孪生技术引领设施农业新未来

在全球人口持续增长和气候变化日益严峻的背景下,设施农业正面临前所未有的挑战和机遇。如何在有限的资源条件下提高作物产量、质量和生产效率,成为困扰农业从业者的核心问题。随着人工智能、物联网和大数据等新兴技术的快速发展,数字化转型为设施农业带来了新的希望。其中,数字…

如何为树莓派添加人工智能超能力!

Raspberry Pi AI 套件价格实惠&#xff0c;安装简单&#xff0c;只要你能找到一个。 Adrian Kingsley-Hughes/ZDNET ZDNET 的关键要点 Raspberry Pi 基金会发布了适用于 Pi 5 的 Raspberry Pi AI 套件&#xff0c;但供应情况并不稳定。在撰写本文时&#xff0c;我在亚马逊和芝…

跟《经济学人》学英文:2024年08月03日这期 What is the point of industry awards?

What is the point of industry awards? Booze, sweat and plexiglass booze&#xff1a;美 [buz] 酒精饮料&#xff1b;烈酒&#xff1b;<俚>喝酒 sweat&#xff1a;英 [swet] 汗水&#xff1b;辛勤劳动 注意发音 plexiglass&#xff1a;美 [pleksɪˌglɑs] 树脂玻…

“消费新纪元:探索‘消费增值’的无限可能“

亲爱的顾客们&#xff0c;你们好&#xff01;今天&#xff0c;我想深入谈谈一种正在革新我们消费体验的模式——我们称之为“消费增值”。这个模式不仅仅保留了购物的乐趣&#xff0c;更在每一笔交易中融入了额外的价值&#xff0c;让消费过程焕发新生。 长久以来&#xff0c;我…

Google 高级搜索操作符

在 Google 搜索中&#xff0c;有些高级搜索操作符&#xff0c;它可以帮助你找到特定类型的文件。以下是一些常见的搜索操作符及其用途&#xff1a; filetype: — 搜索特定类型的文件。例如&#xff1a; filetype:pdf 人工智能 可以找到所有包含“人工智能”的 PDF 文件。 filet…

天机学堂 第6天 点赞逻辑

首先我们来分析整理一下点赞业务的需求&#xff0c;一个通用点赞系统需要满足下列特性&#xff1a; 通用&#xff1a;点赞业务在设计的时候不要与业务系统耦合&#xff0c;必须同时支持不同业务的点赞功能 独立&#xff1a;点赞功能是独立系统&#xff0c;并且不依赖其它服务。…

RM小陀螺技术经验与思考

移动小陀螺的原理&#xff1a; 先调好云台&#xff0c;车移动云台方向不动。然后可以用电机和底盘的机械角度来计算 涉及到两个知识点&#xff1a;速度闭环和变换矩阵。。。 把mpu的值映射到脉轮上面&#xff0c;就是说根据yaw电机编码器和mpu的差值来计算麦轮解算的x 和y的移…

开发android app用于移远模块读写IMEI 模组EC200DEULA-D08-SNNDA 支持socket连接读写IMEI

开放权限 adb kill-serveradb rootadb shell setenforce 0adb install -t app-debug.apkadb shell am start -n com.azhon.spplus/.MainActivity::F310A_WriteIMEI -DWadb.exe forward tcp:5902 tcp:5902pause写读IMEI ADB socket协议 TCP 127.0.0.1:5902 PC与终端APP之间 j…

商业数据分析PPT制作大纲系列一进入数据分析世界(需PPT私)

PART 1数据挖掘:从海量信息中淘出真金 数据挖掘是在海量的数据中发现有价值信息和知识的过程。它就像是一位经验丰富的矿工,在堆积如山的数据矿石中,精准地筛选出珍贵的金子。 引言: 数据挖掘的定义与价值技术概览: 关键算法(如决策树、K-means聚类、关联规则); 步骤…

简单搭建vue项目

1.先安装node.js和vite&#xff0c;具体参考&#xff1a; 2.管理员身份运行cmd&#xff0c;跳转到node安装目录&#xff1a; 输入&#xff1a; npm create vitelatest 输入项目名称&#xff0c;选择vue和JavaScript 2.VisualStudioCode打开(可能需要管理员权限)创建的文件夹,点…

Sqlserver 备份表

Sqlserver 备份表 1、右键数据库->任务->生成脚本 2、在引导界面点击下一步 3、选择需要导出的表 4、在高级里面选择备份数据与架构&#xff0c;然后再单选每个对象一个文件 每个对象一个文件是有多个表的情况下备份成多个文件&#xff0c;否则所有表都在一个文件中 架…

告别盲目找货!以图搜货神器,精准定位全网低价同款货源

做生意进入图搜源头时代&#xff0c;图搜进货实现了商机“所见即所得”。一位短视频平台的服装商家说&#xff0c;平时她看到同行的一个爆款&#xff0c;不好意思打听货源&#xff0c;也很难打听到&#xff0c;现在只要截个图一搜&#xff0c;就能找到1688对应的源头工厂。 今…

【第17章】Spring Cloud之Gateway服务调用

文章目录 前言一、用户服务二、网关服务1. 负载均衡2. 服务调用3. 登录拦截器 三、单元测试1. 启动服务2. 用户不存在3. 正常登录 总结 前言 在上一章我们使用JWT简单完成了用户认证&#xff0c;【第16章】Spring Cloud之Gateway全局过滤器(安全认证)&#xff0c;上一章内容已…

Node.js是什么?如何安装

目录 一、前言 1、JavaScript语言-----前端开发 2、JavaScript语言-----后端开发 总结&#xff1a;如果我们写了一段 js 代码&#xff0c;把他放到浏览器中执行&#xff0c;是在做前端开发&#xff1b;如果放在Node.js下运行&#xff0c;是在做后端开发。 二、安装 1、打开…