[TIL] 일방통행 플랫폼 (2)

MINO·2024년 10월 16일
0

2024-10-16


목표

0. 아래에서 위로만 올라갈 수 있는 (일방통행) 발판 - 구현

[오늘의 목표]
1-1. 발판을 밟고 있을 때 : 시간이 지날 때마다, 발판이 부서지는 것처럼 Sprite 변경
1-2. 발판이 부서졌을 때 : 발판의 Sprite, Collider2D 를 비활성화
1-3. 발판에서 떨어졌을 때 : 발판의 Sprite, Collider2D 를 초기화

구상

초기 구상

OnCollisionEnter2D 로 플레이어와 접촉을 감지
→ Platform Effector 2D 의 영향으로, 아래에서 위로 점프하는 동안에도 감지가 됨
→ 플레이어가 발판에 올라가기도 전에, 발판이 부서지는 현상이 발생


변경점

Physics2D 의 OverlapBox 메서드를 통해, 플랫폼 위에 감지 센서를 설정.
→ LayerMask 를 통해, 플레이어가 발판 위에 있을 때만 감지하도록 설정


스크립트 구현

플레이어가 발판 위에 있을 때, 코루틴을 실행하여 발판이 조금씩 부서지는 연출

  • Angvik 에서는 나뭇가지가 부서지는 Sprite 여러 개를 사용하여, 시간의 흐름에 따라 Sprite 를 변경
  • 아직 에셋과 디자인 컨셉이 정해지지 않아, 임시로 오브젝트가 투명해지는 연출로 대체
 void Update()
 {
	 // 플레이어가 발판을 밟고 있는지 확인
     pos = (Vector2) transform.position + new Vector2 (0,0.1f);
     Collider2D player = Physics2D.OverlapBox(pos , boxSize, 0f, playerLayer);

     // 플레이어가 감지되면 isCollidingWithPlayer를 true로 설정
     if (player != null)
     {
         isCollidingWithPlayer = true;

         // 코루틴이 실행 중이 아니라면 시작
         if (!isCoroutineRunning)
             StartCoroutine(isBreaking());
     }
     else
         isCollidingWithPlayer = false;
 }
 
 private IEnumerator isBreaking()
{
    isCoroutineRunning = true;

    // 투명화 단계
    float elapsed = 0f;
    Color originalColor = spriteRenderer.color;

    while (elapsed < fadeDuration && isCollidingWithPlayer)
    {
        elapsed += Time.deltaTime;
        float alpha = Mathf.Lerp(1f, 0f, elapsed / fadeDuration); // 투명도 1에서 0으로 변화
        spriteRenderer.color = new Color(originalColor.r, originalColor.g, originalColor.b, alpha);
        yield return null;
    }

    // 투명도가 0 이 될 때까지 플레이어가 발판을 밟음, 발판이 비활성화된 상태 (일정 시간 대기 후, 원상 복구)
    if (spriteRenderer.color.a == 0)
    {
        spriteRenderer.enabled = false; // 스프라이트 비활성화
        platformCollider.enabled = false; // 콜라이더 비활성화

        // 일정 시간 기다리기
        yield return new WaitForSeconds(resetDuration);

        // 색상을 완전히 복구
        spriteRenderer.color = new Color(originalColor.r, originalColor.g, originalColor.b, 1f);
        spriteRenderer.enabled = true;
        platformCollider.enabled = true;

    }
    else // 발판이 바활성화 되기 전, 플레이어가 발판에서 떨어졌을 때 (원상 복구)
    {
        spriteRenderer.color = new Color(originalColor.r, originalColor.g, originalColor.b, 1f);
    }

    isCoroutineRunning = false;
}

주요 코드

Physics2D.OverlapBox

주어진 위치와 크기를 가지는 사각형의 영역 내에서 충돌이 발생하는지 확인
(충돌하는 객체는 Collider 2D 를 가진 오브젝트)

Collider2D OverlapBox(Vector2 point, Vector2 size, float angle, int layerMask = DefaultRaycastLayers)
  • point (Vector2): 상자의 중심 좌표. OverlapBox는 이 위치를 기준으로 충돌 감지를 시작
  • size (Vector2): 상자의 가로 및 세로 크기. 이 값을 통해 감지할 상자의 크기를 설정
  • angle (float): 상자의 회전 각도. 기본적으로 0이면 상자는 회전되지 않으며, 양수 값은 시계 방향 회전을 나타냅니다.
  • layerMask (int) : 특정 레이어의 오브젝트들만 감지하고 싶을 때 레이어 마스크를 사용. 기본값은 모든 레이어에서 충돌을 감지

추후 개선점

  • 투명도를 변화 → 나뭇가지나 플랫폼 Sprite 를 추가한 뒤, Sprite 를 변경하는 방식으로 개선
  • 코루틴 보다 성능적인 면에서 효율이 좋은 Unitask 로 구현

결과물

profile
안녕하세요 게임 개발하는 MINO 입니다.

0개의 댓글