
간단한 설명은 생략하고 먼저 프리팹부터 알아보겠습니다.

Tower프리팹의 역할은 지정한 시간을 간격으로 회전을 하면서
Bullet을 생성하고 플레이어를 방해하는 역할을 합니다.

우선 Bullet을 생성하고 관리하는 오브젝트 풀을 사용하는데 List로 오브젝트 풀을 생성하고 일정 간격으로 코루틴을 사용하기 위해 delay는 YieldInstruction을 사용했습니다.

리스트와 delay를 초기화 한 후 pool의 크기만큼 bullet을 인스턴스화 시키고 리스트에 채워주웠습니다.
그 뒤 코루틴이 null이 아닐경우 코루틴 동작을 수행하여 Fire()를 실행하도록 설정하였습니다. start에 코루틴을 설정한한 이유는 시작지점부터 게임 종료 지점까지 tower프리팹은 계속해서 bullet을 생성하도록 구현하기 위함이였습니다.

업데이트에선 OverlapSphere(원점, 반지름, Layer) : 지정된 구체 내에서 Layer와 충돌을 반환하는데 이 길이가 Length>0 - 하나라도 있을경우 true로 지정하여 TargetRotate()함수를 실행하고 아닐경우 TowerRotate()를 실행하도록 설정 하였습니다.

bullet이 날라가도록 CreateBullet()에서 리스트의 마지막 인덱스를 bullet으로 지정하고 리스트의 마지막 인덱스를 지웁니다 bullet은 SetActive를 true로 지정해 활성화 해주고 생성 될 위치는 muzzlePosition, 방향은 bullet에서 지정한 방향으로 진행하도록 하였고, tower 프리팹의 회전을 담당하는 TowerRotate(), 회전을 진행하다 OverlapSphere를 통해 플레이어를 바라보게 하는 TargetRotate()를 구현하였고, 범위를 쉽게 알 수 있도록 OnDrawGizmos를 만들어 주었습니다.

Bullet스크립트로 플레이어와 직접 상호작용하는 오브젝트 입니다

반환 될 bullet객체를 List인 bulletPool에 저장할 수 있게 bulletPool을 지정해주었고, 이는 TowerController 스크립트의 bullet.GetComponent().bulletPool = pool;을 통해 bullet의 pool과 TowerController의 pool을 연결시켜 주었습니다.

ReturBullet은 매개변수(시간)를 받아 시간이 얼마나 지났는지 구분하여 yield return을 진행 하였고 리턴 진행시 Rigidbody.velocity를 초기화 시켜주었습니다. 그리고 플레이어의 태그와 접촉시 Coroutine에 0시간만큼 지정해서 바로 반환 되도록 구현 하였습니다.


플레이어의 움직임 체력, 그리고 UI를 통해 게임 재시작을 위해 OnEnable에서 플레이어 객체가 생성될 떄마다 hp가 3으로 시작하도록 만들어 주었고, FIxedUpdate에서 플레이어의 움직임을 물리를 사용해 움직일 수 있도록 설정 해주었습니다

키입력과 normalized는 update에서 진행 할려했는데 실수로 잘못 기입했습니다. rigid.velocity의 연산값을 fixedupdate에 작성하여 플레이어의 움직임이 일정하게 움직 일 수 있도록 설정했기 때문에 Time.deltaTime은 생략하였습니다.
TakeDamage()와 OnTriggerEnter를 통해 bullet과의 상호작용을 구현하였고, 싱글턴의 이벤트를 사용해 체력이 어느정도 이하로 떨어질 시 이벤트를 발생하도록 설정 하였습니다.


GameManager는 싱글톤을 사용하는 스크립트 입니다 싱글톤은 전역적으로 접근가능하고, 하나의 객체만을 가지는 효과가 있습니다. 먼저 static Instance로 전역적으로 접근 가능하게 설정, OnDied 이벤트 그리고 player를 가지고 왔는데 player의 싱글턴의 경우 가져와서 쓰는 현상을 금기시 하고 있지만 지금은 씬이 하나만 존재하고 Player를 전역적으로 비활성화가 필요하기 때문에 사용하였습니다.

싱글턴을 생성해주고 없었을경우에만 Instance를 생성, DontDestroyOnLoad를 통해 데이터 보존을 설정 해주었습니다

init()은 시작시 게임의 UI를 보여주고 OnEnable,Disable을 통해 구독시켜 주었습니다.

이벤트에서 사용 될 SetActive와 플레이어가 새로 생길떄마다 스폰 될 위치를 작성해주었습니다.