Administrator
发布于 2025-08-29 / 23 阅读
1
0

检讨:关于我在公共类写了特判

此处不贴公司代码

案发地点是FloatTips,

我是怎么找到这里的:从触发了物品使用开始

这里发送使用数据给到服务器,这里其实就断了

但是有弹框,思路是找谁去调了弹框(应该是服务器再发来消息,传一个回调)

在写提示能连续点击时,我用到了这个FloatTips,就去找到了FloatTips.cs,这里其实就找到了,然后打断点从这里往上找是谁给str的赋值,因为BgDisplay是有可能会相同的,一路跳转(调用堆栈一步一步往上)

这里我一开是以为是服务器发的字段,但实际是读的cfg,配置表来的

如果一定要改,那我觉得应该是在FloatTip是中修改,因为往下传的参数就只有str和BgDisplay了,但是又是一个公共方法不止这个地方会改(只要服务器发的回的是这个消息,就必然会走这里),我就求助了我万能的导师。

最后是跟策划协商,说不用使用道具了,要重新做了,完蛋了~~

反思:这里的对str的特判不能够识别出是由于点击一键升级而使用的道具,这样屏蔽会使在别的部分使用道具受到影响,策划去删掉 CTypTxtArgs_ssiss也是同样

补充 为什么不推荐直接控制一个公共类

在MechaDetailPanel中使用bugMechaDetail单例传入is_CloseSpeedUpAndLayout和直接在数据传入这个值有什么区别

目的:为了控制公共弹框的部分UI的显隐

这样做的坏处

1.is_CloseSpeedUpAndLayout不参与第一次初始化刷新,会使部分UI突然消失,当做实例赋值后,还要再加刷新

2.其次应该叫public的坏处,C# new出来的代码都是在堆区赋值都是引用,取同一个地方的引用会导致代码以最后一次修改为准,要严格考虑执行顺序,或者保证引用为1,即单例模式,以private读取,只有初始化或者特定的修改方法可以访问,会好改代码,

思考怎么去解决对于公共类的修改

方向:阻止显示

1.客户端本地修改:我们要做到阻止其显示,那就是在数据传输的出过来的中途,阻止它调到FloatTip,又不能够影响原有逻辑。但是直接以str的内容来判断,不够精确,需要其它额外的讯息,

1这个讯息可以来自服务器/客户端

1.1客户端给服务器发送使用道具时,加一个额外的字段,服务器收到再回,这样在可以根据这个额外的字段判断是否要显示,服务器要改协议

1.2那客户端能本地设置一个变量/方法做到这样吗?逻辑的调用顺序是按钮按下--》消耗道具-》显示,这里的发消息是异步操作,接受到的回调也是异步,对于经验卡类型,一共就六种,那在消耗道具处,开一个数组记录消耗的道具数量,然后在显示时,看这个数组是不是还有对应的数,有就去减少,其修改只在消耗道具,应该能保证限定

2.使用道具的时间延缓,或者说当点击按钮时,阻塞消息的发送/接受/显示,等点击结束后,将数据只集中在一次消息发送中,可以弹出,但只弹出一次

方向:不用道具

1.所以的经验卡到手那一刻,直接变作经验,客户端和服务器维护好这个一个值的跟新即可,经验的获取变为经验既可以在客户端写(做同步)也能在服务器写

如何查找

最重要的主旨是想要从代码中得到什么

一般来说,我们是可以找到一个中间位置(像是按钮的点击事件,弹出的UI框的名称,使用某个公共组件(CommandShow这种))。无论是显示层入手还是对应代码,是可以找到相关的代码,但不一定是我们要做修改的位置。这个时候就要用到调试,我们想找,谁调用了当前位置的代码,便可以在调用堆栈往上找。想继续看这个地方往下的运行,就逐行的放代码。同时注意更改断点的位置,还有当前变量的赋值信息。大部分情况下运行的逻辑都线性的,当出现异步/携程时要额外注意运行的顺序,相对应的就是委托和事件的调用。不看到运行时的代码,很难只通过找“名称”很难理清对应关系。当我们能够确定代码一定走到了某个位置,但我们从前面一步一步的跳到那里,又过于繁琐。便可以将断点打到那里,看它堆栈的上一步。像是CommandShow的赋值,wndmgr.show(new 公共类)出来的公共的UI,都可以在这些公共的地方打断点,虽然其引用非常多,但运行时只有当前位置才有。

当我们想要找到某些值赋值的时候,要注意变量的类型,引用类型的赋值,是会随着其传参而发生命名的变化,例如机甲经验的道具获取,就是一个list(多看点语法)。还要注意对于融合的P2部分的代码,不止在于对于虚函数的重写,还有可能重复赋了值,后面的会覆盖掉前面的,像是收藏品的描述那里,重复写了三遍。修改完后,代码运行时也可以根据unity的报错,报空来找代码位置。值的来源归根揭底是读表/服务器发来的,理清楚对值的操作也很重要

当我想要找某个方法的用法时,想要模仿/换皮/重写某个地方,可以问策划哪里有和这个功能类似的UI,去找代码看。说来也简单,就是想清楚这个地方的值是从哪里来的,做了怎么样的处理,又传给了谁,我想要复刻的话需要怎么对应,或者干脆把某些地方的private改为public,或者能不能把其中的一些方法提取出来当成公共的。还要考虑是X2还是P2的环境,中间转换需要经过UIBridge


评论