싱글톤
https://glikmakesworld.tistory.com/2
https://www.youtube.com/watch?v=-wzULWMvFu0
https://www.youtube.com/watch?v=91gKOdNv0uw
https://www.youtube.com/watch?v=a5TCCQgdv-E
스트링 출력 포멧
https://blockdmask.tistory.com/359
https://intotw.tistory.com/298
금일 작업:
- 유니티 싱글톤 관련 조사
- Monobehaviour를 상속 받아 하이어라키에 존재하는 싱글톤의 경우
새로운 씬으로 넘어가는 경우에 해당 하이어라키에 동일한 싱글톤이 존재 할 수 있다. - 씬이 전환되더라도 파괴되지 않도록 DontDestroyOnLoad를 선언하고,
씬 전환시 이미 전역변수인 인스턴스가 있는 경우 자신(새로운씬)을 Destroy한다.
- Monobehaviour를 상속 받아 하이어라키에 존재하는 싱글톤의 경우
- 결과 화면 제작
- 결과 UI 추가
- 이동횟수, 맞춘횟수, 남은시간 등 내용 출력 등
- 버그 수정
- 겹치는 텍스트박스 좌표 수정
- 게임과 겹치는 UI Raycast 제거
- 배경음악 루프 설정
- 깃허브 데스크탑과 소스트리 사용 문제
- 깃허브 데스크탑에서 기본적으로 작동하는 방식은 로그인 연동을 통한 https 방식이다
- SSH로 소스트리에서 설정한 경우에 충돌이 발생.
- 소스트리는 자체적으로 SSH 인증을 도와주는 형태이며, 이때 인증 및 신뢰 도메인을 PuTTY/Plink 로 관리한다. (GUI 상에서 설정 가능)
- 깃허브 데스크탑에서 SSH를 사용하려면 GUI는 존재하지 않으며, OpenSSH를 사용하여 별도의 세팅이 필요하다.
- https://cgtg.tistory.com/448
https://superuser.com/questions/378354/connecting-to-github-using-putty-generated-ssh-key-in-windows
https://gist.github.com/stefhen/5b3cf11b52eb7764fee7a7d30430bb2a
https://dharana.tistory.com/entry/%EA%B3%B5%EA%B0%9C%ED%82%A4%EB%A1%9C-SSH-%EC%A0%91%EC%86%8D%ED%95%98%EB%8A%94-%EB%B2%95
코드
GameManager.cs
Monobehaviour 를 상속받는 경우 싱글톤 선언
public class GameMgr : MonoBehaviour
{
//이 게임 내에서 게임매니저 인스턴스는 이 instance에 담긴 녀석만 존재하게 할 것이다.
//보안을 위해 private으로.
private static GameMgr instance = null;
void Awake()
{
if (null == instance)
{
//이 클래스 인스턴스가 탄생했을 때 전역변수 instance에 게임매니저 인스턴스가 담겨있지 않다면, 자신을 넣어준다.
instance = this;
//씬 전환이 되더라도 파괴되지 않게 한다.
//gameObject만으로도 이 스크립트가 컴포넌트로서 붙어있는 Hierarchy상의 게임오브젝트라는 뜻이지만,
//나는 헷갈림 방지를 위해 this를 붙여주기도 한다.
DontDestroyOnLoad(this.gameObject);
}
else
{
//만약 씬 이동이 되었는데 그 씬에도 Hierarchy에 GameMgr이 존재할 수도 있다.
//그럴 경우엔 이전 씬에서 사용하던 인스턴스를 계속 사용해주는 경우가 많은 것 같다.
//그래서 이미 전역변수인 instance에 인스턴스가 존재한다면 자신(새로운 씬의 GameMgr)을 삭제해준다.
Destroy(this.gameObject);
}
}
//게임 매니저 인스턴스에 접근할 수 있는 프로퍼티. static이므로 다른 클래스에서 맘껏 호출할 수 있다.
public static GameMgr Instance
{
get
{
if (null == instance)
{
return null;
}
return instance;
}
}
...
}
Monobehaviour 를 상속받지 않는 경우 싱글톤 선언
public class GameMgr
{
//게임매니저의 인스턴스를 담는 전역변수(static 변수이지만 이해하기 쉽게 전역변수라고 하겠다).
//이 게임 내에서 게임매니저 인스턴스는 이 instance에 담긴 녀석만 존재하게 할 것이다.
//보안을 위해 private으로.
private static GameMgr instance;
//게임 매니저 인스턴스에 접근할 수 있는 프로퍼티. static이므로 다른 클래스에서 맘껏 호출할 수 있다.
public static GameMgr Instance
{
get
{
if(null == instance)
{
//게임 인스턴스가 없다면 하나 생성해서 넣어준다.
instance = new GameMgr();
}
return instance;
}
}
//생성자를 하나 만들어줘서 원하는 세팅을 해주면 좋다.
public GameMgr()
{
}
...
}
> https://www.youtube.com/watch?v=-wzULWMvFu0 댓글 내용
1. Awake에서 들어가는 싱글턴 중복 체크는 에디터에서만 Destroy 시키도록 하고 Assert 나 Debug.LogError 통해서 잘못 사용되고 있는 곳이 있음을 throw 해서 원천적으로 2번 생성되는 일을 막도록 하는것이 바람직합니다. 라이브에서 Awake에 들어가는 FindObjectsOfType의 사용은 가급적 지양하는것이 좋습니다.
2. 유니티에 새 기능으로 추가된 Fast Enter PlayMode에서는 기존과 같이 동작하는 Mono Singleton의 static 필드가 초기화되지 않으므로 문제가 발생할 것입니다. [RuntimeInitializeOnLoad] 어트리뷰트를 이용해 static 필드들을 null로 바꿔주는 콜백메서드를 하나 정의해두면 해결됩니다.
3. 모노 싱글턴은 Generic 하게 생성해두고 상속받아 사용하면 편리합니다. 다만 deploy 전에는 보안상 상속관계를 없애준 뒤 난독화하여 배포하는것이 좋습니다. 싱글턴 클래스들은 대체로 중요한 역할을 하기 때문에 부모클래스가 파악되어버리면 보안상 허점이 비교적 쉽게 드러날 수도 있습니다.
'TIL' 카테고리의 다른 글
20231229 TIL (1) | 2023.12.29 |
---|---|
20231228 TIL (0) | 2023.12.28 |
20231227 TIL (0) | 2023.12.27 |
20231222 TIL (1) | 2023.12.22 |
20231221 TIL (0) | 2023.12.21 |