자작 게임도 잘 부탁드려요~

adsense



유니티 2D 슈팅게임 개발일지 - 5일차 (적 캐릭터 패턴)

패턴 매니저

적의 생성과 배치

이게 맞는 방법인지는 솔직히 모르겠는데, 기즈모 배웠으니까 써먹어보려고요.

빈 게임 오브젝트를 만들어 ==== Pattern1 이라고 이름짓고, 여기 PatternManager라는 스크립트를 새로 만들어 붙입니다.

거기 추가로 40개의 빈 게임 오브젝트를 만들어줍니다. (이전 일지에서는 32개)




이 오브젝트 위치가 적 캐릭터가 나열될 모양이 됩니다.


옛날엔 모눈종이(...)에다 그려서 좌표 땄고,
cocos2d-x에서는 포토샵 같은데서 이미지 배치해서 좌표 수동으로 뽑아 썼는데
이렇게 화면에서 보면서 배치 잡아주고 이 좌표 받아다 쓰게 하는게 목적입니다.


기즈모에 숫자 표시

이전엔 Gizmo.Color와 Gizmo.DrawSphere를 써서 붉은 원을 그려줬는데
붉은 원만으로는 재배치할때 어느게 어느건지 구분이 안가서
Gizmos.DrawGUITexture로 숫자를 써서 어느 오브젝트가 몇 번째인가 알 수 있도록 했습니다.

숫자 이미지는 9*9의 도트 숫자로 이걸 적당히 확대해서 씁니다.

  1. public Texture[] textures = new Texture[10];
  2. private void OnDrawGizmos()
  3. {
  4. for(int i=0;i< Poses.Length;i++)
  5. {
  6. if (i % 10 == 0)
  7. Gizmos.color = new Color(0.2f, 0.8f, 1f);
  8. else
  9. if (i % 10 < 5)
  10. Gizmos.color = Color.red;
  11. else
  12. Gizmos.color = Color.yellow;
  13. Gizmos.DrawSphere(Poses[i].position, 15f);
  14. if (textures[0] != null)
  15. {
  16. Gizmos.DrawGUITexture(new Rect(Poses[i].position.x - 27f, Poses[i].position.y - 13.5f, 27, -27), textures[i / 10]);
  17. Gizmos.DrawGUITexture(new Rect(Poses[i].position.x + 0f, Poses[i].position.y - 13.5f, 27, -27), textures[i % 10]);
  18. }
  19. }
  20. }
14~18 : 텍스처 기즈모 그리기 (위치와 크기는 Rect로 지정)

패턴 매니저 스크립트에서, 코루틴으로 적을 생성하면서 개체의 움직임을 제어하는 베지어 곡선의 끝점을 이 좌표로 지정해줍니다.
  1. IEnumerator CreateEnemy()
  2. {
  3. yield return new WaitForSeconds(2f);
  4. int[] idx = { 0, 1, 1, 1, 1, 2, 2, 2, 2, 2 };
  5. for (int i = 0; i < 4; i++)
  6. {
  7. for (int j = 0; j < 10; j++)
  8. {
  9. GameObject Enemy;
  10. if (Enemies[idx[j]].Count == 0)
  11. {
  12. Enemy = Instantiate(Corps[idx[j]]);
  13. }
  14. else
  15. Enemy = Enemies[idx[j]].Dequeue();
  16. EnemyInfo info = new EnemyInfo();
  17. info.lifeMax = 4f;
  18. info.power = 1f;
  19. info.idx = idx[j];
  20. info.isFlip = (i % 2 == 1);
  21. info.finPos = Poses[i * 10 + j];
  22. Enemy.SetActive(true);
  23. Enemy.GetComponent<LinerController>().SetUp(this.gameObject, info, null);
  24. yield return new WaitForSeconds(0.2f);
  25. }
  26. yield return new WaitForSeconds(1f);
  27. }
  28. }
4 : 생성할 적 종류 지정
20 : 이동 궤도 좌우 반전 여부
21 : 적 캐릭터가 찾아갈 최종점 지정

적 개체별 스크립트에서, 곡선을 따라가는 움직임이 끝나면 배치 좌표로 보정시켜줍니다.


그리고 베지어 곡선의 x좌표를 좌우로 플립시켜서 오른쪽 왼쪽에서 번갈아 나오도록 하고 있습니다.
  1. if (info.isFlip)
  2. {
  3. for (int i = 0; i < 7; i++)
  4. {
  5. _wayPoints[i] = new Vector3(_wayPoints[i].x * -1f, _wayPoints[i].y, _wayPoints[i].z);
  6. }
  7. }
마지막 도착점을 제외한 좌표만 x좌표에 -1을 곱해 대칭으로 만듭니다.

배치가 완료된 적 편대


멘탈이 아직 회복이 덜 되어서 진도가 멈춰있습니다.. 뭔가 스트레스를 좀 풀어줘야 할텐데.




덧글

댓글 입력 영역


Books

Geek라이프

기초부터 시작하는 모형 전자공작
박성윤 저

사이토 나오키의 일러스트 첨삭 레슨 Before & After
사이토 나오키 저/박수현 역

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

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