在开发游戏的过程中,总会遇到一些问题,但是解决了,没有记录解决方法,时间间隔又久,后面再遇到,又要趟一次坑…,所以先在这里记录一下,后面遇到就可以直接在这里来看解决方法了:
这篇文章是不定时更新的,遇到一次坑,更新一次。
ugui相关:
1.ugui锚点pivot和锚框anchor动态修改后,动态设置localPosition会出现实际坐标与设置坐标不一样的问题:
使用RectTransform的anchoredPosition设置坐标,使用sizeDelta设置大小就可以了
RectTransform rect = img.gameObject.GetComponent<RectTransform>();
rect.anchorMin = new Vector2(0, 0);
rect.anchorMax = new Vector2(0, 0);
rect.pivot = new Vector2(0, 0.5f);
rect.anchoredPosition = new Vector3(0, 64.5f);
rect.sizeDelta = new Vector2(80, 80);
2.ugui组件Toggle Group控制的Toggle,会有两个选中Ison=true
这个问题我才发现,代码可以设置Toggle的SetActive为false的Ison 的状态,但是如果Toggle Group控制的多个Toggle中,其中有Toggle 的SetActive为false状态时,Toggle Group就控制不了这个Toggle了。
如果使用for进行循环遍历Toggle,并查找其中Ison 为true的Toggle,那么可能你会找到多个Ison 为true的Toggle…
所有遍历时应该需要添加Toggle.gameObject.activeSelf == false
进行过滤,不然就会逻辑出错
3.ugui组件InputField组件onValueChanged中获取InputField.text和InputField.textComponent.text不一致
同一帧内获取InputField.text和InputField.textComponent.text得到的输入字符串不一样,就算直接获取textComponent绑定的Text组件也是不一样的
local tst = self.nameText.textComponent.text ---输出的是“a”
local tst3 = self.nameText.text ---输出的是“aa”
解决方法:
使用ForceLabelUpdate方法强制刷新一下
没刷新前:
刷新后:
4.UGUI使用Mask组件时图片边缘锯齿化严重
mask的工作原理是根据alpha通道来计算,如果一个像素点里面是全透明的,那么做成mask之后这个点就不会透视看到下面的物体,如果这个像素点里不是全透明的,即完全不透明或者半透明,那么做成Mask之后这个点就可以透视看到下面一层的物体
解决方案:使用unity自带的默认round图形或者纯色图形填充
编辑器开发相关
1.删除GameObject时必须使用
GameObject.DestroyImmediate(gameobject, true)
方法才能删除组件,参数1:gameobject组件对象,参数2:是否允许销毁资源。
不能使用:GameObject.Destroy(gameobject)
,这个删除不了Editor模式下的资源
2.实例化对象:Instantiate
编辑器模式实例化对象无法保存,需要添加:EditorUtility.SetDirty(obj)
方法
GameObject obj = GameObject.Instantiate(levelPrefab, levelNode.transform);
EditorUtility.SetDirty(obj);
unity组件相关
Light :
设置灯光阴影类型:(ps:并没有this.gameObject.GetComponent().shadowType的参数= =)
this.gameObject.GetComponent<Light>().shadows = LightShadows.Soft;
杂项:
1.部分手机会出现顶部黑边情况
手机可能是全面屏手机,需要在AndroidManifest.xml 添加:
<meta-data android:name="android.max_aspect" android:value="2.2"/>
参考:unity安卓如何适配全面屏?
Player Settings 窗口中的“Resolution and Presentation”选项卡来设置游戏的屏幕分辨率,以适配不同的显示设备。设置游戏窗口模式,并根据需要调整窗口大小和位置。一般设置参数:
2.c#使用匿名委托循环注册事件报错:数组索引超界(参考)
public class test : MonoBehaviour
{
public List<Button> btlist;
// Start is called before the first frame update
void Start()
{
if (btlist.Count <= 0)
{
return;
}
for (int i = 0; i < btlist.Count; i++)
{
btlist[i].onClick.AddListener(() =>
{
print("list btn i:" + btlist[i].gameObject.name);
});
}
}
}
报错:ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index
将i提成变量就可以了
...
for (int i = 0; i < btlist.Count; i++)
{
int index = i;
btlist[i].onClick.AddListener(() =>
{
print("list btn i:" + btlist[index].gameObject.name);
});
}
...
TextMeshProUGUI设置OutlineColor描边颜色:
需要使用curOutlineColor 设置,而不是OutlineColor设置描边颜色
TextMeshProUGUI txt = new TextMeshProUGUI();
txt.curOutlineColor = Color.white;