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

Unity 2D 如何保存选中角色并仅在关卡场景加载、不在选关界面显示

问题解决方案

首先修正现有代码的底层问题

你当前使用的PrefabUtility.SaveAsPrefabAsset属于Unity编辑器专属API,仅能在编辑器开发阶段使用,正式打包发布后会直接报错,需要先替换为Runtime可用的角色选中状态存储方案。

最优实现方案(推荐)

核心逻辑:不在跨场景时自动传递角色对象,仅在需要显示角色的Level 1场景主动生成对应选中的角色,选关界面不做任何角色生成逻辑,自然不会显示角色。
操作步骤:

  1. 新增全局静态类存储选中角色信息,跨场景不会丢失:
public static class GameGlobalData
{
    // 存储选中角色的唯一ID,你可以给每个角色预设分配一个0/1/2这类唯一编号
    public static int SelectedCharacterId;
}
  1. 替换你现有的PlayGame方法:
public void PlayGame()
{
    // 替换为你当前选中角色对应的ID
    GameGlobalData.SelectedCharacterId = 当前选中角色的ID;
    // 正常加载下一个选关场景即可
    SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex + 1);
}
  1. 把所有角色预设放到Resources/Characters目录下,命名格式和ID对应,比如Character_0.prefab、Character_1.prefab
  2. 在Level 1场景中新增一个生成角色的脚本,挂载到场景内的空对象上即可:
public class LevelCharacterSpawner : MonoBehaviour
{
    // 直接在Inspector面板拖入场景里的角色出生点对象
    public Transform spawnPoint;

    void Start()
    {
        // 读取选中的角色ID
        int selectId = GameGlobalData.SelectedCharacterId;
        // 加载对应角色预设
        GameObject characterPrefab = Resources.Load<GameObject>($"Characters/Character_{selectId}");
        // 在出生点生成角色
        Instantiate(characterPrefab, spawnPoint.position, Quaternion.identity);
    }
}

适配原有逻辑的快速方案

如果你之前已经用DontDestroyOnLoad实现了角色跨场景传递,不想大改现有逻辑,可以直接在角色对象的挂载脚本里加场景判断,选关界面自动销毁角色:

void OnEnable()
{
    SceneManager.sceneLoaded += OnSceneLoadComplete;
}

void OnDisable()
{
    SceneManager.sceneLoaded -= OnSceneLoadComplete;
}

private void OnSceneLoadComplete(Scene scene, LoadSceneMode mode)
{
    // 如果加载的是选关界面,直接销毁当前角色对象
    if(scene.name == "Level Selection")
    {
        Destroy(gameObject);
    }
}

内容的提问来源于stack exchange,提问作者Conie Caldera

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 06:15:08