不知道你们在使用Unity中有没有遇到一些奇奇怪怪Bug,总是找不到问题原因。今天也是闲下来想总结一些经验之谈。
1.TextMeshPro InputField组件获取内容时有特殊不可见字符
之前在做一个手游Demo时,因为是MMO类型的。在做服务器登录模块时,在Client先进行了一次正则匹配。获取用户输入的账号,密码进行正则匹配时发现总是匹配失败。刚开始还以为是正则写错了,但是用Debug打印时又是能匹配上的。后面想了好久也没解决这个问题。直到后面在进行对一些用户的信息进行储存到数据库时,发现了数据库中的一个“?”,肯定知道是有乱码了,而且只有在末尾才有的这个,说明在获取用户输入时处在乱码。后面写了一个字节分析器,结果发现了这几个乱码226 139 128,(我用的是UTF-8编码格式)。之后写了一个方法将这几个字符过滤出来,然后再进行正则匹配时发现就匹配成功了,数据库中也没有乱码了~~
/**
* 去掉字符串中的含有特殊字符 226 139 128
*/
public static string GetStandardStr(string str)
{
byte[] bs = Encoding.UTF8.GetBytes(str);
int leg = bs.Length;
int k = 0;
int m = 0;
for (int i = 0; i < leg; i++)
{
byte b = bs[i];
if (b == 128 || b == 139 || b == 226) ++k;
}
byte[] ret = new byte[leg - k];
for (int i = 0; i < leg; i++)
{
byte b = bs[i];
if (b == 128 || b == 139 || b == 226) continue;
ret[m] = b;
++m;
}
return Encoding.UTF8.GetString(ret);
}
不知道你们有没有遇到这个问题,emmmmm,奇奇怪怪。
2.克隆一个UI后将其设置为某个游戏物体的子物体后位置总是与在编辑时设置的不一样
这个问题刚开始时总是觉得很奇怪,即使修改localPosition,position都没有,不管怎么修改就是没有。后面在测试时终于发现这个问题的原因了:就是UI的锚点不同导致。由于父物体的布局与子物体不同,将克隆出来的子物体设置为父物体的子物体时导致它的锚点坐标anchoredPosition3D,anchoredPosition位置发生变化,与预制体的不同,因此UI呈现的位置也发生了改变,总是与在编辑器下直接拖动预制体到父物体下面的位置显示不同。解决问题就是在将克隆物体设置父物体后再手动设置一下上面两个值与预制体的值一致即可。
/// <summary>
/// 设置克隆体与预制体一致如果有父物体,应该先设置父物体再进行比例,位置调整
/// </summary>
/// <param name="prefab">预制体</param>
/// <param name="clone">克隆体</param>
/// <param name="parent">父物体</param>
private void SetCloneAsSameWithPrefab(GameObject prefab,GameObject clone,GameObject parent) {
Vector3 anchoredPos = prefab.transform.GetComponent<RectTransform().anchoredPosition;
if (parent != null)
{
clone.transform.SetParent(parent.transform);
}
clone.transform.localScale = prefab.transform.localScale;//防止变形
clone.transform.GetComponent<RectTransform>().anchoredPosition3D = anchoredPos;
}
今天就先总结到这里吧,后面有时间再分享一些其他关于Unity开发的一些经验咯。