设置玩家的传送点,加载场景后更新玩家的位置
Portal:
- using System.Collections;
- using System.Collections.Generic;
- using Unity.VisualScripting;
- using UnityEngine;
- using UnityEngine.AI;
- using UnityEngine.SceneManagement;
-
- namespace RPG.SceneMangement
- {
- //// Portal 类用于在玩家进入触发器时异步加载新场景
- public class Portal : MonoBehaviour
- {
- [SerializeField] int sceneToLoad = 1;// 要加载的场景索引,默认为1
- [SerializeField] Transform spawnPoint;// 玩家传送后的出生点位置和旋转
-
- // 当触发器碰撞到其他对象时调用
- private void OnTriggerEnter(Collider other)
- {
-
- // 如果碰撞的对象标签是 "Player"
- if (other.tag == "Player")
- {
- // 启动协程来处理场景过渡
- StartCoroutine(Transition());
- }
-
- }
-
- // 协程方法:处理场景的异步加载和玩家的位置更新
- private IEnumerator Transition()
- {
-
- DontDestroyOnLoad(gameObject);// 确保 Portal 对象在加载新场景时不会被销毁
-
- yield return SceneManager.LoadSceneAsync(sceneToLoad); // 异步加载指定的场景
-
- Portal otherPortal = GetOtherPortal(); // 查找另一个 Portal 对象(目标场景中的传送门)
- UpdatePlayer(otherPortal);// 更新玩家位置和旋转
-
- Destroy(gameObject);// 场景加载完成后,销毁当前的 Portal 对象,防止两个场景的Portal重叠出现问题
- }
-
- // 更新玩家的位置和旋转,使其在目标场景中出现在正确的位置
- private void UpdatePlayer(Portal otherPortal)
- {
- GameObject player = GameObject.FindWithTag("Player");// 查找场景中的玩家对象
- // 使用 Warp 方法将玩家传送到新的出生点位置
- player.GetComponent<NavMeshAgent>().Warp(otherPortal.spawnPoint.position);
- // 设置玩家的旋转角度
- player.transform.rotation = otherPortal.spawnPoint.rotation;
- }
-
- // 查找并返回目标场景中的另一个 Portal 对象
- private Portal GetOtherPortal()
- {
- // 遍历所有的 Portal 对象
- foreach (Portal portal in FindObjectsOfType<Portal>())
- {
-
- if (portal == this) continue;// 跳过当前的 Portal 对象
-
- return portal; // 返回第一个找到的不同的 Portal 对象
- }
-
- return null;// 如果没有找到其他 Portal,则返回 null
- }
-
- }
- }
-
复制代码
|