유니티 게임 개발/Jumping Rabbit

[유니티] Jumping Rabbit #3 벽 탄성 부여 및 충돌, 연속 점프 구현, 버그 수정

노랑꼬리 2022. 11. 10. 14:13

※ 구현목표

벽 탄성 부여와 충돌판정, 연속 점프 구현

 

01
벽 탄성과 연속 점프 결과

1. 벽 탄성 부여

벽 탄성 부여는 Physics Material 2D을 사용하여 벽에 탄성(Bounciness) 값을 주어 적용한다.

Friction(마찰력) : 콜라이더의 마찰력 계수 (0에 가까울 수록 미끄러워진다. 1에 가까워지면 거칠어진다.(미끄러짐이 없다.)

Bounciness(탄성) : 충돌이 표면에 다시 바운스 되는 정도(0이면 바운스가 없고 1이면 에너지 손실 없이 완전히 튕겨낸다)

 

만들어둔 Physics Material 2D를 벽의 Collider 2D의 Material에 넣어주면 된다.

 

 

2. 연속 점프 구현

 

1) 설계

점프 후 착지 시 바로 점프를 시행하면 점프력이 증가

지상이 아닐 때 점프 입력, 벽에 부딧혔을 때는 연속 점프 스택이 초기화 된다.

 

2) 구현

1
2
3
4
5
6
  void FixedUpdate()
  {
    ComboTime -= 0.01f;
    JumpGauge();
    RayDetect();
  }
cs

 

※ Class에 public float ComboTime을 선언해둠

FixedUpdate() 에서 ComboTime을 0.01f 씩 감소한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
  // 점프 입력
  void Jump()
  {
    // 점프 키를 떼면 점프 실행
    if (Input.GetKeyUp(KeyCode.Space) && !anim.GetBool("isJump"))
    {
      // 연속 점프 판정
      if (ComboTime > 0.0f)
      {
        JumpPower += 1;
      }
      // 점프 파워 계수 초기화
      else JumpPower = 2;
 
      anim.SetBool("isDown"false);
      anim.SetBool("readyToJump"false);
      // 점프 계산식 = JumpPower(점프 계수) * JumpTime(점프 게이지(시간비례))
      rbody.AddForce(Vector3.up * JumpPower * JumpTime, ForceMode2D.Impulse);
      anim.SetBool("isJump"true);
      // 최소 점프 수치
      JumpTime = 1.0f;
      // 연속 점프 게이지 초기화
      ComboTime = 1.0f;
    }
  }
cs

점프 함수에서 연속 점프 기능을 추가하였다.

점프 실행시 만약 연속 점프 판정이라면 파워계수를 상승 시켜 더 강한 점프를 할 수 있도록 하였다.

만약 판정 실패시 점프 계수가 초기화 되어 기본 점프가 실행된다.

 

판정은 매 점프마다 2초의 시간이 주어지고 그 시간 내에 다음 점프를 실행할 시 연속 점프가 되도록 설정하였다.

(FixedUpdate는 1초에 50번 호출되므로 0.01f 씩 호출할 때 1.0을 채우는데 2초가 걸린다)

 

 

3. 버그 수정

01
사각형 발판 끝이나 나뭇가지에서 가끔 끼이는 현상이 생겨난다.

바닥 판정을 RayCast로 하기 때문에 바닥 끝 혹은 파인 홈에서 Ray가 인식을 못하여 캐릭터 조종이 불가능 한 상황이 발생한다.

이를 방지하기 위해 일정 시간이 지났을 때도 여전히 추락중이라면 캐릭터의 위치를 조금 이동시켜 탈출 시켜준다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  void FixedUpdate()
  {
    ComboTime -= 0.01f;
    BugTime += 0.01f;
    BugFixed();
    JumpGauge();
    RayDetect();
  }
 
  void BugFixed()
  {
    if (BugTime > BugFix)
    {
      transform.position += Vector3.left * 0.1f;
      transform.position += Vector3.up * 0.1f;
      BugTime = 0;
    }
  }
cs

캐릭터 위치를 왼쪽 위로 조금 이동시켜준다.

 

 

 

※ 카메라 움직임 제어는 아래 블로그를 참고하여 설정하였다.

선형보간을 이용한 부드러운 추적

 

https://velog.io/@cedongne/Unity-2D-%EC%B9%B4%EB%A9%94%EB%9D%BC-%EB%B2%94%EC%9C%84-%EC%A0%9C%ED%95%9C%ED%95%98%EA%B8%B0

 

[Unity] 2D 카메라 범위 제한하기

2D 게임을 만들 때 카메라가 비추는 영역보다 맵 크기가 크면 맵을 돌아다니면서 서서히 맵이 모습을 드러낸다. 이때 맵의 가장자리로 플레이어가 이동하면 카메라가 맵 밖을 넘어서 비추게 되

velog.io