
Stack
함수 호출 스택 (Call Stack):
유니티 스크립트에서 C# 코드를 실행할 때,
모든 함수 호출은 내부적으로 콜 스택(Call Stack)에 쌓임.
한 함수가 다른 함수를 호출하면, 호출된 함수의 정보가 스택에 푸시되고,
함수 실행이 끝나면 스택에서 팝 시킴.
예시:
Update() 함수 안에서 MovePlayer() 함수를 호출하고,
MovePlayer() 안에서 CheckBounds() 함수를 호출했다면,
콜 스택에는 Update → MovePlayer → CheckBounds 순으로 쌓이고,
CheckBounds가 끝나면 팝, MovePlayer가 끝나면 팝, 이런 식으로 동작.
디버깅:
유니티 에디터의 콘솔(Console) 창에서 에러 메시지를 볼 때,
스택 트레이스(Stack Trace)를 제공하는데,
이는 에러가 발생하기까지의 함수 호출 순서를 보여주는 것으로 콜 스택의 내용을 나타냄.
복잡한 UI를 구성할 때, 여러 개의 UI 패널이나 화면을
순서대로 보여주고 숨기는 방식으로 스택 개념을 적용 가능.
예를 들어, 게임 내 메뉴 시스템에서
'일시정지 메뉴' → '설정 메뉴' → '오디오 설정 메뉴' 순으로 진입했다고 가정.
새로운 메뉴를 열 때마다 현재 메뉴를 비활성화하고 새로운 메뉴를 활성화하면서,
이전에 활성화되어 있던 메뉴를 스택에 푸시하는 방식으로 관리할 수 있음.
'뒤로 가기' 버튼을 누르면 스택의 맨 위에 있는 메뉴를 팝하여 닫고,
이전에 활성화되어 있던 메뉴를 다시 활성화하는 식으로 구현.
후입선출(LIFO) 방식의 스택 자료 구조 개념은 유니티 프로젝트를 개발하고 디버깅하며
다양한 기능을 구현하는 데 있어서 기본적인 프로그래밍 원리로 중요하게 활용
<예시 코드>
// 유니티 스크립트 예시 (개념만)
using System.Collections.Generic;
using UnityEngine;
public class MyGameManager : MonoBehaviour
{
// 게임에서 발생한 특정 이벤트 기록
private Stack<string> eventHistory = new Stack<string>();
void Start()
{
RecordEvent("Game Started");
RecordEvent("Player Entered Zone A");
}
public void RecordEvent(string eventName)
{
eventHistory.Push(eventName);
Debug.Log($"Event Recorded: {eventName}, Current Stack Top: {eventHistory.Peek()}");
}
public void UndoLastEvent()
{
if (eventHistory.Count > 0)
{
string lastEvent = eventHistory.Pop();
Debug.Log($"Undoing Last Event: {lastEvent}, Remaining events: {eventHistory.Count}");
// 실제 게임 로직에서 lastEvent에 해당하는 행동을 되돌리는 코드 추가
}
else
{
Debug.Log("No events to undo.");
}
}
}
디버그 로그 출력
Event Recorded: Game Started, Current Stack Top: Game Started
Event Recorded: Player Entered Zone A, Current Stack Top: Player Entered Zone A