Unity 2D 如何保存选中角色并仅在关卡场景加载、不在选关界面显示
问题解决方案
首先修正现有代码的底层问题
你当前使用的PrefabUtility.SaveAsPrefabAsset属于Unity编辑器专属API,仅能在编辑器开发阶段使用,正式打包发布后会直接报错,需要先替换为Runtime可用的角色选中状态存储方案。
最优实现方案(推荐)
核心逻辑:不在跨场景时自动传递角色对象,仅在需要显示角色的Level 1场景主动生成对应选中的角色,选关界面不做任何角色生成逻辑,自然不会显示角色。
操作步骤:
- 新增全局静态类存储选中角色信息,跨场景不会丢失:
public static class GameGlobalData { // 存储选中角色的唯一ID,你可以给每个角色预设分配一个0/1/2这类唯一编号 public static int SelectedCharacterId; }
- 替换你现有的PlayGame方法:
public void PlayGame() { // 替换为你当前选中角色对应的ID GameGlobalData.SelectedCharacterId = 当前选中角色的ID; // 正常加载下一个选关场景即可 SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex + 1); }
- 把所有角色预设放到
Resources/Characters目录下,命名格式和ID对应,比如Character_0.prefab、Character_1.prefab - 在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
相关产品推荐
相关产品推荐

