본문 바로가기

Unity20

유니티에서 Scene 전환에도 안전한 GameManager class 만들기 (singleton) GameManger 같은 전역 클래스가 필요할 경우, 흔히 singleton 패턴을 사용합니다. 그런데 하나의 scene 이 아니라 2개 이상의 scene 에서 GameManager 를 사용하려면, 각 scene 마다 GameManager GameObject 를 hierarchy 창에 생성해야 하는 문제에 부딪히게 됩니다. 이 문제를 깔끔하게 해결하려면 싱글톤 구조를 약간 확장해줄 필요가 있습니다.  Scene 전환이 있을 경우에도 안전한 singleton 패턴public class GameManager : MonoBehaviour{ public static GameManager Instance { get; private set; } void Awake() { if (Inst.. 2025. 3. 30.
PlayerPrefs - 데이터를 간단하게 저장하는 방법 게임을 만들다 보면, 점수나 설정 같은 정보를 저장하고 싶을 때가 있습니다.예를 들어,게임을 껐다 켜도 최고 점수를 기억하고 싶은 경우사용자가 설정한 음량을 유지하고 싶은 경우이럴 때 간단하게 사용할 수 있는 기능이 바로 Unity의 PlayerPrefs입니다.  PlayerPrefs란?PlayerPrefs는 Unity에서 제공하는 간단한 데이터 저장 시스템입니다.Prefers 는 영어 'Preferences' 의 약어이며, 프로그래밍 분야에서는 '선호' 라는 의미보다는 '설정' 에 조금 더 가까운 의미로 해석됩니다. 이 기능을 통해 파일이나 데이터베이스를 따로 만들 필요 없이, 숫자나 문자열을 쉽게 저장하고 불러올 수 있습니다.다만 보안이 필요하거나 민감한 정보는 저장하지 않는 것이 좋습니다. 누구나 .. 2025. 3. 25.
Button 클릭시, AddListener() 함수로 연결하는 방법 코드 추가없이 drag & drop 으로만 button click 이벤트를 처리하는 방법은 상황에 따라 불편할 수 있습니다. 따라서 이번에는 동일한 기능을 code 로 구현해보겠습니다.AddListener() 를 이용해서 연결하고, RemoveListener() 로 이벤트를 제거하는 방법입니다.특히 런타임 중에 동적으로 버튼의 동작을 바꾸고 싶을 때는 코드로 이벤트를 등록하는 방법이 더 유용합니다. 먼저 Button 컴포넌트를 가져옵니다. 예시는 다음과 같습니다using UnityEngine;using UnityEngine.UI;public class MyButtonHandler : MonoBehaviour{ public Button myButton; void Start() { .. 2025. 3. 25.
Button 클릭 시, 내가 짠 함수를 호출하는 방법 Button 을 클릭했을 때 내가 짠 스크립트 함수를 호출하여 어떤 기능을 실행하고 싶을 때, 별도의 coding 없이 가장 손쉽게 해결할 수 있는 방법을 소개하겠습니다. 글 후반에는 이 방법의 한계점에 대해 말씀드리고, 다음 편에서 해결방법을 제시하도록 하겠습니다.    OnClick 이벤트 연결하는 방법(1) Button 오브젝트 선택(2) Inspector 창 하단의 OnClick() 항목 확인(3) + 버튼 클릭하여 이벤트 슬롯 추가(4) 함수가 포함된 오브젝트를 Hierarchy에서 드래그해서 넣기(5) 오른쪽 드롭다운을 눌러, 원하는 스크립트에서 함수 선택 이 때, 함수는 public void 형식이어야 하며, 파라미터가 없어야 Inspector 에서 보입니다.  OnClick()  예시 코드.. 2025. 3. 24.
Destroy()의 동작 방식 유니티에서 Destroy(obj);를 호출하면 즉시 메모리에서 삭제되는 것이 아닙니다. 이 함수는 단순히 "삭제 예정" 태그를 붙이는 역할만 합니다.메모리에서 실제로 삭제되는 시점은 C#의 Garbage Collector(GC)가 필요 없다고 판단한 이후입니다. 이 때문에 몇 가지 사항만 잘 이해하면 더 안전하고 효율적으로 Destroy()를 사용할 수 있습니다.  Destroy()는 즉시 삭제되지 않는다Destroy(obj);Debug.Log(obj); // 여전히 참조 가능 (하지만 삭제 예정) Destroy()를 호출해도 obj는 즉시 null이 되지 않고, 여전히 리스트에 남아 있을 수도 있습니다.단지 "삭제 예정(Destroyed)" 태그가 붙을 뿐, 실제 메모리 해제는 나중에 GC가 처리합니다.. 2025. 3. 16.
유니티 Coroutin 에서 continue 를 쓸 때 주의할 점 유니티에서 코루틴을 사용할 때 continue 와 yield return 의 차이를 이해하는 것은 매우 중요합니다. 특히 while (true) 같은 무한 루프를 사용할 때, continue 만 사용하면 예상치 못한 성능 저하가 발생할 수 있습니다. 아래와 같은 코드를 살펴보겠습니다.private IEnumerator SpawnColumn(){ WaitForSeconds wait = new(GameData.PipeSpawnTime); while (true) { if (!GameManager.Instance.IsGameActive) continue; Instantiate(pipesPrefab, transform.position, Quaternio.. 2025. 3. 12.