adsense



오브젝트 풀링

한 개의 싱글톤 클래스(ObjectPool)를 만들고, 해당 싱글톤이 여러 종류의 프리팹의 생성/제공/반납을 관리합니다.

한 종류의 프리팹은 Queue로 관리하고, 이 프리팹 Queue를 Dictionary에 담는 방식.

Dictionary로부터 프리팹 Queue를 가져올 때는 순차 인덱스 번호를 씁니다.

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4.  
  5. public class ObjectPool : MonoBehaviour
  6. {
  7. public static ObjectPool Instance;
  8.  
  9. [SerializeField]
  10. private MonoBehaviour[] poolPrefab;//여기 풀링할 오브젝트가 순서대로 들어간다
  11.  
  12. Dictionary<int, Queue<MonoBehaviour>> dics = new Dictionary<int, Queue<MonoBehaviour>>();
  13.  
  14. private void Awake()
  15. {
  16. Instance = this;
  17.  
  18. var initInfo = new Dictionary<int, int>();
  19. initInfo.Add(0, 10);//0번 프리팹 10개
  20. initInfo.Add(1, 10);//1번 프리팹 10개
  21.  
  22. Initialize(initInfo);
  23. }
  24.  
  25. private void Initialize(Dictionary<int, int> initInfo)
  26. {
  27. int _max = (int)Mathf.Max(poolPrefab.Length, initInfo.Count);//초기화 대상 오브젝트의 종류 수
  28. for (int i = 0; i < _max; i++)
  29. {
  30. var dic = new Queue<MonoBehaviour>();
  31. for (int j = 0; j < initInfo[i]; j++)
  32. {
  33. dic.Enqueue(CreateNewObject(i));
  34. }
  35. dics.Add(i, dic);
  36. }
  37. }
  38. private MonoBehaviour CreateNewObject(int keyNum)
  39. {
  40. var newObj = Instantiate(poolPrefab[keyNum]).GetComponent<MonoBehaviour>();
  41. newObj.gameObject.SetActive(false);
  42. newObj.transform.SetParent(transform);
  43. return newObj;
  44. }
  45. public static MonoBehaviour GetObject(int keyNum)
  46. {
  47. var dic = Instance.dics[keyNum];
  48.  
  49. if (dic.Count > 0)
  50. {
  51. var obj = dic.Dequeue();
  52. obj.transform.SetParent(null);
  53. obj.gameObject.SetActive(true);
  54. return obj;
  55. }
  56. else
  57. {
  58. var newObj = Instance.CreateNewObject(keyNum);
  59. newObj.transform.SetParent(null);
  60. newObj.gameObject.SetActive(true);
  61. return newObj;
  62. }
  63. }
  64. public static void ReturnObject(int keyNum, MonoBehaviour obj)
  65. {
  66. var dic = Instance.dics[keyNum];
  67.  
  68. obj.gameObject.SetActive(false);
  69. obj.transform.SetParent(Instance.transform);
  70. dic.Enqueue(obj);
  71. }
  72.  
  73. private void OnDestroy()
  74. {
  75.  
  76. for (int i = 0; i < poolPrefab.Length; i++)
  77. {
  78. var dic = dics[i];
  79. while(dic.Count > 0)
  80. {
  81. var obj = dic.Dequeue();
  82. Destroy(obj);
  83. }
  84. }
  85. }
  86. }
  87.  

사용할 프리팹은 인스팩터에서 등록해줍니다.



동작 예. ObjectPool에서 꺼냈다 반납했다 하는 것이 시각적으로 확인됩니다.




전체 코드를 포함한 예제는 아래에서.



[그리즐리판다 마법소녀 마도카☆마기카 극장판] 루미너스

아무래도 1월 중에 추가 완성작이 나오기 힘들거 같으니 우선 업로드를.
완성작이 더 나오면 또 결산 따로 하고요..



이어지는 내용

[cocos2d-x] 패스워드 걸린 zip 풀기

zlib-unzip 라이브러리의 API를 이용해서 패스워드 걸린 압축파일을 해제하는 방법입니다.
소스 압축파일의 위치는 Resources(Assets) 폴더일 수도 있고, writablePath에 지정된 로컬폴더일 수도 있습니다.

사용법 : 

loadZIP(압축파일명, 패스워드);

파일이 해제되는 위치는 로컬폴더입니다. 여기 풀어놓은 리소스를 억세스하기 위해
FileUtils::getInstance()->addSearchPath(FileUtils::getInstance()->getWritablePath());
가 필요합니다.

게임이 다운로드 가능한 서버에 연결할 수 있으면 좋겠지만 그렇지 못한 경우,
보통 게임에 포함된 리소스가 훤히 노출되니까 그걸 막아보려는 용도로 사용할 수 있습니다.

schedule을 써서 파일 하나씩 풀도록 하면 로딩바(프로그레스 타이머)를 구현하는 것도 가능합니다.


※ 3.17.2에서는 어떤 문제로 컴파일 오류가 납니다. 4.0에서는 테스트 확인, 검색해본 바로는 오히려 3.17.2 미만 버전에서는 된다는데..


코드 보기

[피규어] 12월 결산



12월의 완성작은 캬라구민 아스나와 T's SYSTEM 시마카제입니다.

기록을 찾아보니 둘 모두 2014년 겨울 원페-그 폭설로 전설이 된-에서 사온 것들이네요.
제 입장에선 마지막으로 방문한 원페입니다. 그 이후로 쭉 개인사업자를 빙자한 무직으로 지내고 있는지라.

마지막 원페라고 직감했는지 많이도 샀습니다..


이어지는 내용

이게 뭔 소리야


아래 아스나 포스팅한게 5일 전인데 뭔소리여.

혹시나 해서 다른 브라우저에서 로그인해보니까 정말 휴면처리 되어 있음. (휴면 경고 메일 온 적도 없는데)

휴면 해제도 안했는데 포스팅은 또 되고


1 2 3 4 5 6 7 8 9 10 다음


Books

Geek라이프

잘 그리기 금지
사이토 나오키 저/박수현 역

MSX&재믹스 퍼펙트 카탈로그
마에다 히로유키 저/조기현 역

mignon이 알려주는 피부 채색의 비결
mignon 저/고영자, 최수영 역

핵심강좌! Cocos2d-x
이재환 저
예스24 | 애드온2
일본서적 전문사이트 NEPIC