마우스로 조준하는 원거리 공격을 미뤄(사실상포기)해두고, 좀더 뱀서스러운 자동 원거리 공격을 강의를 보며 따라해보기로 했다.
일단 캐릭터의 자식 오브젝트로 Scanner를 만들어 적을 찾아 자동 조준하도록 해보겠다.
4가지 변수를 만들었다.
1. float scanRange : 스캔범위.
2. LayerMask targetLayer : 특정 레이어를 타겟으로.
3. RaycastHit2D[] targets : 스캔된 타겟들, 다수이기 때문에 배열( [] ) 이다.
4. Transform nearestTarget : 가장 가까운 타겟.
그 밑에 FixedUpdate로 스캔을 실행할건데, 이 문장도 좀 길어졌다. 풀이하자면.
Phsics2D.CircleCastAll 은 2D물리에서 원형으로 스캔한다는것.
그 뒤엔 ( 캐스팅 시작 위치 , 원의 반지름 , 캐스팅 방향, 캐스팅 길이, 대상 레이어 ) 가 들어간다.
이제 가장 가까운 타겟을 특정할 GetNearest를 설정해주자
이렇게 result = null 과 return result 사이에 들어갈 함수들로 result를 내주면. return으로 값이GetNearest로 돌아가게 된다.
우선 diff 지역변수로 범위 숫자를 만들고
foreach로 순회해주게 되는데 Vector3 myPos로 플레이어 포지션을 선언하고 targetPos로 스캔한 target의 위치를 선언한뒤. Vector3.Distance 기능을 사용해 두 위치간의 거리를 계산해주면 된다.
그렇게 해서 만들어진 길이가 설정된 최소길이(diff = 100)보다 작으면 교체해주게 되고, 결과를 계속 업데이트 해주면 된다!
그렇게 foreach문을 거쳐가면 최소값이 result로 나오게 되고. 그 값은 GetNearest에 들어가게 된다.
그렇게 계산된 값을 미리 만들어준 nearestTarget에 박아주면 끝
이렇게 가장 가까운 Enemy가 설정이 잘 된다.
이제 조준이 잘 되니까 발사할 총알을 만들어주자!
타이머를 주고
기존 스위치 문에 시간이 될때마다 발사하는 로직을 만들어준다.
발사하는 로직도 이렇게 해줬는데. 해설하자면(ChatGPT의 도움 받음)
if(!Circle.scanner.nearestTarget)
return; = > 스캐너에 nearestTarget이 없다면 실행안함
/
Vector3 targetPos = Circle~ => 타겟의 위치를 가져와 Vector3 targetPos에 저장함.
/
Vector3 dir = targetpos - transform.position; => 현재 캐릭터의 위치에서 타겟의 위치를 뺄샘하여 방향 벡터를 구함
/
dir = dir.normalized; => 방향 벡터를 정규화함. 일정한속도로 나아가게 함
/
Transform Orb = GameManager.Instance~ => 게임매니저의 pool을 사용해 해당 id의 발사체를 가져오고 그 위치를 변수에 저장
/
Orb.position = transform.position => 발사체의 위치를 현재 위치로 설정.
/
Orb.rotation = Quarternion.FromToRotation(Vector3.up, dir); => Orb의 회전값을 설정, 발사체가 타겟을 향하도록함.
/
Orb.GetComponent<Orb>().Init(damage, count, dir); => 발사체 스크립트에 있는 Init을 호출, 초기설정(damage 등)을 불러옴
요약하자면
- 가장 가까운 타겟이 있는지 확인하고, 없으면 종료합니다.
- 타겟이 있다면, 타겟의 위치를 구하고, 발사체가 타겟을 향해 날아가도록 방향을 설정합니다.
- 오브젝트 풀에서 발사체를 가져와 현재 위치에서 생성하고, 방향에 맞춰 회전시킵니다.
- 발사체의 초기 설정(Init)을 완료한 뒤, 발사체가 타겟을 향해 발사됩니다.
라고 한다.
'게임개발 > Unity' 카테고리의 다른 글
24-09-10 카드뒤집기 미니프로젝트 02 (2) | 2024.09.10 |
---|---|
24-09-09 카드뒤집기 미니프로젝트 01 (2) | 2024.09.09 |
24-09-03 개인 프로젝트 : Geometry Survivor 03 (1) | 2024.09.03 |
24-09-02 개인 프로젝트 : Geometry Survivor 02 (4) | 2024.09.02 |
24-08-30 개인 프로젝트 : Geometry Survivor 01 (5) | 2024.08.30 |