일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 프로그래머스
- InputManager
- 유니티
- Generic
- c#
- 자료구조
- 직렬화
- soundmanager
- delegate
- unity
- 배열
- skybox
- 스택
- 코루틴
- 스파르타내일배움캠프
- 람다식
- 장애물달리기
- script
- ObjectPool
- 인터페이스
- invokec#events
- LINQ
- FSM
- BGM
- 유한상태머신
- 비선형자료구조
- 메서드
- inputsystem
- 효과음
- UI
- Today
- Total
Unity 개발일지
[Unity] 장애물 달리기 만들기 2 - 구현 - 본문
스크립트는 총 4개로 구성되어있다.
[AvoidObstacleObjectPool]
장애물들을 관리할 ObjectPool이다.
5가지의 장애물을 쏠 것이기 때문에 Key 값을 입력하면 Value 값을 출력하도록 Dictionary를 사용하였다.
주석과 같은 이유로 Value값을 List에서 Queue로 바꾸었다.
각 장애물별로 Object를 생성해주기 위해 for문을 사용하였으며, Enqueue로 Queue에 넣어준다.
ObjectPool에서 가져오고, 반납하는 함수이다.
특이점이 있다면
Queue를 썼기 때문에
Duqueue와 Enqueue를 이용했다.
[ShootObstacle]
장애물을 쏠 Shooter에 등록 할 스크립트이다.
게임을 만드는 과정에서 이부분에서 가장 많은 트러블슈팅을 했다.
우선 물체를 쏠 위치를 정하는 과정에서
obstacle.transform.position = transform.position;
rb.velocity = transform.forward * shootSpeed; 를 사용하였다.
이렇게 하면 forward(Z축의 방향)으로 쏘게 되는데
단일 Object로 이루어져있는 경우 물체의 방향이 틀어질 경우 Z축의 방향도 틀어지기 때문에
내가 원하는 모양으로 쏠 수 없게 된다.
이렇게 되면 내가 원하는 Rotation으로 설정해서 쏘는 코드가 추가로 작성되어야한다.
하지만 빈오브젝트에 모델링을 넣은 오브젝트를 자식으로 넣게된다면
위의 그림은 Sword 빈 오브젝트이고, 아래는 Sword_model로 모델링이 들어있는 오브젝트이다.
보다시피 X,Y,Z 축이 부모 오브젝트와 다르다.
하지만
obstacle.transform.position = transform.position;
rb.velocity = transform.forward * shootSpeed;
이 코드는 부모 오브젝트를 기준으로 나가기 때문에 자식오브젝트의 축을 원하는대로 틀 수 있다.
[AvoidObstacleGameManager]
이번 게임진행을 담당할 GamaManager이다.
bool 함수를 이용해 클리어 시 true로 만들고, Object를 없앨 것이다.(아직 미진행, TODO)
코루틴을 이용해 물체를 2초마다 쏘고,
currentObstacleType은 5개중 랜덤으로 하나를 선택해서 쏘고,
5개의 Shooter중 1개는 랜덤으로 쏘지 않는다.
[Weapon]
마지막으로 발사체에 등록 될 스크립트이다.
초기에는 ObjectPool을 받아오고, 출발점의 Trigger 콜라이더와 충돌 시 NameToLayer로 레이어충돌감지를 사용하여
ObjectPool로 반납했다.
그리고 플레이어와 충돌하여도 계속 진행하도록 OnCollisionEnter CompareTag충돌감지를 하여
속도를 유지하도록 했다.
하지만 진행 중 플레이어와 충돌 시 장애물이 멈추는 현상이 일어나 Stay, Exit에도 적용해주었고,
Rigidbody의 Drag, Angular Drag를 0으로, Collision Detection을 Continuous로 적용하였다.
< 추가사항 >
프로젝트를 모두 마치고 Build중에 장애물이 발사되지 않는 현상이 발견되었다.
Debug메세지를 UI창에 띄우면서 빌드를 해서 오류로 예상되는 내용을 2가지로 축약했다.
1. Weapon 오브젝트들이 Prefab으로 되어있는데 빌드에서 제외가 되었다.
2. Shooter에 등록된 ShootObstacle이 ObjectPool을 제대로 참조하지 못하여 Shoot 함수가 작동하지 않는다.
[1. Resources 폴더를 사용하여 빌드에 포함시킨다]
Assets 폴더의 하위폴더로 Resources 폴더를 만든 후 Prafab들을 옮겨주었다.
기존 obstableGO로 정의했던 List를 수정해주었다.
InitializePool 함수의 Resources.Load<GameObject>(${obstacleName}"); 으로 프리팹들을 불러온다.
이렇게 수정했는데도 Build 시 오류를 해결하지 못해서 두번째 로 넘어갔다.
[2. ShootObstacle이 Shoot함수를 작동할 수 있게 수정한다]
private로 정의 후 Start에서
FindObjectType으로 Object를 가져왔던 방법에서
public으로 Scene에서 드래그드롭으로 바꿔주었다.
Scene에서 바뀐 부분을 확인하여 누락된 것들을 수정해주고 실행하니
Build 후에도 잘 생성되었다.