总结一下自己初识Unity时犯的基础错误和遇到的一些小bug 链接到标题

1,unity 新建项目后出现闪屏现象

省流:进入project setting修改:

  • edit –> project Settings –> player –> other settings –> color space –> Linear

可参考:unity3d莫名出现闪屏现象

2,在 unity2d 项目中,建立好 Tilemap 后报错且无法进行绘制

显示 “Active Tilemap Nothing” 而无法在Scene窗口中进行绘制

  • 是因为没有在Hierachy(Scene)中创建Tilemap

3,button 组件中 OnClick 读取不到想要的函数

不能直接把脚本拖进去!!

  • 把对应脚本拖到游戏物体上,再把游戏物体拖进去

4,在 unity 和 vs 双开的过程中,屏幕上不停出现“向上还原”的提示且关闭unity后才会消除

待解决……

  • ps:经测试,关闭vs后提示会消除

5,unity 中 deltaTime 的概念

可参考:Unity增量时间Time.deltaTime详解

6,UI 自适应问题相关参考

待进一步研究中……

在设置好UI组件的锚点之后还要修改Canvas Scaler

可参考:unity解决UI组件在屏幕放大时位置变化的问题

Unity3D-关于项目的屏幕适配(看我就够了)

7,Unity 项目中跳转场景后,随着跳转次数增加,新的 is loading 场景不断增加,最后导致跳转一次场景的加载时间变得巨————长————————

运行途中截图:

bug

可能原因:在此问题解决前使用的场景跳转代码如下:

  SceneManager.LoadScene(levelToLoad);//直接调用SceneManager.LaodScene

同时在出现问题的该项目中,我将一部分UI设置成跳转场景时不销毁,结果之后发生了回到初始场景时部分组件仍被销毁,导致地图名的text丢失无法正常更新的问题(最初的bug甚至是一回初始地图就无法正常加载黑屏过场,不过后来把过场去除了,总之该问题暂未解决,考虑到可能与标题有关联此处只做提及,待解决)

解决方案:

Unity官方文档 中关于SceneManager.LoadScene的解释里提到:使用 SceneManager.LoadScene 时,不会立即加载场景,而是在下一帧加载。这种 半异步 的行为可能会导致 帧卡顿 ,并可能令人困惑,因为加载无法立即完成。

因此应该采用异步加载新场景的方式解决

代码参考:

    public void LoadLevelL()
    {
        StartCoroutine(LoadLevelLCo());
    }
    public IEnumerator LoadLevelLCo()
    {
        if (isLoading) yield break;
        isLoading = true;


        // 直接加载新场景(Single模式会自动卸载旧场景)
        AsyncOperation loadOp = SceneManager.LoadSceneAsync(currentPoint.levelLeft, LoadSceneMode.Single);
        loadOp.allowSceneActivation = false;

        // 等待加载至90%
        while (loadOp.progress < 0.9f)
        {
            yield return null;
        }
        loadOp.allowSceneActivation = true;

        // 等待加载完成
        while (!loadOp.isDone)
        {
            yield return null;
        }


        isLoading = false;
    }

8,对GetComponentInChildren<>() 的使用

该代码在新手时期时容易误解为:获取子对象组件

实际上在脚本运行时,该段代码会查找 被查找游戏对象自身及其所有子物体 的对应组件

如果想要单独删除子对象中的组件,应该先利用新变量获取该组件,再用 Destroy() 删除该变量

例子:

private void Start()
{
    for (int i = 0; i < BagGrid.Length; i++)
    {
        // 获取所有子物体的 Image
        foreach (Transform child in BagGrid[i].transform)
        {
            Image childImage = child.GetComponent<Image>();
            if (childImage != null)
            {
                Destroy(child.gameObject); // 直接删除子物体
                // 或 Destroy(childImage); 仅删除 Image 组件
                Debug.Log("清空格子 " + i + " 的子物体 Image");
            }
        }
    }
}