CoinWarrior 게임 개발 4일차

mingu Lee·2025년 2월 15일

Unity2D - CoinWarrior

목록 보기
4/5
post-thumbnail

오늘은 날아오는 Spike Ball을 무기를 휘둘러서 패링시키는 기능을 추가했다.

Attack 애니메이션


기존 Player Asset에 검을 휘두르는 Sprite가 존재하여 마우스 왼 클릭 시 검을 휘두르는 애니메이션을 추가했다.

마우스 왼 클릭 시 IsAttack 이라는 Trigger를 작동시키고, 해당 Trigger가 작동하면 Run 상태에서 Attack 상태로 변환되게끔 Transition을 연결해주었다.

Spike Ball


Spike Ball도 Object Spawner 안에 추가하여 일정 간격마다 Player 쪽으로 날아오도록 코드를 작성해주었다.

처음에는 랜덤한 간격으로 날라오게끔 코드를 작성했었는데, Jump나 Slide를 해야하는 상황에서 Spike Ball이 날라올 경우 피할 방법이 없기 때문에 Jump나 Slide를 한 후에 Spike Ball이 날라오도록 했다.

Spike Ball에도 충돌 유무를 알 수 있게 Collider를 설정해주었다.

무기의 Collider


애니메이션과 Spike Ball이 준비되었으니 이제 애니메이션에 맞춰서 충돌 영역을 지정해주고, Spike Ball이 해당 영역에 충돌했을 경우 튕겨져 나가는 기능을 추가하면 된다.

검 Object가 따로 있는 것이 아니라 애니메이션에서 검이 보여지는 것이기 때문에 검의 Collider Object인 Weapon을 만들어서 Player의 자식 Object로 지정해주었다.

Player 앞에 있는 것이 검을 휘둘렀을 때 생기는 영역이다.

이 충돌 영역이 계속 존재하면 안 되고 검을 휘두르는 타이밍에 맞춰서 Collider를 On/Off 해야할 필요가 있었다.

어떻게 할까 고민하면서 이것저것 찾아보다가 좋은 것을 알게 되었다.

바로, Animation에서 특정 Frame에 Add Event를 하는 것이다.

검을 휘두르는 Frame에서 충돌 영역을 활성화하는 Event를 추가하여 해당 Frame에서만 검의 충돌 영역이 존재하도록 했다. (좀 빡빡하게 2 Frame만 활성화되게 했다)

이후 검을 휘두르는 동작이 끝나면 Collider를 비활성화해주었다.

또한, Spike Ball이 검의 Collider에 충돌하면 패링됐다는 효과를 주기 위해 날라왔던 반대 방향으로 다시 날려보내는 기능도 추가했다.

문제 발생


검의 충돌 영역을 지정해주고 Spike Ball 코드까지 모두 작성하여 테스트를 해봤는데 엉뚱한 결과가 나왔다.

검을 휘둘러 충돌 영역이 생기고 해당 영역에 Spike Ball이 충돌하면 Spike Ball이 튕기는 것까지는 잘 구현됐는데, 갑자기 Player가 Game Over 되어버리는 것이었다.

Spike Ball Script에서 분명 Weapon이랑 충돌했을 때 Event가 발생하게끔 했기에 Weapon에 충돌한건 맞는데... 왜 뜬금없이 Player와도 충돌했다는 거지?

처음에는 이 문제가 왜 발생하는지 몰라서 계속 코드를 수정해보고 테스트 해봤는데 계속 똑같은 결과가 나왔다.

약 1시간 가량 고민했는데 해결하지 못해서 결국 GPT한테 물어봤다.

결론적으로 핵심만 말하자면 '자식이 부모의 Rigidbody2D를 공유하고 있기 때문!' 이다.

처음에는 이게 뭔 소린가 했는데 Unity에서는 부모(Player)와 자식(Weapon)이 같은 Rigidbody2D를 공유하면, Weapon에서 발생한 충돌이 부모인 Player에도 감지된다고 한다.

아까 내가 검의 Collider Object인 Weapon을 Player의 자식 Object로 지정했다고 했는데 (Weapon에는 Rigidbody2D가 없음), 이 때문에 Weapon이 Player의 Rigidbody2D를 공유하고 있었다.

정말 생각지도 못한 부분에 의해서 이러한 결과가 나온 것이라 너무 황당했다.

그래도 원인을 찾았으니.. 해결을 해야했는데 해결 방법을 간단했다.

그냥 Weapon에 Rigidbody2D를 추가하여 부모와 물리적으로 독립시키면 된다.

Rigidbody2D를 추가해서 다시 테스트를 해보니 다행히도 Player한테는 아무런 영향없이 패링 기능이 정상 작동했다.

오늘의 결과물


무기를 휘둘러서 Weapon과 충돌하면 Spike Ball이 패링되고, 무기를 휘두르지 않고 Player와 충돌하면 Game Over가 잘 되는 것을 볼 수 있다.

해당 기능을 추가하면서 Animation에 있는 유용한 기능이나 부모, 자식 Object간의 상호작용에 대해 알게 되어 정말 좋은 공부가 되었다.

내일은 전체적으로 BGM, 패링 등의 Sound를 추가하고 게임을 마무리해야겠다.

profile
Github: https://github.com/dlalsrn

0개의 댓글