일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 스파르타내일배움캠프
- 최종프로젝트
- 유니티
- string배열과 char
- 티스토리챌린지
- Til
- projectl
- 분반별
- input system
- 마크다운
- 스파르타내배캠til
- 프로그래머스
- 코테
- 스파르타
- 내일배움캠프
- 분반별학습
- Action
- 텍스트게임
- 오블완
- 피셔예이츠
- 내배캠
- 스탠다드
- 알아볼것
- 스파르타부트캠프
- Input Field
- 백준
- 코테풀기
- 코딩테스트
- 스파르타내일배움캠프TIL
- 내주말
- Today
- Total
Ottoman
내일배움캠프 4주 토요일 TIL - 싱글톤 본문
게임매니저의 싱글톤을 만들다 생각해본것.
// 싱글톤패턴을 이용한 GameManager
public class GameManager : MonoBehaviour
{
public static GameManager Instance;
private void Awake()
{
if (Instance != null) Destroy(gameObject);
Instance = this;
}
}
// 위아래중 하나를 고른다
public class GameManager : MonoBehaviour
{
public static GameManager Instance;
private void Awake()
{
if (Instance == null)
{
Instance = this;
}
else
{
Destroy(gameObject);
}
}
}
- 싱글톤 게임매니저는 이런 방법으로 만든다.
- 씬의 하이어라키에 empty게임오브젝트를 만들고 GameManager란 이름을 붙인다.
- 위의 코드를 쓴 스크립트를 방금만든 GameManager게임오브젝트에 캐싱한다.
그러면 현재 씬이 실행되면 GameManager 게임오브젝트가 Awake()실행해서 스크립트GameManager가 선언한 public static GamaManager Instance;에 위 1에서 만든 게임오브젝트를 할당한다. (this를 말한다.)
그러지는 않겠지만 다른 게임오브젝트에 스크립트GameManager를 캐싱한다면 그 스크립트에서 public static GamaManager Instance을 만들려 할텐데 정적변수인 Instance는 이미 메모리에 남아있기에 if조건문에서 이 코드가 실행된 게임오브젝트를 Destroy() 한다.
gameObject는 현재 스크립트가 연결된 게임 오브젝트를 가리킨다.
// 정적 변수는 특정 인스턴스에 속하는 것이 아니라 클래스 자체에 속하기 때문에 인스펙터에 표시되지 않습니다.
해보다 알았는데 public static GameManager Instance는 앞에 [SerializeField]를 넣어도 GameManager스크립트의 인스펙터에 안보인다.
GPT질문
User : GamaManager 오브젝트의 인스펙터에 public static GameManager Instance; 가 안보이던데 왜그런거야?
ChatGPT: public static GameManager Instance;은 Inspector에 표시되지 않습니다. 이것은 클래스의 정적 변수(static variable)로서, Inspector에 표시되는 것이 아니라 프로그램의 실행 중에 코드에서만 접근할 수 있습니다.
Inspector에 표시되는 것들은 주로 게임 오브젝트에 부착된 컴포넌트의 인스턴스 변수(instance variable)들이거나, Serialize된 필드입니다. 정적 변수는 인스턴스가 아닌 클래스 자체에 속하므로 Inspector에 표시되지 않습니다.
Instance는 단일 인스턴스를 나타내기 위한 것이지만, 이는 코드에서 접근하고 사용하는 것이 일반적입니다. 게임 관리자 등의 경우에는 다른 클래스에서 쉽게 접근할 수 있도록 정적 변수로 만들어 사용하는 것이 일반적입니다.
User : static으로 선언된 정적 변수는 인스펙터에 표시되지 않는다. 라고 알면 될까?
ChatGPT : 맞습니다, 정적으로 선언된(static) 변수는 인스펙터에 표시되지 않습니다. 인스펙터에 표시되는 변수는 주로 해당 변수가 스크립트에 연결된 게임 오브젝트에 부착된 컴포넌트의 인스턴스 변수일 때입니다. 정적 변수는 특정 인스턴스에 속하는 것이 아니라 클래스 자체에 속하기 때문에 인스펙터에 표시되지 않습니다.
예전에 몇번이고 쓴 싱글톤패턴이지만 다시 한번 공부했다.
유니티 프로젝트를 시작하면서 답답함을 많이 느낀다. 조급함도 많이 느꼈다. 캠프 첫 주차 프로젝트보다 심하다. 비쥬얼스튜디오로 코드만 생각할 때는 콘솔의 텍스트만 생각하면 됐었다. 이제는 유니티에서 어떤 결과가 나올지 생각해봐야하는데 아는게없으니 내가 하고있는 작업이 내가 원하는 이미지로 이어질지를 모르는게 굉장히 답답하게 느껴진다. 앞서 말했듯이 해결할 방법은 무엇을 사용해야 내가 원하는 결과를 도출해줄지 알면된다. 멘탈이 많이 흔들리는 토요일이었다.
'TIL' 카테고리의 다른 글
내일배움캠프 5주 1일차(20) TIL (0) | 2024.05.13 |
---|---|
내일배움캠프 4주 일요일 TIL - Unity Input Field, TMP, 게임오브젝트캐싱 (0) | 2024.05.12 |
내일배움캠프 4주 4일차(19) TIL 유니티2D개인프로젝트 이벤트기반프로그래밍 (0) | 2024.05.10 |
내일배움캠프 4주 3일차(18) -2- TIL (0) | 2024.05.10 |
내일배움캠프 4주 3일차(18) TIL 유니티의 New Input System (2) | 2024.05.09 |