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

idim7님의 프로필 이미지

작성한 질문수

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

02-02 플레이어와 발판의 충돌 처리

02-02 플레이어와 발판: PlatformBase 상속클래스 어태치문제

작성

·

19

0

이번 강의에서
PlayerController의 다음 코드가 작동하려면

void UpdateBelowCollision(){

        if( movement.HitBelowObject.TryGetComponent<PlatformBase>(out var platform)){

            if(!platform.IsHit){

                platform.UpdateCollision(gameObject); // gameObject는 플레이어

            }

        }

    }

 

적어도 Platform_00_Moving 프리팹에,
PlatformBase를 상속받은 클래스가 있는 스크립트를 어태치해야 될 것 같습니다.
그래서 GetComponent로도 찾아지고, UpdateCollision메소드도 실행되구요.

답변 2

0

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

Platform_00_Moving의 경우

플레이어가 발판을 밟았을 때(충돌했을 때) 자식으로 등록하는 것과

플레이어가 발판과 충돌이 해제될 때 자식을 해제하는 두 가지 액션이 필요한데

 

PlatformBase는 발판과 충돌했을 때 UpdateCollision()을 호출한다. 는 처리만 되어 있습니다.

 

이 경우 추후에 다른 발판도 충돌했을 때, 충돌 해제할 때와 같이 두 가지 액션이 필요하면

PlatformBase에 2가지 액션에 대한 처리를 구현해둘 수도 있는데

현재 예제에서는 Platform_00_Moving만 두 가지 액션이 필요하고,

결국 충돌이 해제될 때는 OnCollisionExit2D() 메소드를 호출해서 구현해야 하기 때문에

PlatformMoving 클래스는 부모로 PlatformBase를 상속받지 않고

발판과 충돌할 때(OnCollisionEnter2D), 충돌이 해제될 때(OnCollisionExit2D)를

이벤트 메소드로 처리합니다.

 

그래서 Platform_00_Moving 오브젝트를 밟았을 때는 PlayerController 클래스에 있는

if ( .. TryGetComponent<PlatformBase>() .. ) 조건문 내부를 실행하지 않습니다.

 

다른 발판들처럼 발판이니까 PlatformBase를 상속 받아서 처리해야지! 라고 한다면

(1) 충돌했을 때는 UpdateCollision() 메소드를 재정의하고,

충돌 해제할 때는 OnCollisionExit2D() 메소드로 처리한다.

or

(2) PlatformBase 클래스에 충돌했을 때와 충돌 해제할 때의 2가지 액션 처리를 메소드로 정의한다.

다만 이 경우에는 다른 발판들도 충돌 해제에 대한 메소드 재정의를 넣어줘야 하는데 이동 발판 외에는 액션이 없어서 메소드를 비워둔 상태로 둬야 하기 때문에 상속을 받지 않고 별개로 처리하는 방향으로 작성했습니다.

0

안녕하세요, 인프런 AI 인턴입니다. idim7님께서 플레이어와 발판의 충돌 처리 및 클래스 상속 문제에 대해 문의 주셨습니다. 질문에서 명시하신 부분처럼 Platform_00_Moving 프리팹에 PlatformBase를 상속한 클래스가 어태치되어야 정상 동작합니다. 이는 충돌 시 특정 플랫폼 클래스의 메서드를 호출하기 위해 컴포넌트를 찾는 과정이 필요하기 때문입니다.

코드 작동을 위한 설명:

  1. PlatformBase 클래스 상속: Platform_00_Moving 프리팹에 붙여야 하는 스크립트가 PlatformBase를 상속받아야 합니다. 이를 통해 충돌이 일어날 때 _movement.HitBelowObject.TryGetComponent<PlatformBase>()가 정상적으로 작동합니다.

  2. 메서드 호출: 충돌 시 해당 플랫폼의 UpdateCollision() 메서드를 호출하여 플랫폼에 대한 추가적인 동작(예: 움직이기, 타일 바운스 등)을 수행할 수 있습니다.

  3. 충돌 체크 구현: UpdateBelowCollision() 메서드는 플레이어가 아래쪽 충돌을 감지했을 때 HitBelowObjectPlatformBase를 상속받은 클래스인지 확인하고, 해당 클래스의 메서드를 통해 추가 동작을 수행합니다.

이 방법으로 코드를 작성하면, 플레이어가 플랫폼과 충돌할 때 원하는 대로 동작하게 할 수 있습니다. 관련해서 유사한 질문을 참고하면 도움이 될 수 있습니다:

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

idim7님의 프로필 이미지

작성한 질문수

질문하기