You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity场景切换时如何保留主菜单预制体数据与状态

解决Unity场景切换后主菜单状态重复生成的问题

针对场景切换返回主菜单时重复执行UI映射的问题,给你三个实用的解决思路:

1. 让主菜单对象跨场景存活

把主菜单的根GameObject设置为场景切换不销毁,这样返回时菜单实例还在,无需重新生成:

  • 在主菜单的管理脚本的Awake方法中添加逻辑,确保单例且不被销毁:
private void Awake()
{
    // 检查是否已有主菜单实例,避免重复创建
    var existingInstance = FindObjectOfType<MainMenuManager>();
    if (existingInstance != null && existingInstance != this)
    {
        Destroy(gameObject);
        return;
    }
    DontDestroyOnLoad(gameObject);
}
  • 把你的菜单生成代码(就是你贴的那段循环逻辑)放在Start或Awake中,因为对象不会被销毁,这段代码只会执行一次。

2. 缓存API数据与UI生成状态

如果不想保留整个菜单对象,可以缓存API数据和生成状态,返回时判断是否已经生成过:

  • 新建一个静态缓存类存储数据和标记:
public static class MenuCache
{
    public static MainMenuDto CachedMenuData { get; set; }
    public static bool HasGeneratedMenu { get; set; } = false;
}
  • 修改你的初始化逻辑,先判断状态再执行生成:
// 先判断是否需要拉取数据
if (MenuCache.CachedMenuData == null)
{
    // 调用API获取数据,并存入MenuCache.CachedMenuData
}

// 判断是否已经生成过菜单
if (!MenuCache.HasGeneratedMenu && MenuCache.CachedMenuData != null)
{
    // 执行你原来的UI生成循环
    foreach(var dt in MenuCache.CachedMenuData.data)
    {
        GameObject _catogeryPrefabTemp =  Instantiate(catogeryPrefab);
        Vector3 originalSize = _catogeryPrefabTemp.transform.localPosition;
        _tabGroup.objectsToSwap.Add(_catogeryPrefabTemp);

        _catogeryPrefabTemp.transform.SetParent(catogeryParent.transform);
        _catogeryPrefabTemp.transform.localPosition = originalSize;
        _catogeryPrefabTemp.transform.localScale = new Vector3(1, 1, 1);
        foreach (var item in dt.games)
        {
            Texture2D image = await (GetRemoteTexture(item.thumbnail));
            tex.Add(image);
            await _catogeryPrefabTemp.GetComponent<CatogeryInitialise>().InstantiateGame(gameButtonPrefab, item.slug,image);
        }
    }
    MenuCache.HasGeneratedMenu = true;
}
  • 如果后续需要更新菜单数据,手动把MenuCache.HasGeneratedMenu设为false即可触发重新生成。

3. 采用叠加场景加载方式

不销毁主菜单场景,而是把其他场景作为叠加场景加载,返回时卸载叠加场景:

  • 加载其他场景时使用叠加模式:
SceneManager.LoadSceneAsync("目标场景名", LoadSceneMode.Additive);
// 加载后可以隐藏主菜单UI
mainMenuCanvas.SetActive(false);
  • 返回主菜单时卸载叠加场景并显示主菜单:
await SceneManager.UnloadSceneAsync("目标场景名");
mainMenuCanvas.SetActive(true);
  • 这种方式下主菜单一直存在,自然不会重复生成。

内容的提问来源于stack exchange,提问作者Laviz Pandey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 19:54:40