새소식

🎮 Game Dev (게임개발)/PC (데스크탑, 노트북, 터치패널)

[3D 액션게임] 07-1. 원거리 무기 재장전시 모션캔슬

  • -

🔔 유튜브 크리에이터 골든메탈님의 유니티강의 3D 쿼터뷰 액션게임 [BE5] 를 보고 저의 추가적인 기능을 작성한 게시글입니다! 🔔

 

강의를 듣다, 2가지의 저만의 스타일로 원거리무기의 재장전을 하면 어떨까 해서 간단히 고치는 작업을 이어 작성해보겠습니다.

 

1. 재장전시 현재 총안에 들어있는 총알은 버리지 않기

2. 재장전시 재장전을 애니메이션 끝까지 보지않으면 재장전이 되지 않도록(재장전 키 연타해도 한 번만 될 수 있도록).

재장전 모션시 회피기능이나, 점프기능을 사용 시 재장전이 되지않고 탈출하도록.

 

🧷 1. 총 속에 있는 총알은 재장전 시 제외하기

    void Reload()
    {
        if (ammo == 0 || equipWeapon.curAmmo == equipWeapon.maxAmmo)
            return;
    }

    void ReloadOut()
    {
        int reAmmo = equipWeapon.maxAmmo - equipWeapon.curAmmo;
        reAmmo = ammo < reAmmo ? ammo : reAmmo;

        equipWeapon.curAmmo += reAmmo;
        ammo -= reAmmo;
        isReload = false;
    }
  • 현재 총속에 있는 총알 수 가 0이 아니면, 재장전시 제외하고 하도록 코드를 짜주었습니다.
  • 그리고 재장전시, 총알이 꽉차있으면 총알을 버리는게 아닌 이상 재장전을 할 필요가 없어서 재장전을 못하게 해줬습니다.

 

🧷 2. 재장전 모션캔슬

-  애니메이션 이벤트

  • Reload 애니메이션의 어느 지점을 지날 때, adaptReloadOut이라는 함수가 실행 되도록 하였습니다.

 

  • Player 속 Mesh Object에 "AdaptParent" 라는 스크립트를 새로 만들어 넣어줍니다.

 

public class AdaptParent : MonoBehaviour
{
    Player target;

    private void Awake()
    {
        target = transform.GetComponentInParent<Player>();
    }
    void adaptReloadOut()
    {
        target.ReloadOut();
    
    }
}
  • 새로운 AdaptParent의 스크립트속 Player 스크립트를 접근하고, 그 안의 ReloadOut() 함수에 접근하게 adaptReloadOut이란 함수를 새로 만듭시다.

 

 

public class Player : MonoBehaviour
{
    
    void Move()
    {

        // 스왑 및 공격 시 못움직이게
        if (isSwap || !isFireReady) // isReload 제거
            moveVec = Vector3.zero;
    }

    void Reload()
    {
    	// Invoke("ReloadOut", 2f); -> 애니메이션 기능에 ReloadOut() 기능 구현했습니다.
    }

    public void ReloadOut()
    {
        int reAmmo = equipWeapon.maxAmmo - equipWeapon.curAmmo;
        reAmmo = ammo < reAmmo ? ammo : reAmmo;

        equipWeapon.curAmmo += reAmmo;
        ammo -= reAmmo;
        isReload = false;
    }
}
Move() 함수 속 스왑 및 공격 시 못움직이게 하는 함수에 isReload를 추가해서 재장전시 움직이지 못하게 하였는데, 이번에는 그 조건을 빼서 재장전에도 움직일 수 있게 만들어 주었습니다.

 

Reload() 함수에 기존에 사용하던 Invoke 방식은 애니메이션 이벤트로 바꾸었기에 제외하였습니다.

 

public void ReloadOut()은 public으로 만들어 접근 할 수 있게 만들어줍시다.

하지만 위 방법이 public 함수를 넣는다는건 좋은 생각인 것 같진 않아서, 나중에 다르게 이 기능을 구현할 수 있으면 차차 수정해가도록 하려고 합니다.

 

 

 

 

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.