추가 조사 없이 TIL 적으려 내 맘대로 비유하고 정의 내린 부분이 많음.
오브젝트란 무엇인가?
![](https://blog.kakaocdn.net/dn/cCcd4e/btsv8iPU8KQ/Y8YSe9xhinvmQiJnMe9Kdk/img.png)
- 우리가 변수 선언하고 카메라 설정하는 모든 것들은 전부 오브젝트를 만드는 과정이다.
![](https://blog.kakaocdn.net/dn/bEYVuf/btsv5lzF1bW/zmwhYWHvJDYaoqhGYBKD3k/img.png)
![](https://blog.kakaocdn.net/dn/bKZxS1/btsv8UH01Sz/WocWmdKujQixw9j4esfEv0/img.png)
큐 설명
![](https://blog.kakaocdn.net/dn/bvLpDw/btsv7obTlXK/VyzBfzIddFW5xXmKKwKE70/img.png)
- 선입선출
사용하는 입장에서의 제네릭
예제 1 : 랜덤으로 큐브 만들기
- 우리는 C#에서 프로그램이 main()에서 시작함을 알고 있다.
- 사운드매니저, 게임매니저 등등 스크립트가 많아지면 어디서 시작하는지를 알기 어려움.
GameScene.cs
public class GameScene : MonoBehaviour { void Start() { Debug.Log(CharacterManager.Instance); } }
CharacterManager.cs - 싱글턴 MK.2
기존 방식
public class CharacterManager : MonoBehaviour { public static CharacterManager instance; private void Awake() { instance = this; } }
짬 좀 찼으니까오브젝트가 꺼져있다면 인스턴스가 만들어지지 않으므로 구조를 변형해야함.public class CharacterManager : MonoBehaviour { private stiatc CharacterManager _instance; //싱글턴, 아직 null, 실체 public static CharacterManager Instance; //프로퍼티, 위의 것을 감싸는 껍데기 { get { if(_instance == null) { //다른 오브젝트는 new로 선언할 수 없지만, ~~~여기부터 질문하기. GameObject go = new GameObject("CharacterManager"); _instance = go.AddComponenet<CharacterManager>(); DonDestroyOnLoad(_instance); } return _instance; } } private const int EnemyCount = 10; private const string EnemyPrefName = "Enemey"; private void Start() { for(int i = 0; i < _enemyCount; i++) { GameObject res = Resources.Load<GameObject>("Enemy"); float randX = Random.Range(-10, 10); float randX = Random.Range(-10, 10); GameObject instantiate = Instantiate(res, new Vector3(randX, y:0, randZ), Quaternion.identity) } } }
GameManager.cs
public class GameManager : MonoBehaviour { private stiatc CharacterManager _instance; //싱글턴, 아직 null, 실체 public static CharacterManager Instance; //프로퍼티, 위의 것을 감싸는 껍데기 { get { if(_instance == null) { //다른 오브젝트는 new로 선언할 수 없지만, ~~~여기부터 질문하기. GameObject go = new GameObject("CharacterManager"); _instance = go.AddComponenet<CharacterManager>(); DonDestroyOnLoad(_instance); } return _instance; } } Queue respawnQueue = new Queue; //리스폰대기열 private float curTiem = 0f; private float resapwnTime = 2f; private void Update() { if(Input.GetMouseButtonDown(0)) { //지금 로직에 상관없는 부분. 그러려니 하셈 Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); RacastHit hit; if(Physics.Raycast(ray, out hit)) { Debug.Log(hit.collider.name); //2번 변형 // } } public void RegisterRespawn(GameObject go) { respawnQueue.Enqueue(go); } }
![](https://blog.kakaocdn.net/dn/HVC9z/btsv7W0vOsi/MuDCfcukptSfzUcBHSl0Q0/img.png)
![](https://blog.kakaocdn.net/dn/nlOoh/btsv7VHit5r/uT0yexkmkhmkzPRBUdvagK/img.png)
당장은 개념을 배우는 과정이니 게임 로직은 무시하고
![](https://blog.kakaocdn.net/dn/rJYFI/btsv0meD8pS/d9KAv2UDV7kyQgbbbmWRc1/img.png)
- 그럼 차라리 게임 오브젝트만 집어넣어 보시라!
![](https://blog.kakaocdn.net/dn/bRUYeK/btsv7U2F50y/aEEkJ1aK7ujkiTmGup26x0/img.png)
- 어차피 형식이 지정되어 있으니, 꺼낸 놈은 게임오브젝트로 사용하면 되기에 중간과정 생략.
- 예외 처리 안 함.
- 타입 확인 안 함.
만드는 입장에서의 제네릭
예 1)
![](https://blog.kakaocdn.net/dn/b4N2aY/btsv9QyGhJ6/FfwE94KSuCXrDvvRM4E0Yk/img.png)
![](https://blog.kakaocdn.net/dn/c95sde/btsv9NhHz4K/snSV4dzuTUXR4K4PV2fPsK/img.png)
- 중복되는 부분 추출해서 함수로 뽑아내버리겠다!!!!
예 2) 싱글턴
![](https://blog.kakaocdn.net/dn/pfT7R/btswbGbhrSX/ukxaHCfQ1q0jeihnCZRGV1/img.png)
생각해보자
![](https://blog.kakaocdn.net/dn/eorVYZ/btsv7fzfLG9/U2xm2Z2Or92nPJOBomShK1/img.png)
- 따라서 어차피 게임오브젝트 올거니까 게임 오브젝트 대상인 함수를 가져다 쓰겠다.
따라서 아래와 같이 제네릭에 클래스명을 기입하여 싱글톤 처리가 완료된다.
![](https://blog.kakaocdn.net/dn/t2GAT/btsv0x1ysTF/8TLVwpNKSPlr8omkyV8DlK/img.png)
![](https://blog.kakaocdn.net/dn/bdZmtK/btsv92sflOs/htuKjcLknzD6OdmqHkKN70/img.png)
장점
- 오류방지
- 예외처리
- 가독성
- 성능향상 (if문으로 경우의 수 따지는게 노이득이라)
var에 넣을 때와 object에 넣을 때의 차이
- Object : 들어가는 대상이 실제 오브젝트로 형변환이 일어남.
- var : 값이 초기화되는 그 순간 해당 값의 타입으로 고정
![](https://blog.kakaocdn.net/dn/bNC9K2/btsv93LsgTE/wkLErcHqtf1nWNyBfemik1/img.png)
Uploaded by N2T