当前位置: 首页 > news >正文

Unity Console 窗口输出对齐

起因:做了个工具在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 thenreturn true,2elsereturn false,1end
endlocal function Utf8StringLen(str)local len = 0local strTab = StringToUtf8Table(str)for i, v in ipairs(strTab) doif IsChineseChar(v) thenlen = len + 12elselen = len + _ConsoleCharWidth[v] or 3 -- 3 is width of spaceendendreturn len
endlocal longestStr = ""
for k, v in pairs(_QuickJumpTab) dolocal fileStr = GetFileLine(v)if Utf8StringLen(fileStr) > Utf8StringLen(longestStr) thenlongestStr = fileStrend
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 thenreturn strendlocal spaceLen = len - strLenlocal needFillCount = max(spaceLen,1)if not fillStr thenfillStr = " "needFillCount = needFillCount/_ConsoleCharWidth[fillStr]endlocal spaceStr = string.rep(fillStr,ceil(needFillCount))if align == "right" thenreturn concat({str,spaceStr})elsereturn concat({spaceStr,str})end
endlocal exSymbolLen = _ConsoleCharWidth[":"] + _ConsoleCharWidth["["] + _ConsoleCharWidth["]"]local _WrapDebugStr = function(file,line,des,fileColor,lineColor)fileColor = fileColor or "#CA550C"--"cyan"lineColor = lineColor or "#00FFFF"local maxFileLen = longestStrLen+8local 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 + exSymbolLenif des thenlocal colorLen = Utf8StringLen("<color=white></color>")des = _wrapColor("white",des)des = FillLen(des,(maxFileLen+colorLen)/fillCharWidth,"right",desFillStr)elsedes = FillLen("",maxFileLen/fillCharWidth,"left",desFillStr)endstr = 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,
}

相关文章:

Unity Console 窗口输出对齐

起因&#xff1a;做了个工具在console窗口罗列一些信息&#xff0c;基本结构是 [ 文件名 &#xff1a;行号 ]&#xff0c;因为文件&#xff0c;行号长度不一&#xff0c;想要做到如下效果。 初步尝试&#xff0c;用以下方法&#xff1a; string format "{0,-10} …...

leetcode198_打家劫舍

思路 动态规划 func rob(nums []int) int {if len(nums) < 2 {return nums[0]}// dp[i] 表示到第i家为止&#xff0c;小偷能够偷窃到的最高金额dp : make([]int, len(nums))dp[0] nums[0]dp[1] max(nums[0], nums[1])for i:2; i<len(nums); i {if nums[i] dp[i-2] &…...

C# 串口通讯怎么防止数据丢失

串口通信&#xff08;Serial Communication&#xff09;是计算机与设备之间进行数据交换的一种方式。在C#中进行串口通信时&#xff0c;防止数据丢失可以采取以下一些措施&#xff1a; 1.校验和&#xff08;Checksum&#xff09;&#xff1a;在发送数据时&#xff0c;计算数据的…...

【机器学习】BP神经网络中的链式法则:解开智能背后的数学奥秘

在浩瀚的机器学习领域中&#xff0c;BP&#xff08;反向传播&#xff09;神经网络如同一座桥梁&#xff0c;连接着复杂的数据世界与智能的彼岸。而这座桥梁的基石之一&#xff0c;便是链式法则&#xff08;Chain Rule&#xff09;——一个看似简单却蕴含无限智慧的数学原理。今…...

MyBatis 基本操作 - 注解版

目录 一&#xff0c;查询 - select 1.1 全列查询 1.2 指定列查询 1.3 赋值问题 方法一&#xff1a;起别名 方法二&#xff1a;结果映射 方法三&#xff1a;添加配置 二&#xff0c;新增 - Insert 2.1 使用对象插入 2.2 获取主键 三&#xff0c;删除 - Delete 四&am…...

专业比例阀放大器配套选型

比例阀放大器作为液压系统中的关键组件&#xff0c;其技术选型对于保障系统的精确控制、稳定性和长期可靠性至关重要。下面将深入探讨比例阀放大器的技术选型要点&#xff0c;确保选型能满足特定的应用需求和系统性能要求&#xff1a; 兼容性与安装方式 阀型匹配&#xff1a;…...

Springboot 多数据源整合的三种方式

上链接&#xff1a;Springboot 多数据源整合的三种方式_springboot整合多数据源-CSDN博客...

【科研笔记】中国知网高级检索与专业检索针对同一检索内容返回的结果对比

中国知网高级检索与专业检索针对同一检索内容返回的结果对比 文献检索文献差集文献检索 预检索“复杂网络”和“事故”相关主题的文献,在高级检索界面中搜寻的结果如下,期刊选择为中文核心及以上,共检索138条文献 然后以专业检索,构建检索式“ (SU=‘事故’) AND (SU=‘复…...

C#-了解IOC控制反转及相关框架的使用

目录 一、了解IOC 1、概念 2、生命周期 二、使用 三、扩展-CommunityToolkit.Mvvm工具包 Messenger信使 方式一&#xff08;收发消息&#xff09; 方式二&#xff08;收发消息&#xff09; 方式三&#xff08;请求消息&#xff09; 一、了解IOC IOC&#xff0c;即控制…...

CSDN机器人与僵shi粉测试(真人看看)

​哈哈哈一起玩个游戏 发现老是莫名其妙有很多关注点赞与收藏&#xff0c;关注的几百个人应该都是机器人 此博文用于检测平台机器人阅读量 —>如果是真人请务必随便留言<— 可以根据阅读量与评论判断机器人数量 不用点赞收藏有机器人就行 机器人统一特征是在2019年左右…...

【C/C++ 多态中的虚函数的虚函数表】详细的了解一下吧(要先知道有虚函数表

多态是面向对象程序设计中的一个重要特性,它允许不同类的对象对同一消息作出响应。在C++中,多态的实现主要依赖于虚函数和虚函数表。以下是对多态中虚函数表的详细描述: 一、虚函数表的概念 虚函数表(Virtual Function Table,简称VTable)是C++中用于支持多态性的一个关…...

基于树莓派4B设计的智能家居控制系统(阿里云IOT)(203)

文章目录 一、前言1.1 项目介绍【1】项目功能介绍【2】设计实现的功能【3】项目硬件模块组成1.2 设计思路1.3 项目开发背景【1】选题的意义【2】可行性分析【3】参考文献1.4 开发工具的选择【1】设备端开发【2】上位机开发1.5 系统框架图1.6 系统功能总结1.7 系统原理图1.8 硬件…...

太阳能光伏气象站的功能优势

太阳能光伏气象站为光伏产业的智能化、高效化发展提供了强有力的支持。 首先&#xff0c;该气象站能够全面采集多种关键气象要素&#xff0c;包括太阳倾斜辐射、日照时数、太阳总辐射、直接辐射、散射辐射等太阳辐射数据&#xff0c;以及风速、风向、百叶盒温湿度、大气压力、…...

LVS(Linux Virtual Server)负载均衡详解

一、LVS简介与集群概念 1. LVS&#xff08;Linux Virtual Server&#xff09; 即Linux虚拟服务器&#xff0c;是一个高性能、高可用的服务器集群解决方案&#xff0c;现已集成至Linux内核中。它通过IP虚拟化技术通过将网络流量分散到多个服务器上&#xff0c;从而提高网络服务…...

C语言 | Leetcode C语言题解之第329题矩阵中的最长递增路径

题目&#xff1a; 题解&#xff1a; const int dirs[4][2] {{-1, 0}, {1, 0}, {0, -1}, {0, 1}}; int rows, columns;typedef struct point {int x, y; } point;int longestIncreasingPath(int** matrix, int matrixSize, int* matrixColSize) {if (matrixSize 0 || matrixC…...

rabbitmq学习记录

同步和异步 &#xff08;1&#xff09;同步&#xff08;按照流程一步一步做&#xff09;使用openfengin传统的交互 响应时间长&#xff0c;需要将每一步的时间加起来。如果一个环境出错了&#xff0c;整个就报错了。并发压力大&#xff0c;前边的步骤有多大的并发量&#xff…...

MySQL数据库基础:约束

&#x1f48e;我的主页&#xff1a;MySQL &#x1f48e;1. 约束的概述 约束是作用于表中字段的规则&#xff0c;用于限制存储在表中的数据 目的&#xff1a;保证数据库中数据的正确性&#xff0c;有效性和完整性 &#x1f48e;2. 约束的分类 &#x1f48e;2.1 非空约束 非空…...

Java设计模式和AOP编程

Java 六大设计原则&#xff1b;Java 23种设计模式&#xff08;在此介绍三种设计模式&#xff09; Java设计模式 单例模式 应用场景&#xff1a;spring中bean的作用域用的就是单例模式 //基本的单例模式————懒汉式 public class student {//3.创建static修饰的成员变量p…...

【扒代码】data.py

数据增强函数 import torch from torchvision.transforms import functional as TVFdef tiling_augmentation(img, bboxes, density_map, resize, jitter, tile_size, hflip_p):# 定义一个辅助函数&#xff0c;用于根据给定的概率水平翻转张量def apply_hflip(tensor, apply)…...

【时时三省】unity test 测试框架 介绍(适用于C语言进行测试的)

山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 目录 1,关于 unity test 测试框架的介绍 2,测试框架关于源码的介绍 3,使用unity test测试C代码 4,常用断言举例 1,关于 unity test 测试框架的介绍 unity test 是 ThrowTheSwitch.org 的一个主要工程。它…...

智慧医疗能源事业线深度画像分析(上)

引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

聊一聊接口测试的意义有哪些?

目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开&#xff0c;首…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

什么是Ansible Jinja2

理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具&#xff0c;可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板&#xff0c;允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板&#xff0c;并通…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机

这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机&#xff0c;因为在使用过程中发现 Airsim 对外部监控相机的描述模糊&#xff0c;而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置&#xff0c;最后在源码示例中找到了&#xff0c;所以感…...

day36-多路IO复用

一、基本概念 &#xff08;服务器多客户端模型&#xff09; 定义&#xff1a;单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用&#xff1a;应用程序通常需要处理来自多条事件流中的事件&#xff0c;比如我现在用的电脑&#xff0c;需要同时处理键盘鼠标…...

tomcat入门

1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效&#xff0c;稳定&#xff0c;易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...

深入浅出Diffusion模型:从原理到实践的全方位教程

I. 引言&#xff1a;生成式AI的黎明 – Diffusion模型是什么&#xff1f; 近年来&#xff0c;生成式人工智能&#xff08;Generative AI&#xff09;领域取得了爆炸性的进展&#xff0c;模型能够根据简单的文本提示创作出逼真的图像、连贯的文本&#xff0c;乃至更多令人惊叹的…...