Udemy-Unity制作类暗黑破坏神游戏记录-P71

2024-09-15
121看过
设置玩家的传送点,加载场景后更新玩家的位置

Portal:

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using Unity.VisualScripting;
  4. using UnityEngine;
  5. using UnityEngine.AI;
  6. using UnityEngine.SceneManagement;
  7. namespace RPG.SceneMangement
  8. {
  9.     //// Portal 类用于在玩家进入触发器时异步加载新场景
  10.     public class Portal : MonoBehaviour
  11.     {
  12.         [SerializeField] int sceneToLoad = 1;// 要加载的场景索引,默认为1
  13.         [SerializeField] Transform spawnPoint;// 玩家传送后的出生点位置和旋转
  14.         // 当触发器碰撞到其他对象时调用
  15.         private void OnTriggerEnter(Collider other)
  16.         {
  17.             // 如果碰撞的对象标签是 "Player"
  18.             if (other.tag == "Player")
  19.             {
  20.                 // 启动协程来处理场景过渡
  21.                 StartCoroutine(Transition());
  22.             }
  23.         }
  24.         // 协程方法:处理场景的异步加载和玩家的位置更新
  25.         private IEnumerator Transition()
  26.         {
  27.             
  28.             DontDestroyOnLoad(gameObject);// 确保 Portal 对象在加载新场景时不会被销毁
  29.             yield return SceneManager.LoadSceneAsync(sceneToLoad); // 异步加载指定的场景
  30.             Portal otherPortal = GetOtherPortal(); // 查找另一个 Portal 对象(目标场景中的传送门)
  31.             UpdatePlayer(otherPortal);// 更新玩家位置和旋转
  32.             Destroy(gameObject);// 场景加载完成后,销毁当前的 Portal 对象,防止两个场景的Portal重叠出现问题
  33.         }
  34.         // 更新玩家的位置和旋转,使其在目标场景中出现在正确的位置
  35.         private void UpdatePlayer(Portal otherPortal)
  36.         {
  37.             GameObject player = GameObject.FindWithTag("Player");// 查找场景中的玩家对象
  38.             // 使用 Warp 方法将玩家传送到新的出生点位置
  39.             player.GetComponent<NavMeshAgent>().Warp(otherPortal.spawnPoint.position);
  40.             // 设置玩家的旋转角度
  41.             player.transform.rotation = otherPortal.spawnPoint.rotation;
  42.         }
  43.         // 查找并返回目标场景中的另一个 Portal 对象
  44.         private Portal GetOtherPortal()
  45.         {
  46.             // 遍历所有的 Portal 对象
  47.             foreach (Portal portal in FindObjectsOfType<Portal>())
  48.             {
  49.                
  50.                 if (portal == this) continue;// 跳过当前的 Portal 对象
  51.                 return portal; // 返回第一个找到的不同的 Portal 对象
  52.             }
  53.             return null;// 如果没有找到其他 Portal,则返回 null
  54.         }
  55.       
  56.     }
  57. }
复制代码


回复

举报

 
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表