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); // 그릴거에요 -> 방향 화살표를
}
}