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

AA(11) - 회피 구현

무직백수취업준비생 2021. 9. 12. 23:24
728x90
반응형
    bool isDodge;
    void Update()
    {
        Dodge();
    }
     void Dodge()
    {
        if (jDown && moveVec != Vector3.zero && !isJump && !isDodge)
        {
            speed *= 2;
            anim.SetTrigger("doDodge");
            isDodge = true;

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

    void DodgeOut()
    {
        speed *= 0.5f;
        isDodge = false;
    }

회피를 위한 스크립트를 추가합니다.

 

회피 중 방향이 전환되는 걸 막기 위해 dodgeVec을 선언하고

 

Move()에 조건을 걸어 회피 중 방향이 고정되게 합니다.

 

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

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

    Vector3 moveVec;
    Vector3 dodgeVec;
    Rigidbody rigid;
    Animator anim;

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


    void Update()
    {
        GetInput();
        Move();
        Turn();
        Jump();
        Dodge();
    }
    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;

        if (isDodge)
            moveVec = dodgeVec;

        transform.position += moveVec * speed * (wDown ? 0.1f : 1f) * Time.deltaTime;
        //wDown이 true이면 이동속도 0.1배속

        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)
        {
            rigid.AddForce(Vector3.up * jumppower, ForceMode.Impulse); //jumppower만큼 위로 힘을 가함
            anim.SetBool("isJump", true);
            anim.SetTrigger("doJump");
            isJump = true;
        }
    }
    void Dodge()
    {
        if (jDown && moveVec != Vector3.zero && !isJump && !isDodge)
        {
            dodgeVec = moveVec;
            speed *= 2; //회피시 속도 2배
            anim.SetTrigger("doDodge");
            isDodge = true;

            Invoke("DodgeOut", 0.5835f); //회피 시작 0.5835초후에 DodgeOut 실행
        }
    }
    void DodgeOut()
    {
        speed *= 0.5f; //회피시 2배로 늘었던 속도를 원래대로
        isDodge = false;
    }
    void OnCollisionEnter(Collision collision)
    {
        if(collision.gameObject.tag == "Floor")
        {
            anim.SetBool("isJump", false);
            isJump = false; //Floor에 접촉시 isJump를 false로 되돌려 점프가 가능한 상태로 변경
        }
    }
}

 

 

회피 시 이동속도를 2배로 올렸으니 애니메이션 재생속도도 2배로 올려줍니다.

 

 

728x90
반응형