unity开发遇到的问题和解决方法相关汇总

文章记录了Unity3DUI系统UGUI在开发过程中遇到的问题,包括锚点和坐标设置、ToggleGroup的控制、InputField的文本同步以及Mask组件的锯齿化问题。同时,也提出了编辑器开发中删除GameObject、实例化对象的注意事项,以及灯光阴影设置和C#事件注册的解决办法。此外,还涉及了全面屏适配和TextMeshProUGUI的描边颜色设置。
摘要由CSDN通过智能技术生成

在开发游戏的过程中,总会遇到一些问题,但是解决了,没有记录解决方法,时间间隔又久,后面再遇到,又要趟一次坑…,所以先在这里记录一下,后面遇到就可以直接在这里来看解决方法了:

这篇文章是不定时更新的,遇到一次坑,更新一次。

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;
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值