우선 단한가지, UI 반영을 제외한 모든 필수 과제를 구현했습니다.



using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class Door : MonoBehaviour, ITimeTriggerable
{
[SerializeField]
private string _targetScene;
[SerializeField]
private float _waitTime = 1.0f;
[SerializeField]
private Vector3 _pivot;
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.CompareTag("Player"))
{
RoomController controller = collision.GetComponent<RoomController>();
controller.StartTriggerCountdown(this,_waitTime, _pivot);
}
}
private void OnTriggerExit2D(Collider2D collision)
{
if (collision.CompareTag("Player"))
{
RoomController controller = collision.GetComponent<RoomController>();
controller.CancelTriggerCountdown();
}
}
// 콜백으로 호출되는 메서드
public void OnTriggerTimeComplete()
{
SceneManager.LoadScene(_targetScene);
}
}
using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.UI;
public class RoomController : MonoBehaviour
{
[SerializeField]
private GameObject barUi;
[SerializeField]
private Image progressBar;
private Coroutine currentTriggerCoroutine;
Camera mainCamera;
private void Awake()
{
mainCamera = Camera.main;
}
public void StartTriggerCountdown(ITimeTriggerable target, float delay, Vector3 pivot)
{
// 중복 방지
if (currentTriggerCoroutine != null)
{
StopCoroutine(currentTriggerCoroutine);
}
currentTriggerCoroutine = StartCoroutine(TriggerCoroutine(target, delay, pivot));
}
public void CancelTriggerCountdown()
{
if (currentTriggerCoroutine != null)
{
StopCoroutine(currentTriggerCoroutine);
currentTriggerCoroutine = null;
// UI 초기화
progressBar.fillAmount = 0;
barUi.SetActive(false);
}
}
private IEnumerator TriggerCoroutine(ITimeTriggerable target, float delay,Vector3 pivot)
{
barUi.SetActive(true);
float elapsed = 0f;
while (elapsed < delay)
{
elapsed += Time.deltaTime;
progressBar.fillAmount = elapsed / delay;
yield return null;
}
progressBar.fillAmount = 0;
barUi.SetActive(false);
target.OnTriggerTimeComplete();
Vector3 playerPositon = transform.position + pivot;
PlayerPrefs.SetString("PlayerPosition", $"{transform.position.x},{playerPositon.y},{playerPositon.z}");
PlayerPrefs.SetString("CameraPosition", $"{mainCamera.transform.position.x},{mainCamera.transform.position.y},{mainCamera.transform.position.z}");
}
}
스택을 구현하는 문제로 따로 내장함수를 쓰지 않아도 쉽게 풀 수 있었습니다.
하지만 여기서 스트링빌더를 사용하지 않았을 때의 시간 초과 문제가 있었고, 이에 대한 간단한 설명은 아래와 같습니다.
