게임 개발 일지/유니티 엔진 공부

38. 3D 쿼터뷰 게임 제작 - 플레이어 점프 회피

인텔리킴 2024. 6. 20. 18:32

점프 구현

void OnJump()
{
    pRigidbody.AddForce(Vector3.up * 15, ForceMode.Impulse);
}

 

addForce를 이용해 간단하게 점프 구현

 

플레이어 점프

하지만 이 코드만으론 무한 점프가 지속된다는 문제가 생김

 

void OnJump()
{
    if (!isJumping)
    {
        pRigidbody.AddForce(Vector3.up * 15, ForceMode.Impulse);
        isJumping = true;
    }
}

void OnCollisionEnter(Collision collision)
{
    if(collision.gameObject.tag == "Floor") 
        isJumping = false;
}

 

OnCollisionEnter() 함수를 이용해 착지 구현

 

애니메이터

점프와 닷지는 트리거를 이용해 구현, 하지만 점프는 착지모션이 또 따로 있기 때문에 플래그 변수도 하나 생성

 

나가는 시간 설정

Dodge 애니메이션에 들어가는건 따로 Exit Time을 설정할 필요가 없으나

Dodge애니메이션에서 나가는건 따로 Exit Time 이 있어야 애니메이션이 모두 재생되고 자동으로 Exit로 감

 

트리거 플래그 설정

점프하는 순간에 트리거 발생, 착지하는 순간에 플래그 false로 변경

 

void OnJump()
{
    if (!isJumping)
    {
        pRigidbody.AddForce(Vector3.up * 15, ForceMode.Impulse);
        animator.SetBool("isJump", true);
        animator.SetTrigger("doJump");
        isJumping = true;
    }
}

void OnCollisionEnter(Collision collision)
{
    if (collision.gameObject.tag == "Floor")
    {
        isJumping = false;
        animator.SetBool("isJump", false);
    }
}

 기존 함수를 이용해서 애니메이션 재생을 설정

 

점프

 

중력 값

중력값을 조절해서 점프해서 내려가는 속도 조절가능

 

지형 물리 강화

정적 변경

모든 지형 물리를 정적으로 변경

*Collision Detection > Continious는 Static일 때 훨신 효과적으로 작용함

 

리지드바디 설정

리지드바디에서 Is Kinematic을 켜면 직접 움직이지 않는다면 오브젝트가 움직이지 않음

 

물리 머테리얼

마찰력 없는 벽을 만들기위해 Physics Material 추가

추가됨

 

회피 구현

 

void OnDodge()
{
    if (!isDodge)
    {
        playerSpeed *= 2;
        animator.SetTrigger("doDodge");
        isDodge = true;

        Invoke("DodgeOut", 0.4f);
    }
}
void DodgeOut()
{
    playerSpeed /= 2;
    isDodge = false;
}

 

점프와 비슷하게 회피 또한 구현

Invoke 함수를 이용해 회피에서 나가는 시간을 설정해 연속 회피가 불가능하게 함

 

 

회피 구현

void OnJump()
{
    if (!isJumping && !isDodge)
    {
        pRigidbody.AddForce(Vector3.up * 15, ForceMode.Impulse);
        animator.SetBool("isJump", true);
        animator.SetTrigger("doJump");
        isJumping = true;
    }
}

void OnDodge()
{
    if (!isDodge && moveVec != Vector3.zero && !isJumping)
    {
        playerSpeed *= 2;
        animator.SetTrigger("doDodge");
        isDodge = true;

        Invoke("DodgeOut", 0.4f);
    }
}void OnJump()
{
    if (!isJumping && moveVec == Vector3.zero && !isDodge)
    {
        pRigidbody.AddForce(Vector3.up * 15, ForceMode.Impulse);
        animator.SetBool("isJump", true);
        animator.SetTrigger("doJump");
        isJumping = true;
    }
}

void OnDodge()
{
    if (!isDodge && moveVec != Vector3.zero && !isJumping)
    {
        playerSpeed *= 2;
        animator.SetTrigger("doDodge");
        isDodge = true;

        Invoke("DodgeOut", 0.4f);
    }
}

회피 중에는 점프를 못하도록, 점프 도중에는 회피를 못하도록 조건을 추가

또한 제자리에선 회피를 못하도록함

 

회피 시간에 맞게 애니메이션 속도 조절

 

void OnDodge()
{
    if (!isDodge && moveVec != Vector3.zero && !isJumping)
    {
        //dodgeVec에 움직임 방향 고정
        dodgeVec = moveVec;
        playerSpeed *= 2;
        animator.SetTrigger("doDodge");
        isDodge = true;

        Invoke("DodgeOut", 0.4f);
    }
}

void Move()
{
    //무브 벡터가 0이 아니면 isRun 재생
    animator.SetBool("isRun", moveVec != Vector3.zero);
    animator.SetBool("isWalk", isWalking);
    //만약 회피중이면 방향 고정
    if (isDodge)
        moveVec = dodgeVec;
    if (isWalking)
    {
        transform.position += moveVec * playerSpeed * Time.deltaTime * 0.3f;
    }
    else
    {
        transform.position += moveVec * playerSpeed * Time.deltaTime;
    }
}

 

회피 중에는 방향 전환을 못하도록

회피할때 dodgeVec에 현재 방향 벡터를 저장해서 회피를 시도할때만 방향 고정시킴

 

회피 시 방향 고정