본문 바로가기

C

3D 쿼터뷰 액션게임 - 플레이어 점프

 

 

점프 구현을 하고나서

무한 점프가 되지 않도록 해야합니다.

 

지정해주었던 isJump  파라미터가 false 이고 점프키 입력을 받았을때, Vector3.up 으로 Force 를 주는 if문을 만들고 true로 바꿔주면 됩니다.

 

그리고 다시 isJump 를 false로 만들어줘야하니까 새로운 if문을 만들고 OnCollisionEnter 함수를 씁니다.

tag == "Floor" 오브젝트에 Enter 하게 되면 isJump가 false가 되도록 OnCollisionEnter 함수 아래에 if문으로 제작하면 됩니다.

 

저는 OnCollisionStay 와 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;

    public bool isJump;

    Vector3 moveVec;
    Rigidbody rigid;

    Animator anim;

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

    }

    // Update is called once per frame
    void Update()
    {
        GetInput();
        Move();
        Turn();
        Jump();
    }

    void GetInput() {
        //키 입력 인식
        hAxis = Input.GetAxisRaw("Horizontal"); //edit-project settings-input manager-Axes 의 Horizontal
        vAxis = Input.GetAxisRaw("Vertical");
        wDown = Input.GetButton("Walk");
        jDown = Input.GetButtonDown("Jump");
    }

    void Move() {
        //대각선 이동 노멀라이즈
        moveVec = new Vector3(hAxis, 0, vAxis).normalized;


        }

        
        //벡터이동
        //삼항연산자 사용해서 걷기wDown true면 걷기 속도-false면 Run속도
        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 && moveVec == Vector3.zero && !isJump && !isDodge) { //무한점프가 안되도록 !isJump 제약조건 걸기
            rigid.AddForce(Vector3.up * 16, ForceMode.Impulse); //up 방향으로 Addforce
            anim.SetBool("isJump", true);
            anim.SetTrigger("doJump");
            //isJump = true;
        }
    }


    private void OnCollisionStay(Collision collision) { // 캐릭터의 collision 값을 계속 디텍팅.
        if(collision.gameObject.tag == "Floor") {           //collision 이 닿은 오브젝트의 tag가 Floor 이면
            anim.SetBool("isJump",false);
            isJump = false;                                 //점프가 가능하도록 isJump 를 false 로 반환.
        }
    }

    private void OnCollisionExit(Collision collision) { //캐릭터와 닿은 collision과 떨어졌을때
        if (collision.gameObject.tag == "Floor") {           //collision 이 닿았던 오브젝트의 tag가 Floor 이면
            //anim.SetBool("isJump", false);
            isJump = true;                                 //점프가 불가능하도록 isJump 를 true 로 반환.
        }
    }

}

 

 

 

 

 

 

출처 - https://youtu.be/eZ8Dm809j4c?list=PLO-mt5Iu5TeYI4dbYwWP8JqZMC9iuUIW2