[25.04.30] TIL( 개인 프로젝트, 알고리즘 )

설민우·2025년 4월 30일

내일배움캠프 - Unity

목록 보기
33/85

< 개인 프로젝트>

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

  • 이제 내일부터는 남은 필수 구현을 끝내고, 도전 과제 제작을 진행할 예정입니다.
  • 또한 오늘은 트러블 슈팅이 없어, 알게된 것으로 마무리 지으려 합니다

( 콜백 방식을 통한 씬 이동 )

문제 1. 탑다운 형식에서의 점프 구현 문제

배경 :

  • 씬 이동을 구현하되, 최대한 자연스럽게 연결 될 수 있도록 별도의 bar를 통해 일정 시간 이상 문 앞에 있으면 이동 되도록 구현 하고 싶었습니다.
  • 또한 player나 door 을 모두 싱글톤으로 연결하는 방식으로 구현하는 것을 지양하고 싶었습니다.

해결 방법 :

  • 단순한 콜백 방식을 통해서 코루틴을 시작시키고 -> 코루틴이 완료되면 전달 받았던 door에게 콜백을 보내 씬을 이동 시키는 방법으로 구현했습니다.

결과:

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}");
    }

}
  • 위와 같은 방법으로 씬 이동을 구현 할 수 있었습니다.

< 알고리즘 - 백준 10828 >

스택을 구현하는 문제로 따로 내장함수를 쓰지 않아도 쉽게 풀 수 있었습니다.
하지만 여기서 스트링빌더를 사용하지 않았을 때의 시간 초과 문제가 있었고, 이에 대한 간단한 설명은 아래와 같습니다.

profile
클라이언트 개발자를 지망하고 있습니다.

0개의 댓글