ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 플레이어 점프 && 대쉬
    카테고리 없음

     

    작업 진행 중인 영상 입니다.

    이중 점프의 로직 설계부터 살펴 보겠습니다.

     

    점프 키는 "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에서 진행 되었습니다.

     

    Rigidbodyvelocityx축, 즉 플레이어의 이동에 곱하기 dashSpeed를 해주었습니다.

     

    마지막으로 대쉬 애니메이션 입니다.

     

    대쉬 애니메이션 끝 부분에 Event를 걸어 주었고 새로운 스크립트 DisableObject를 작성하였습니다.

    public class DisableObject : MonoBehaviour
    {
        public void AutoObjectDisable()
        {
            gameObject.SetActive(false);
        }
    }

    이 함수(AutoObjectDisable())가 실행 되면 해당 오브젝트는 비활성화 상태가 됩니다.

     

    이 오브젝트가 활성화 되는 경우는 위 코루틴 함수 Dash에서

     

    if (playerJump.CheckGround()) dashEffect.SetActive(true);

     

    와 같이 조건을 걸어 주어 활성화가 되게 해주었으며

     

    플레이어가 DashDashEffect가 활성화 되고 DashEffect의 애니메이션이 종료되는 시점에 비활성화가 되게 해주었습니다.

    댓글

김효겸 / Tel. 010-7735-0580 / E-mail. dollzzang2@hanmail.net