2024-10-16
0. 아래에서 위로만 올라갈 수 있는 (일방통행) 발판 - 구현
[오늘의 목표]
1-1. 발판을 밟고 있을 때 : 시간이 지날 때마다, 발판이 부서지는 것처럼 Sprite 변경
1-2. 발판이 부서졌을 때 : 발판의 Sprite, Collider2D 를 비활성화
1-3. 발판에서 떨어졌을 때 : 발판의 Sprite, Collider2D 를 초기화
OnCollisionEnter2D 로 플레이어와 접촉을 감지
→ Platform Effector 2D 의 영향으로, 아래에서 위로 점프하는 동안에도 감지가 됨
→ 플레이어가 발판에 올라가기도 전에, 발판이 부서지는 현상이 발생
Physics2D 의 OverlapBox 메서드를 통해, 플랫폼 위에 감지 센서를 설정.
→ LayerMask 를 통해, 플레이어가 발판 위에 있을 때만 감지하도록 설정
플레이어가 발판 위에 있을 때, 코루틴을 실행하여 발판이 조금씩 부서지는 연출
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;
}
주어진 위치와 크기를 가지는 사각형의 영역 내에서 충돌이 발생하는지 확인
(충돌하는 객체는 Collider 2D 를 가진 오브젝트)
Collider2D OverlapBox(Vector2 point, Vector2 size, float angle, int layerMask = DefaultRaycastLayers)
point
(Vector2): 상자의 중심 좌표. OverlapBox
는 이 위치를 기준으로 충돌 감지를 시작size
(Vector2): 상자의 가로 및 세로 크기. 이 값을 통해 감지할 상자의 크기를 설정angle
(float): 상자의 회전 각도. 기본적으로 0이면 상자는 회전되지 않으며, 양수 값은 시계 방향 회전을 나타냅니다.layerMask
(int) : 특정 레이어의 오브젝트들만 감지하고 싶을 때 레이어 마스크를 사용. 기본값은 모든 레이어에서 충돌을 감지