인프런 커뮤니티 질문&답변

idim7님의 프로필 이미지

작성한 질문수

따라하면서 배우는 고박사의 2D 플랫포머 게임 제작

01-01 플레이어와 타일의 충돌 처리

01-03 부서지지 않고 튀는 타일 충돌처리 부분 코드 바뀌어야 될 것 같습니다.

작성

·

41

·

수정됨

0

설마 소스코드가 잘못 되었을 거라고는 상상을 못하고,,,
아무리 이것저것 설정을 바꾸고 새로 시도해봐도, 강의처럼 되지 않아서 하루종일 고생했습니다....

bounce되는 타일과 충돌했을 경우, 타일이 바운스되어야 되는데 그것이 안되요.

그래서 처음에는 내가 잘못 따라한 것인가 싶어서 강의를 몇번 돌려보고 확인하고, 코드도 확인하고, 배포한 소스코드랑도 비교해 보아도 도저히 답이 안나왔습니다.

그런데, 강사님은 해당코드로 작동이 잘 되니... 이상합니다.

우선, 플레이어가 타일과 부딪치면 타일충돌체에 맞아서 아래로 튕겨나옵니다.
그래서 ResetVelocityY를 해 줄 필요가 없습니다.
위로 솟아서 날라가지 못해요. 저절로 충돌되어 튕겨나오면서 아래로 내려옵니다.(혹시 mass를 늘려서 힘이 강하게 되면 모르겠습니다.)

진짜 문제가 된 부분은
UpdateAboveCollision() 메소드 부분입니다.
if(movement.Velocity.y >=0 && movement.HitAboveObject !=null)
이렇게 조건을 걸어놓았는데,
플레이어가 타일과 충돌하면, 충돌하는 순간 속도가 0 가 되고 곧바로 아래로 떨어지면서 속도가 마이너스가 됩니다.
그런데, 위 조건에서는 속도가 0 보다 클 경우로 하니, 이 조건을 만족하지 못해서 그 아래의 코드가 실행되지 못합니다.

제가 충돌할 때의 플레이어리디드바디속도를 출력하니 모두 마이너스였습니다.
(다른 스크립트에서 속도를 읽을 때는 충돌시점에서 0.0001라도 경과한 시점)

그래서 위 조건을 충족하지 못하니, 충돌해도 타일이 위로 바운스 되지 못했었습니다.

그래서
void UpdateAboveCollision(){

if (movement.HitAboveObject !=null){  

이 조건으로 하면 됩니다.

여기서 ResetVelocityY() 도 호출할 필요 없습니다.

답변 2

0

고박사님의 프로필 이미지
고박사
지식공유자

파괴되지 않는 타일에선 괜찮은데 부서지는 타일처럼 위를 막아주지 않는 타일에서는 ResetVelocityY() 메소드가 없으면 스크린샷과 같이 뚫고 지나가게 됩니다.

 

플레이어가 위로 이동하면서 다른 오브젝트와 충돌할 때 0 또는 0보다 큰 값이 나오기 때문에 >= 이 조건에 반드시 걸리게 됩니다.

그리고 ResetVelocityY() 메소드는 if ( movement.Velocity.y >= 0 .. ) 조건 내부에서 호출하기 때문에 y 속력이 0 이상일 때 내부로 들어가 y 속력을 0으로 초기화해주고, 타일과의 상호작용 처리를 할 수 있습니다.

 

bandicam 2024-10-22 15-56-24-141.jpg

t

idim7님의 프로필 이미지
idim7
질문자

그렇게 해서 안되어서 글을 올린 거예요..

똑같이 따라해서 안되어서,
위와 같이 고치고서 정상적으로 잘 작동해요.

고박사님의 프로필 이미지
고박사
지식공유자

위와 같이 수정했을 때는 일부 타일에서 원하는 작동이 안될 수도 있기 때문에 답글과 같이 작성한 것입니다.

 

머리 부분에서 충돌하는 충돌체에 대한 검출은

MovementRigidbody2D 클래스의 UpdateCollision() 메소드에서 하고 있는데

충돌체의 크기나, 머리 위치 등이 조금 달라서 Player 오브젝트에 있는

Collider2D 컴포넌트가 먼저 충돌하거나 해서

Player 오브젝트가 충돌해서 속력이 0 이하로 떨어지고, 그 이후에 HitAboveObject가 null이 아니게 되어 타일에 대한 처리 코드가 작동할 수도 있습니다.

0

안녕하세요, 인프런 AI 인턴입니다.

님께서 겪고 계신 문제는 “타일과 플레이어가 충돌할 때 발생하는 바운스 문제”로 보입니다. 이와 유사한 문제는 강의 과정에서 종종 발생할 수 있으며, 많은 수강생들이 유사한 상황을 겪고 해결해 나가고 있습니다.

코드 변경 제안
님의 경우, UpdateAboveCollision() 메소드에서의 조건식이 실제 상황과 맞지 않음을 발견하신 것 같습니다.
- 조건식 변경 제안: _movement.Velocity.y >= 0에서 벗어나며 작동되지 않는 코드 부분을 찾아내고, 플레이어의 Y축 속도가 음수이거나 0일 때도 적절히 처리하도록 수정이 필요할 수 있습니다.

더 나아가 문제를 해결하기 위해 몇 가지 추가 요소를 고려해볼 수 있습니다:
1. Physics Material 2D: 바운스를 원하는 타일에 Physics Material을 설정하여 바운스 값을 조절할 수 있습니다.
2. Rigidbody: 플레이어의 Rigidbody 설정을 조정하여, 충돌 시 더 다양한 반응을 하게끔 변경할 수 있습니다 (예: 중력 또는 질량 조절).

유사 질문 및 해결 방법
아래는 관련된 질문과 답변을 참고할 수 있는 링크들입니다. 같은 강의를 듣고 유사한 문제를 해결한 예들을 모아 보았습니다:
- 지그재그 타일생성 질문있습니다.
- 움직임 안됨

만약 더 구체적인 도움이 필요하시다면, 강의를 진행하셨던 커뮤니티나 질문 게시판을 통해 구체적인 에러 메시지나 코드를 공유하면서 질문을 올리시면 더 나은 답변을 받을 수 있을 것입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

idim7님의 프로필 이미지

작성한 질문수

질문하기