플레이어가 플랫폼 위에 올라간 상태에서 아래를 향해 점프할 수 있도록 구현해 볼 것이다
private IEnumerator coDownJump()
{
float y = transform.position.y;
WaitForFixedUpdate wait = new WaitForFixedUpdate();
capsuleCollider.isTrigger = true;
while (transform.position.y > y - 1.6f && transform.position.y <= y)
{
yield return wait;
}
capsuleCollider.isTrigger = false;
}
코루틴을 사용해서 아래로 점프하는 함수를 만들었다
아래를 향하는 로직 자체는 그냥 플레이어가 땅을 밟고 서 있을 수 있게 한 콜라이더의 isTrigger 옵션을 true로 바꿔주었다가, 밟고 있던 플랫폼을 통과하고 나면 다시 콜라이더의 isTrigger를 false로 바꿔주는 것이다
이를 위해 아래로 점프를 시작했을 때의 y좌표를 저장해 둔 다음, 코루틴을 사용해 매 FixedUpdate마다 점프를 시작했을 때의 y좌표보다 1.6f 만큼(만드는 게임의 맵 상태에 따라 적절한 값을 알아서 설정해주면 된다) 아래로 내려갔는지를 체크한다
그러나 이때 아래로 점프를 누른 뒤 아직 플랫폼을 다 통과하기 전에 점프 버튼을 누르게 되면, 위 함수에서 아직 조건을 만족시키지 못했기 때문에 다시 플랫폼 위로 한번 올라왔음에도 플랫폼을 통과해서 밑으로 떨어지게 된다
이를 방지하기 위해 현재 포지션의 y값을 처음의 y값과 비교하여 처음의 y값보다 커지면 콜라이더의 isTrigger를 false로 바꿔줄 수 있도록 하였다
(혹은 더 복잡하지만 bool 타입 변수를 사용해서 함수의 위 아래에 각각 값을 할당하고, 점프를 관장하는 함수에서 해당 변수를 체크해주는 방식으로 콜라이더의 옵션을 변경해줘도 된다)
private void Jump()
{
if (_getKeyS)
{
if (_standOnPlatform)
StartCoroutine(nameof(coDownJump));
return;
}
if (_jumpCount >= 2)
return;
if (_jumpCount == 1 && _unlockDoubleJump == false)
return;
rb.velocity = new Vector2(rb.velocity.x, 0);
rb.AddForce(Vector2.up * _jumpPower, ForceMode2D.Impulse);
_jumpCount++;
}
점프 자체의 함수는 위와 같다
S키 + 점프키를 누르면 아래로 점프하도록 구현하였기에 S키를 누른 상태에서는 _getKeyS 가 true이다
이때 공중에 떠 있는 바닥에서는 아래로 점프해도 무방하나, 가장 바닥에서는 아래로 점프할 수 없기 때문에
점프할 수 있는 바닥과 점프할 수 없는 바닥을 나누어 태그를 지정해주었다
private void OnCollisionEnter2D(Collision2D other)
{
if (other.gameObject.CompareTag("Floor"))
_standOnPlatform = false;
else if (other.gameObject.CompareTag("Platform"))
_standOnPlatform = true;
else
return;
if (_isTakeDowning)
_sword.Swing();
_isTakeDowning = false;
_jumpCount = 0;
}
_standOnPlatform이라는 변수를 하나 만들어서, 위의 DownJump 함수에서 해당 변수가 true일 경우에만 아래로 점프 동작을 한다
Floor와 Platform 둘 다 아닐 경우네는 return하고, 둘 다 어쨌든 딛고 설 수 있는 바닥이기 때문에 공통적으로 수행해야 하는 동작을 아래로 빼두었다
'Programing > Unity(C#)' 카테고리의 다른 글
[C#] 문자 리터럴에 문자가 너무 많습니다(CS1012) (0) | 2024.07.28 |
---|---|
[Unity, Spine] Spine 스킨 변경이 안 되는 문제(setSkin, setSlotsToSetupPose) (0) | 2024.06.07 |
[Unity] 땅에서 플랫폼 위로 점프하는 플레이어 (Platform Effector 2D) (0) | 2024.04.21 |
[C#] 다른 클래스의 코루틴 함수 호출하기 (0) | 2024.04.16 |
[Unity] 8방향으로 탄환을 발사하는 개체 (0) | 2024.04.12 |