Unity 2D游戏跨场景保存玩家对象位置的实现方法咨询
解决Unity场景切换后玩家位置错误的问题
不用复杂的PlayerPrefs,直接通过静态类传递位置,步骤简单易上手:
1. 给场景切换触发器加脚本
给你用作场景切换的碰撞器(比如门的碰撞盒)挂一个SceneSwitcher.cs脚本:
using UnityEngine; using UnityEngine.SceneManagement; public class SceneSwitcher : MonoBehaviour { // 在Inspector面板里填要切换到的场景名称 public string targetSceneName; // 把目标场景里的出生标记点拖到这里(可以放个空物体当标记) public Transform spawnPoint; private void OnTriggerEnter2D(Collider2D other) { // 只响应玩家的碰撞(记得给玩家加"Player"标签) if (other.CompareTag("Player")) { // 存好目标出生位置 PlayerSpawnData.SetSpawnPosition(spawnPoint.position); // 切换场景 SceneManager.LoadScene(targetSceneName); } } }
2. 建一个全局存位置的静态类
新建PlayerSpawnData.cs脚本,用来临时存出生位置:
using UnityEngine; public static class PlayerSpawnData { private static Vector3 _spawnPos = Vector3.zero; private static bool _hasCustomSpawn = false; // 设置要出生的位置 public static void SetSpawnPosition(Vector3 position) { _spawnPos = position; _hasCustomSpawn = true; } // 获取出生位置,取完就重置标记 public static Vector3 GetSpawnPosition() { Vector3 pos = _spawnPos; _hasCustomSpawn = false; return pos; } // 判断有没有自定义的出生位置 public static bool HasCustomSpawn() { return _hasCustomSpawn; } }
3. 让玩家加载场景后跳到目标位置
打开你的玩家控制脚本(比如PlayerController.cs),在Start方法里加这段:
void Start() { // 如果有自定义出生位置,就把玩家移过去 if (PlayerSpawnData.HasCustomSpawn()) { transform.position = PlayerSpawnData.GetSpawnPosition(); } // 没有的话就用默认初始位置,不用改 }
新手必做的几个设置
- 给玩家加**"Player"标签**:选中玩家,Inspector顶部Tag下拉框选"Player",没有就新建。
- 碰撞器开Is Trigger:在切换触发器的Collider2D组件里勾选Is Trigger,不然触发不了碰撞检测。
- 场景加到Build Settings:打开File -> Build Settings,把所有要切换的场景拖进去,否则加载会报错。
- 目标场景放出生标记:在每个场景的切换门旁边放个空GameObject,把它拖到SceneSwitcher的spawnPoint字段里。
内容的提问来源于stack exchange,提问作者retrd1
相关产品推荐
相关产品推荐

