본문 바로가기

내배켐 Unity TIL

Unity 26일차 TIL - Unity 팀 프로젝트 3 (RigidBody 2D)

3일을 두 Object의 RigidBody 충돌을 어떻게 제어할 수 있는지 고민하고 시도하고 고민하고 시도했던 부분을 아직 완전하게 해결은 못했지만 어느 정도 꼼수를 이용해서 구현했다.

 

문제였던 부분은 Ball이 내려올 때 Paddle의 옆면에 치이게 되면 Ball의 속도가 증가하게 된다.

그래서 RigidBody를 둘 다 적용했지만 한 Object에는 영향을 받지 않게 설정을 해주고 싶었는데 이 부분을 아무리 찾아봐도 답이 없었다.

 

그래서 생각해낸 게 Ball이 충돌감지를 했을 때 그 Layer가 Paddle인 경우와 Paddle이 충돌감지를 했을 때 그 Layer가 Ball인 경우에는 Ball과 Paddle의 RigidBody2D의 Velocity를 zero로 먼저 넣어주고, 그 뒤에 원래 넣으려고 했던 Velocity 값을 넣어주게 만들었다.

 

이렇게 하니까 일정 부분은 해소가 됐지만 그럼에도 Ball이 Paddle에 옆면을 가격 당했을 때 Ball의 속도에 영향을 줬다.

 

방금 이걸 쓰다가 깨달은 사실인데 RigidBody2D의 Velocity는 Vector2로 구성이 돼있다.


Vector2에서 magnitude 즉 Vector2의 크기를 읽을 수 있는데, Ball의 이동을 구현할 때 Vector2를 정규화 시켜주고 speed라는 변수를 곱해줘서 만든 Vector2 값을 RigidBody2D의 Velocity에 넣어준다.
그러니까 Ball의 Velocity 값을 Vector2로 저장을 하고 magnitude 값을 읽었을 때 speed 변수에 넣었던 값과 동일해야 된다.

이 점을 이용해서 FixedUpdate를 통해서 (Vector2)Velocity.magnitue != Ballspeed 일 때 magnitude를 변경하고 싶었지만 읽기 전용이었다.

 

그래서 RigidBody2D의 velocity를 Vector2 변수(편의상 a)에 저장한다.
a.magnitude를 통해 현재 velocity에 적용돼 있는 Vector2의 크기를 알 수 있다. 이때 speed 값과 동일하지 않다면 RigidBody2D.velocity = a.normalized * speed; 적용시켜 보정해 준다. 미리 저장해뒀던 a 변수를 normalized 하는 이유는 진행 반향을 받아오고, 크기를 기존에 speed와 동일하게 적용해야 속도가 변하지 않기 때문에 정규화 시켜줬다.

 

이제 Ball과 Paddle의 충돌이 일어났을 때 속도가 변하게 돼도 기존에 속도로 다시 바꿔주게 된다.

 

굉장히 이상하다고 생각되는 코드지만 어쨌든 해결됐다..?