using UnityEngine; // 임포트할거에요 -> Unity 엔진 기본 기능을 using UnityEngine.SceneManagement; // 임포트할거에요 -> 씬 관리 기능을 // ══════════════════════════════════════════════════════════════════════ // PlayerSpawnPoint — 씬 전환 시 플레이어 위치 자동 배치 // // DontDestroyOnLoad 플레이어가 새 씬에 도착하면, // 이 스크립트가 있는 위치로 자동 이동시킵니다. // // 사용법: 보스 씬(또는 아무 씬)에 빈 오브젝트를 만들고 // 이 스크립트를 부착한 뒤, 원하는 스폰 위치에 배치하세요. // 씬 뷰에서 기즈모로 위치를 확인할 수 있습니다. // ══════════════════════════════════════════════════════════════════════ public class PlayerSpawnPoint : MonoBehaviour // 클래스를 정의할거에요 -> 플레이어 스폰 포인트를 { [Header("스폰 설정")] [Tooltip("플레이어를 찾을 태그")] [SerializeField] private string playerTag = "Player"; // 변수를 선언할거에요 -> 플레이어 태그를 [Tooltip("스폰 시 플레이어가 바라볼 방향 (Y축 회전)")] [SerializeField] private float spawnRotationY = 0f; // 변수를 선언할거에요 -> 스폰 시 회전 각도를 private void OnEnable() // 활성화 시 실행할거에요 -> 씬 로드 이벤트 구독을 { SceneManager.sceneLoaded += OnSceneLoaded; // 구독할거에요 -> 씬 로드 완료 이벤트를 } private void OnDisable() // 비활성화 시 실행할거에요 -> 이벤트 해제를 { SceneManager.sceneLoaded -= OnSceneLoaded; // 해제할거에요 -> 씬 로드 완료 이벤트를 } private void Start() // 시작 시 실행할거에요 -> 즉시 플레이어 배치를 { MovePlayerToSpawn(); // 실행할거에요 -> 플레이어 이동을 } private void OnSceneLoaded(Scene scene, LoadSceneMode mode) // 콜백을 정의할거에요 -> 씬 로드 완료 시 처리를 { MovePlayerToSpawn(); // 실행할거에요 -> 플레이어 이동을 } /// /// 플레이어를 이 오브젝트 위치로 이동시킵니다. /// CharacterController가 있으면 비활성화 후 이동 (텔레포트 방지) /// private void MovePlayerToSpawn() // 함수를 정의할거에요 -> 플레이어를 스폰 위치로 이동을 { GameObject player = GameObject.FindGameObjectWithTag(playerTag); // 찾을거에요 -> 플레이어를 if (player == null) // 조건이 맞으면 실행할거에요 -> 못 찾으면 { Debug.LogWarning("[PlayerSpawnPoint] 플레이어를 찾지 못했습니다!"); // 경고 로그 return; // 중단 } // CharacterController가 있으면 일시 비활성화 (위치 강제 이동 시 필요) CharacterController cc = player.GetComponent(); // 가져올거에요 -> CharacterController를 if (cc != null) cc.enabled = false; // 비활성화할거에요 -> 텔레포트를 위해 // 위치 + 회전 설정 player.transform.position = transform.position; // 이동할거에요 -> 스폰 포인트 위치로 player.transform.rotation = Quaternion.Euler(0f, spawnRotationY, 0f); // 회전할거에요 -> 지정된 방향으로 // CharacterController 다시 활성화 if (cc != null) cc.enabled = true; // 활성화할거에요 -> 다시 켜기 Debug.Log($"[PlayerSpawnPoint] 플레이어를 스폰 위치로 이동 완료: {transform.position}"); // 로그를 찍을거에요 } // ───────────────────────────────────────────────────────────── // 씬 뷰 기즈모 — 스폰 위치 + 바라볼 방향 시각화 // ───────────────────────────────────────────────────────────── private void OnDrawGizmos() // 기즈모를 그릴거에요 -> 씬 뷰에서 스폰 위치를 { Gizmos.color = Color.cyan; // 색상을 설정할거에요 -> 시안색으로 Gizmos.DrawWireSphere(transform.position, 0.5f); // 그릴거에요 -> 스폰 위치를 원으로 // 바라볼 방향 화살표 Gizmos.color = Color.yellow; // 색상을 설정할거에요 -> 노란색으로 Vector3 forward = Quaternion.Euler(0f, spawnRotationY, 0f) * Vector3.forward; // 계산할거에요 -> 바라볼 방향을 Gizmos.DrawRay(transform.position, forward * 2f); // 그릴거에요 -> 방향 화살표를 } }