这里附上我的完整代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class ProtalDoor : MonoBehaviour
{
public string targetSceneName; // 目标场景的名称
public Vector3 targetPosition; // 目标位置
private void Awake()
{
string currentSceneName = SceneManager.GetActiveScene().name;//获取当前场景的名字
if (currentSceneName=="Level1")
{
targetSceneName = "Level2";
targetPosition = new Vector3(24,0.84f,-0.3f);
}
}
private void OnTriggerEnter(Collider other)
{
if (other.CompareTag("Player")) // 确保只有玩家触发传送门
{
// 保存玩家当前的位置和状态(如果需要)
// 例如:PlayerPrefs.SetFloat("PlayerX", transform.position.x);
// PlayerPrefs.SetFloat("PlayerY", transform.position.y);
// PlayerPrefs.SetFloat("PlayerZ", transform.position.z);
PlayerPrefs.SetFloat("PlayerX", transform.position.x);
PlayerPrefs.SetFloat("PlayerY", transform.position.y);
PlayerPrefs.SetFloat("PlayerZ", transform.position.z);
// 异步加载目标场景
StartCoroutine(LoadTargetScene());
}
}
private IEnumerator LoadTargetScene()
{
AsyncOperation asyncOperation = SceneManager.LoadSceneAsync(targetSceneName, LoadSceneMode.Single);
// 等待场景加载完成
while (!asyncOperation.isDone)
{
yield return null;
}
// 在目标场景中找到玩家对象并设置其位置
GameObject player = GameObject.FindGameObjectWithTag("Player");
if (player != null)
{
player.transform.position = targetPosition;
}
}
}
有几个需要注意的是:
这种方法必须要提前将场景添加到Build Settings(生成设置)中,具体添加步骤如下:
- 在Unity编辑器中,点击菜单栏的
File
>Build Settings...(生成设置)
- 在弹出的Build Settings窗口中,确保你位于
Scenes In Build(Build中的场景)
选项卡 - 点击
Add Open Scenes
按钮,这将把当前打开的场景添加到构建列表中这里会添加你当前已经打开的场景,我已经添加了Level1和Level2。
- 确保
Level2
场景已经被正确添加后,关闭Build Settings窗口。 - 重新运行游戏或场景切换,现在应该能够成功加载"Level2"场景了。
下面是测试:
这里是我的Level1的传送门,现在我们进去
然后我们就到了Level2了
连着场景名也变了
这时当我们退出运行又回到了Level1的场景界面