유니티/AA(3D 쿼터뷰 액션 게임)

AA(3) - 플레이어 점프

무직백수취업준비생 2021. 8. 30. 21:44
728x90
반응형
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player : MonoBehaviour
{
    public float speed;
    float hAxis;
    float vAxis;
    bool wDown;
    bool jDown;

    Vector3 moveVec;
    Rigidbody rigid;
    Animator anim;
  
    void Awake()
    {
        rigid = GetComponent<Rigidbody>();
        anim = GetComponentInChildren<Animator>();
    }

 
    void Update()
    {
        GetInput();
        Move();
        Turn();
        Jump();
    }
    
    void GetInput()
    {
        hAxis = Input.GetAxisRaw("Horizontal");
        vAxis = Input.GetAxisRaw("Vertical");
        wDown = Input.GetButton("Walk");
        jDown = Input.GetButtonDown("Jump");
    }

    void Move()
    {
        moveVec = new Vector3(hAxis, 0, vAxis).normalized;

        transform.position += moveVec * speed * (wDown ? 0.3f : 1f) * Time.deltaTime;


        anim.SetBool("isRun", moveVec != Vector3.zero);
        anim.SetBool("isWalk", wDown);
    }

    void Turn()
    {
        transform.LookAt(transform.position + moveVec);
    }

    void Jump()
    {
        if(jDown)
        {
            rigid.AddForce(Vector3.up * 15, ForceMode.Impulse);
        }
    }
}

 

점프에 대한 선언과 초기화를 하고, 스크립트를 작성해줍니다.

 

스페이스바를 눌러보면 캐릭터가 점프합니다.

 

중력이 약하게 설정되어있어 점프가 어색하고, 애니메이션이 설정되어 있지 않습니다.

 

점프 횟수에 대한 제약이 없어 점프 상태에서 다시 위로 힘을 받고 점프가 가능한 상태입니다.

 

점프 횟수에 제약을 주는 방법은 지난 Uni-Run에서도 했었습니다.

 

Floor 태그를 추가한 다음 Floor 오브젝트에 태그를 Floor로 설정해줍니다.

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player : MonoBehaviour
{
    public float speed;
    float hAxis;
    float vAxis;
    bool wDown;
    bool jDown;
    bool isJump;

    Vector3 moveVec;
    Rigidbody rigid;
    Animator anim;
  
    void Awake()
    {
        rigid = GetComponent<Rigidbody>();
        anim = GetComponentInChildren<Animator>();
    }

 
    void Update()
    {
        GetInput();
        Move();
        Turn();
        Jump();
    }
    
    void GetInput()
    {
        hAxis = Input.GetAxisRaw("Horizontal");
        vAxis = Input.GetAxisRaw("Vertical");
        wDown = Input.GetButton("Walk");
        jDown = Input.GetButtonDown("Jump");
    }

    void Move()
    {
        moveVec = new Vector3(hAxis, 0, vAxis).normalized;

        transform.position += moveVec * speed * (wDown ? 0.3f : 1f) * Time.deltaTime;


        anim.SetBool("isRun", moveVec != Vector3.zero);
        anim.SetBool("isWalk", wDown);
    }

    void Turn()
    {
        transform.LookAt(transform.position + moveVec);
    }

    void Jump()
    {
        if (jDown && !isJump)
        {
            rigid.AddForce(Vector3.up * 15, ForceMode.Impulse);
            isJump = true;
        }
    }
    void OnCollisionEnter(Collision collision)
    {
        if(collision.gameObject.tag == "Floor")
        {
            isJump = false;
        }
    }
}

isJump가 false일때만 점프를 할 수 있게 만들고

 

Floor태그에 접촉시 isJump가 false로 바뀌게 스크립트를 수정합니다.

 

이제 점프를 여러번 눌러도 Floor에 접촉하기 전에는 다시 점프할 수 없습니다.

 

점프에 애니메이션을 넣어주겠습니다.

 

 

점프는 어느상황에서든 사용해서 착지를 거쳐 종료하게 됩니다.

 

Any State에서 Jump->Land를 거쳐 Exit로 가게 연결합니다.

 

 

파타메터들을 추가해주고 트랜지션 컨디션에 등록해줍니다. 

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player : MonoBehaviour
{
    public float speed;
    float hAxis;
    float vAxis;
    bool wDown;
    bool jDown;
    bool isJump;

    Vector3 moveVec;
    Rigidbody rigid;
    Animator anim;
  
    void Awake()
    {
        rigid = GetComponent<Rigidbody>();
        anim = GetComponentInChildren<Animator>();
    }

 
    void Update()
    {
        GetInput();
        Move();
        Turn();
        Jump();
    }
    
    void GetInput()
    {
        hAxis = Input.GetAxisRaw("Horizontal");
        vAxis = Input.GetAxisRaw("Vertical");
        wDown = Input.GetButton("Walk");
        jDown = Input.GetButtonDown("Jump");
    }

    void Move()
    {
        moveVec = new Vector3(hAxis, 0, vAxis).normalized;

        transform.position += moveVec * speed * (wDown ? 0.3f : 1f) * Time.deltaTime;


        anim.SetBool("isRun", moveVec != Vector3.zero);
        anim.SetBool("isWalk", wDown);
    }

    void Turn()
    {
        transform.LookAt(transform.position + moveVec);
    }

    void Jump()
    {
        if (jDown && !isJump)
        {
            rigid.AddForce(Vector3.up * 15, ForceMode.Impulse);
            anim.SetBool("isJump", true);
            anim.SetTrigger("doJump");
            isJump = true;
        }
    }
    void OnCollisionEnter(Collision collision)
    {
        if(collision.gameObject.tag == "Floor")
        {
            anim.SetBool("isJump", false);
            isJump = false;
        }
    }
}

점프 애니메이션도 컨트롤하도록 스크립트에 추가해줍니다.

 

점프 애니메이션까지 잘 구동됩니다.

 

자연스러운 점프를 위해 중력값을 높여줍니다.

 

중력을 강하게 한만큼 점프 높이가 낮아졌습니다.

 

지금은 위 방향으로 15만큼의 힘을 주는 것으로 스크립트가 작성돼있으나,

 

나중에 힘 값을 public float로 선언해주도록 하겠습니다.

 

벽과 바닥의 부모, WorldSpace를 자식들을 포함해 Static을 적용해줍니다.

 

캐릭터와 충돌을 잘 감지해주게 해주기 위함입니다.

 

벽과 바닥에 리지드바디 컴포넌트도 추가해줍니다.

 

 

캐릭터와 벽 사이에 마찰을 없애기 위해 Physics Material을 만들어줍니다.

 

벽들의 박스콜라이더 메터리얼에 넣어줍니다.

 

 

728x90
반응형

'유니티 > AA(3D 쿼터뷰 액션 게임)' 카테고리의 다른 글

AA(7) - 캐릭터 변경하기  (0) 2021.09.10
AA(5) - 아이템 만들기  (0) 2021.09.08
AA(4) - 플레이어 회피  (0) 2021.09.01
AA(2) - 코드 정리  (0) 2021.08.30
AA(1) - 플레이어 이동  (0) 2021.08.29