解决的BUG:
本周共解决12个比较轻微的BUG,其中值得拿出来讲的有如下几个:
1.指挥室舰队更名时使用谷歌输入法中的表情后显示乱码且可以修改成功
Unity的InputFiled连续输入两个emoji时出现的问题,可以详细研究。解决方案即为直接屏蔽即可。
2.点击穿透问题
增加一个Mask即可解决。
Unity中的UI渲染,越上方的物件越先渲染,因此Mask一定要放在组件上方。
为Mask绑定一个空的CloseSelfButton组件即可达到点击Mask关闭当前页面的效果。
是通过UGuiFormController(这是UI脚本的基类)脚本的如下代码实现的:
CloseSelfButton[] closeSelfBtns = CachedGameObject.GetComponentsInChildren<CloseSelfButton>();
for(int i = 0; i < closeSelfBtns.Length; i++)
{
closeSelfBtns[i].onClick.AddListener(CloseSelfClick);
}
3.在搜索资源定位后,没有显示距离按钮
逻辑的触发,要么通过函数调用,要么通过事件系统。这里就是资源定位后,发射一个事件使距离按钮显示出来即可。
4.网络连接失败界面上确认按钮无法点击
是因为按钮的父节点没有绑定Graphic Raycaster这个组件。
这个组件是干什么的?
5.抽卡后安排上阵,显示错位
这个BUG的解决涉及了对象池的使用以及UI的排版。
这个问题产生的原因是:使用Layout Group的对象,存入到了对象池中。对象池不仅存入了该对象,还存入了对象的锚点,位置等等信息。如果拿出来直接使用,对象的位置就会出现偏差。因此拿出来使用的时候又要为其父节点设置Layout Group.
对象池的使用:todo。
学习:
1.定时器以及进度条
huisedi:灰色底色
progressImage_Img:进度条的颜色 绑定了Progress Bar脚本
DownTime_Txt:剩余时间文本 绑定了 Common Timer脚本,这个脚本中的Progress Bar字段拖入了上面说的progressImage_Img物体
RemainingTimeStatic_Txt:说明文本,例如“剩余”,“距离xx还剩下”等等这些文本
progress bar:
除了前景图,大小,位置等,有两个重要的变量
public Transform[] ProgressPointers;//进度指针
public float Progress { get; private set; } //进度
有两个核心方法:
1.Update Pointer 更新指针:把数组里面的每个指针设置到进度所在的位置
2.Set Progress 设置进度: 设置一个进度值(0与1之间)
CommonTimer类:继承自monobehavior类 绑定在组件上
有一个progressbar 还有一个时间显示
核心方法1:StratTimer:
public void StartTimer(float timeLeft, float totalTime, float tick, Action tickAction = null)
{
m_StaticText = false;
m_StartTicks = DateTime.Now.Ticks;
m_Tick = tick;
m_RoundNumber = 0;
m_TickFunction = tickAction;
m_TimeLeft = timeLeft;
m_TotalTime = totalTime;
m_ElapsedTime = IsCountDown ? totalTime - timeLeft : timeLeft;
RefreshText(m_ElapsedTime);
RefresProgress(m_ElapsedTime);
}
2.UI和UIFormControllor是怎么联系起来的
每个UI被控制,不是通过挂载继承mb类的脚本控制的。
而是首先,挂载一个空的ControllerHook脚本,在打开UI的时候,首先加载Asset,随后通过Hook获取到UI对象,然后通过UI对象的名称,获取到UIFormController(在脚本中写好的:在UIForm基类中的OnInit方法里面获得的),再依次执行UIFormControllor中的onUnit,onOpen,onUpdate等函数以完成UI中的各种逻辑。
而UI中的各种组件的获取,是通过UI绑定的Reference Collector脚本获取到的。
通过这种方式,在不使用mb的前提下,完成了UI的各种逻辑操作。
3.方法第一个参数this
这是C#扩展方法的用法
例如:
public static class StringExtension
{
public static void Foo(this string s)
{
Console.WriteLine("Foo invoked for {0}", s);
}
}
这个扩展方法在静态类中声明,定义一个静态方法,其中第一个参数定义可它的扩展类型。Foo()方法扩展了String类,因为它的第一个参数定义了String类型,为了区分扩展方法和一般的静态方法,扩展方法还需要给第一个参数使用this关键字。
现在就可以使用带string类型的Foo方法了:
string s=“Hello”; s.Foo();
4.多Tab
首先获取到每一个Tab的按钮,为每个按钮绑定点击事件
// 初始化按钮列表
m_ButtonRcList = m_ButtonGroup.GetComponentsInChildren<ReferenceCollector>();
for (int i = 0; i < m_ButtonRcList.Length; ++i)
{
var rc = m_ButtonRcList[i];
rc.Refresh();
int index = i;
var btn = rc.Get<CommonButton>("Button");
if (btn != null)
btn.onClick.AddListener(() => { SelectedButton(index); });
}
在点击事件里面,控制各种属性的显隐,界面的更替。
5.服务器与客户端的信息交互存放于
.\Tools\Res\MsgProto\ClientAndServer
文件夹中,从此可以得知每个传送的信息里面包含的具体数据