总结一下自己初识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 的概念
6,UI 自适应问题相关参考
待进一步研究中……
在设置好UI组件的锚点之后还要修改Canvas Scaler
7,Unity 项目中跳转场景后,随着跳转次数增加,新的 is loading 场景不断增加,最后导致跳转一次场景的加载时间变得巨————长————————
运行途中截图:
可能原因:在此问题解决前使用的场景跳转代码如下:
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");
}
}
}
}