-
작업 진행 중인 영상 입니다. 이중 점프의 로직 설계부터 살펴 보겠습니다.
점프 키는 "Space" 그대로 진행이 되었으며, 사용자가 점프 키 입력 후 1초 안에 한번 더 입력하면 한번 더 점프가 가능합니다.
*1초 가 지나면 점프가 되지 않습니다.
또한 그라운드 체크 함수를 활용해 Ground에서 떨어 졌을 시 1초 내에 점프를 하게 되면 사용이 가능해 집니다.
코드를 보겠습니다.
[SerializeField] private Rigidbody2D playerRigidbdy2D; [SerializeField] private Transform layPoint; [SerializeField] private LayerMask layerMask; [SerializeField] private float layerYLength = 0.2f; [SerializeField] private float layerXLength = 0.5f; [SerializeField] private float jumpForce = 1.0f; float coyoteTimeCounter = 0f; [SerializeField] private float coyoteTime = 0f; private void Update() { JumpPlayer(); UpdateJumpBuffer(); } public bool CheckGround() { if (Physics2D.Raycast(layPoint.position, Vector2.down, layerYLength, layerMask) || Physics2D.Raycast(layPoint.position + new Vector3(layerXLength, 0, 0), Vector2.down, layerYLength, layerMask) || Physics2D.Raycast(layPoint.position + new Vector3(-layerXLength, 0, 0), Vector2.down, layerYLength, layerMask)) { return true; } else { return false; } } private void JumpPlayer() { if (Input.GetKeyDown(KeyCode.Space) && coyoteTimeCounter > 0) { playerRigidbdy2D.velocity = new Vector3(playerRigidbdy2D.velocity.x, jumpForce); coyoteTimeCounter = 0; } } private void UpdateJumpBuffer() { if(CheckGround()) { coyoteTimeCounter = coyoteTime; } else { coyoteTimeCounter -= Time.deltaTime; } }
점프 로직은 기존 "PlayerJump" 스크립트 내에서 진행 하였습니다.
점프가 가능할 때 조건문에 coyoteTimeCounter > 0 의 조건을 걸어 주었고 coyoteTimeCounter 의 초기 값은 1 입니다.
그라운드에서 플레이어가 벗어날 시 1 값에서 매 프레임 사이의 간격을 빼줘서 0 이하가 되게끔 하였고
이로 인하여 플레이어가 점프를 했을때나 그라운드에서 벗어날 시 1초 내에 점프가 1회 더 사용이 가능해 졌습니다.
private void StartDash() { if(Input.GetButtonDown("Dash") && canDash) { StartCoroutine("Dash"); } } IEnumerator Dash() { canDash = false; dashing = true; playerAnimations.PlayerDashing(); playerRigidbdy2D.gravityScale = 0; playerRigidbdy2D.velocity = new Vector2(transform.localScale.x * dashSpeed, 0); if (playerJump.CheckGround()) dashEffect.SetActive(true); yield return new WaitForSeconds(dashTime); playerRigidbdy2D.gravityScale = gravity; dashing = false; yield return new WaitForSeconds(dashCooldown); canDash = true; }
대쉬는 코루틴에서 사용을 해주었습니다.
각 대쉬를 할 수 있는지, 대쉬 중인지 체크할 Bool 변수를 두어 제어를 해 주었고, 이동 로직은 현재 플레이어의 이동 및 물리를 담당하는 Rigidbody에서 진행 되었습니다.
Rigidbody의 velocity의 x축, 즉 플레이어의 이동에 곱하기 dashSpeed를 해주었습니다.
마지막으로 대쉬 애니메이션 입니다.
대쉬 애니메이션 끝 부분에 Event를 걸어 주었고 새로운 스크립트 DisableObject를 작성하였습니다.
public class DisableObject : MonoBehaviour { public void AutoObjectDisable() { gameObject.SetActive(false); } }
이 함수(AutoObjectDisable())가 실행 되면 해당 오브젝트는 비활성화 상태가 됩니다.
이 오브젝트가 활성화 되는 경우는 위 코루틴 함수 Dash에서
if (playerJump.CheckGround()) dashEffect.SetActive(true);
와 같이 조건을 걸어 주어 활성화가 되게 해주었으며
플레이어가 Dash 시 DashEffect가 활성화 되고 DashEffect의 애니메이션이 종료되는 시점에 비활성화가 되게 해주었습니다.