인프런 강의 - 케이디 생존게임

케이디 강의10 - (근접 무기 구현)

WMG1 2022. 11. 13. 19:54
반응형

이번 시간에는 지난번 무기 스왑에 이어서 다른 근접무기 추가를 배웠다.

public abstract class CloseWeaponController : MonoBehaviour
    //미완성 클래스(추상 클래스)
    //미완성 함수가 포함되므로 자식클래스에서 완성시켜야 함
{


    //##현재 장착된 Hand형 타입 무기##

    [SerializeField]
    protected CloseWeapon currentCleseWeapon;


    protected bool isAttack = false; //공격 중인지 체크
    protected bool isSwing = false; //팔 휘두르고 있는지 체크

    protected RaycastHit hitInfo; //레이에 닿았을 때 정보를 얻어올 수있는 변수



    //##공격##
    protected  void TryAttack() //버튼 입력
    {
        if (Input.GetButton("Fire1")) //마우스 좌클릭
        {
            if (!isAttack) //딜레이 때문에 isAttack이 거짓일때만 가능하도록
            {
                //코루틴 실행(중복실행 방지)
                StartCoroutine(AttackCoroutine());
            }
        }
    }

    protected IEnumerator AttackCoroutine() // 애니매이션실행 && 공격 코루틴-> 공격이 이루어지는 과정 && 중복실행 방지
    {
        isAttack = true;
        currentCleseWeapon.anim.SetTrigger("Attack"); // Attack 트리거 실행(애니매이션 실행)

        yield return new WaitForSeconds(currentCleseWeapon.attackDelayA); // attackDelayA(공격 활성화 시점까지 대기)
        isSwing = true; // 팔 휘두르기 참



        StartCoroutine(HitCoroutine()); // 적중여부 판단 코루틴


        yield return new WaitForSeconds(currentCleseWeapon.attackDelayB); //attackDelayB 공격 비활성화 시점
        isSwing = false; // 팔 휘두르기 거짓(팔 접음)


        yield return new WaitForSeconds(currentCleseWeapon.attackDelay - currentCleseWeapon.attackDelayA - currentCleseWeapon.attackDelayB); // attackDelay만큼만 대기 
        isAttack = false;
    }

    // ##공격 적중 체크##
    protected abstract IEnumerator HitCoroutine(); // 공격 적중 확인 코루틴
    //  => 미완성(추상)코루틴 == 자식클래스에서 완성시켜 써라

    protected bool CheckObject() // 적중 확인 레이캐스트 발사
    {
        if (Physics.Raycast(transform.position, transform.forward, out hitInfo, currentCleseWeapon.range)) //발사정보- 현재 위치값, 방향은 정면, 받아올 정보, 범위(레이 길이)
        {
            return true; // 충돌함
        }

        return false; // 아무것도 없음
    }

    //완성 함수 이지만, 추가 편집이 가능한 함수((자식 클래스에서 호출 후 수정가능함수))
    public virtual void CloseWeaponChange(CloseWeapon _cleseWeapon) // GunController의 GunChange와 동일함
    {
        if (WeaponManager.currentWeapon != null) // 현재 뭔가를 들고있는 경우
            WeaponManager.currentWeapon.gameObject.SetActive(false); //기존에 들고있는것 비활성화

        currentCleseWeapon = _cleseWeapon; // 바꿀 총을 현재총으로 넣어줌
        WeaponManager.currentWeapon = currentCleseWeapon.GetComponent<Transform>(); // 현재 무기를 현재손 으로 변경
        WeaponManager.currentWeaponAnim = currentCleseWeapon.anim; //현재무기 애니메이션을 현재 손 애니메이션으로 변경

        currentCleseWeapon.transform.localPosition = Vector3.zero; //상대적 벡터 포지션을 000으로 초기화
        currentCleseWeapon.gameObject.SetActive(true); //인스팩터 활성화 상태
        
    }


}

상속의 부모 스크립트

public class PickaxeController : CloseWeaponController
{

    public static bool isActivate = true; // 활성화 상태 체크

    private void Start()
    {
        //무기 교체용 요소 요청
        WeaponManager.currentWeapon = currentCleseWeapon.GetComponent<Transform>();
        WeaponManager.currentWeaponAnim = currentCleseWeapon.anim;
    }
    void Update()
    {
        if (isActivate) //활성화 체크
            TryAttack();
    }


    protected override IEnumerator HitCoroutine() //미완성 함수 재정의(공격 적중 확인코루틴)
    {
        while (isSwing) //isSwing이 트루인 상태에선 계속 반복
        {
            if (CheckObject()) //함수 호출
            {
                isSwing = false; // 데미지가 한번만 적용되도록 1회 적중 시 바로 거짓으로 변경
                Debug.Log(hitInfo.transform.name);
            }
            yield return null;
        }
    }

    public override void CloseWeaponChange(CloseWeapon _cleseWeapon)
    {
        base.CloseWeaponChange(_cleseWeapon);
        isActivate = true;
    }
}

상속의 자식 스크립트

 

 

 

 

상속을 이용한 스크립트 공통분모 관리와

여러 상속의 기능들을 알아보았다.

 

또한 애니메이터 오버라이드를 통해 유사한 구조의 애니메이터를 이용하는 법도 알게 되었다.

 

상속과 그와 관련된 기능들.txt
0.00MB
애니메이터 상속.txt
0.00MB

반응형