Unity 심화 팀 프로젝트 - 5 (End)

이준호·2024년 1월 8일
0

📌 Unity 게임 개발 심화 - 팀 프로젝트



📌 트러블 슈팅

➔ Rigidbody Trigger

1. 공격범위(AttackDintance) 안으로 들어오면 몬스터가 고장

  • 이유 : 플레이어가 감지범위(detectDintance) 안으로 들어오면 플레이의 Transform을 가져오고 나가면 다시 null로 바꿔주는데 플레이어가 들어와서 Transform.position으로 몬스터와 플레이어의 거리와 방향을 계산하고 움직이거나 공격을 하는데, Rigidbody가 있는 상태에서 부딪히니 설정된 좌표와 틀어져 고장이 나버린듯 하였다.

  • 해결법 : 몬스터의 Rigidbody를 Is Trigger 체크를 해주어서 부딪히는게 아니고 통과하도록 하여 고쳤다.




➔ Selector & Sequence

2. 트리의 순회가 이상하게 돌아감.

  • 이유 : 시퀀스나 셀렉토의 노드에 진입하여 foreach로 자식의 노드를 검사하며 반환타입에 따라 진행할지 그만할지 재검사할지가 정해지는데 foreach의 자식 노드를 다 돌때까지 반환값이 없이 진행이 된다면 반복문을 탈출하여 다른 반환값을 반환하게 된다. 그러나 나는 그것을 생각하지 못하고 당연히 원래 반환하는 값대로 상위 부모노드에게 전달해준다고 생각해버렸었다.

  • 해결법 : Sequence나 Selector노드의 반복문을 나와서 반환하는 타입을 확인하고 그에 맞게 트리의 구조를 변경하고 새롭게 다시 구성했다.




➔ Animation Parameter & Transition

3. 몬스터가 아무도 없는데 허공에 공격함.

  • 이유 : 몬스터가 노드를 순회하다 공격을 하는 노드에 진입하여 공격을 시작할 때, 나는 애니메이션의 파라미터 타입을 Trigger로 하여 한번 발동시키는 방법으로 하였다. 그러나 그렇게 하니 순회를 돌다가 공격을 하려고 Trigger에 체크가 된 상태로 다음 노드에서 다른 애니메이션으로 넘어간 상태여서 체크된게 발동하지 못하고 대기하다가 다시 Idle상태로 넘어오면 갑자기 공격이 나가버렸다.

  • 해결법 : Trigger 파라미터를 bool타입 파라미터로 바꿔주고 각 상황별로 Attack이 나오면 안되는 예외상황들을 확인하여 혹시나 공격 파라미터가 true라면 false로 바꿔놓게 하였다.




➔ RayCastHit

4. 몬스터와 플레이어 사이에 다른 몬스터가 막고있으면 바보가 되버림.

  • 이유 : 몬스터가 플레이어를 따라갈 때, 벽이 막고있다면 따라가지 못하게 하려고 RayCastHit을 사용하여 체크를 해주고 있었는데, RayCastHit을 배열로 만들어 RayCastHit.Length가 1보다 커지면 따라가지 않게 하거나 Ray를 쏘는 몬스터의 Collider를 제외하고 다음 충돌체 RayCastHit[1]의 tag가 Player인지 검사를 하도록 단순하게 생각을 해버렸다가 플레이어와 몬스터 사이에 다른 오브젝트가(몬스터, 자원 등)이 있으면 바보가 되는거였다.

  • 해결법 : RayCastHit[]을 foreach로 돌려서 CompareTag에 Player가 있는지 찾고 그 전 충돌 물체중에 가로막을만한게 잇나 체크를 하려고 했지만, 과한 연산인듯 하여 RayCastHit[1]의 태그가 "Wall"이 아니라면 으로 바꿔 고쳤다.












📌 최종 BT구조

➔ Near Enemy

➔ Far Enemy

➔ 상속구조












📌 느낀점

Behaviour Tree를 짜면서 재미도 느꼇지만 머리도 상당히 아팠다. Tree구조를 설계를 할 때는 당연히 이렇게 하면 돌아갈줄 알고 설계를 했지만 막상 코드로 옮기고 실행하면 위에 이유들로 버그가 항상 존재하여 구조를 계속해서 수정하면서 짯다.
아직 BT에 대한 이해도가 떨어져서 그렇다고 생각한다. 다음에 또 할 기회가 있다면 좀 더 신중하고 자세하게 완벽한 구조를 짜보도록 할 것이다.

profile
No Easy Day

0개의 댓글