B41-드랍무기 입수와 교체

·2021년 3월 6일

//출처는 골드메탈님 강의입니다!

3.5프로젝트에서 오늘 한거까지 참고! 하면서 진행해보자.

오브젝트 감지

플레이어가 무게에 접근했다라는것을 알기 위해서 OnTrigger계열을 사용하자.

  • gameobject vs GameObject 차이
    gameobject : 스크립트 컴포넌트가 포함된 오브젝트 자기 자신
    GameObject : 클래스

  • to do : 무기 접근 후 'e'키 누른 경우 무기 착용시키기
    OntriggerStay를 사용하자.
    OntriggerExit도 사용함. : 해머 접근 후 획득 안한 상태에서 e키를 누르면 장착이 가능해지므로 접근 후 근처 벗어나면 해제하도록 만듬.

이전 시간에 만든 태그를 이요해 어떤 종류인지를 확인

무기 입수

  • 무기 입수 여부를 위한 불변수를 만들고 입력값에 추가함.


  • Interaction 함수를 만들자. : 장비를 장착하는 함수
    //예외처리 : 근처에 무기 있는지 여부 + 다른 액션 안하고 있음
  • 'e'키를 눌렀을 경우
    //how 진행??
    1) 불변수를 이용해 획득했다는 정보를 알아야 한다.
    -> 불변수를 만들자.
    Item 스크립트를 현재 총 오브젝트에다가 넣어주고 value값을 각각 다르게 설정했다.
    해당 총들을 입수했는지에 대한 여부를 체크하기 위해서 불변수가 필요하다.
    해당 무기를 쥐고 있는지에 대한 배열을 선언함.
    public bool[] hasWeapon;
    배열의 갯수를 아이템의 갯수만큼 설정해야 한다.
    안하면 아래 출력처럼 에러 발생한다.


    현재 아이템 2개여서 2로 설정함.

    다 만들고 확인하는 부분 : 그리고 아이템 획득 버튼 'e'를 눌러보자 / 체크되는 것을 확인할 수 있다.

    2) 불변수값의 인덱스 값을 구분 짓기 위해서 index 변수 만듬
    각 무기마다 Item 클래스가 컴포넌트로 들어가있으므로, value값을 확인할 수 있다. 얻어온 밸류값을 불변수의 인덱스 집어넣고 true로 만들자.
    -> value값에 따라서 불변수 순서가 정해진다!
    3) 획득한 아이템은 Destroy 하자.
  • 무기 장착
    장착할 위치에 맞는 본을 정하자.

  • 해당 오브젝트에 실린더를 만들어주고 위치와 스케일을 적당하게 변경함. 콜라이더는 필요 없으니 삭제하자.

  • 메시 렌더러 비활성화까지
  • 씬에 올라간 모든 아이템들을 프리팹에서 weaponPoint 오브젝트 하위에 드래그/위치시키자.

  • 플레이어 스크립트에서 GameObject 배열에 우리가 장착할 무기들을
    드래그 옮기기 Tip

1) 일단 잠금을 건다.

2) 시프트 선택

3) 드래그 해서 옮기기

짠!

무기 교체 구현

  • 입력키 1,2,3~ 번으로 사용할 것이므로 input manager에 추가함.
    : 불변수가 하나씩 필요하다.
    => inputmanager에 키값 추가할때마다 불변수가 하나씩 필요하다는 것을
    알수 있다.

  • swap함수 how 만들까 ?
    //조건 추가 : 액션 모두 중지한 상태 + swap키 누른여부 모두 체크
    오른쪽 손에 비활성화시킨 무기를 활성화해야 하므롤 SetActive함수 사용함.
    1,2,3번 버튼다운에 따른 값을 얻어와서 인덱스 값 설정함.

    • 함수를 작성한 다음에 실행 중에 발생한 문제점.
      : 플레이어의 weapons 변수에다가 플레이어 외부에 있는 연두색 Weapon Hammer와 Weapon Handgun을 집어넣었다.

      무기 장착시 Destroy하는데,, 없는데 왜 활성화하냐는 오류이다.

      오른손에 있는 파란색 오브젝트로 변경하자.
  • 플레이어와 물체 충돌 중에 알게 된 점...
    : 무기와 플레이어 충돌 시 플레이어가 y축으로 회전하는 문제가 발생햇다.
    Freeze Rotation의 y축도 체크하도록 하자.

  • 무기 획득 안하고 지나치는 상황 생길 수 있다. // 무기는 물체가 아닌 상태로 만들고 싶다.
    : 이때는 무기와 플레이어는 충돌 처리 안하고 싶다.
    무기의 리지드바디에서 freeze포지션이랑 회전값 모두 체크하자.
    +코드 추가함.

    => 결과 큐브 만들어 놓고 진행하면 무기는 그냥 지나치고, 큐브는 물리 충돌 처리 진행된다.

내가 추가한 부분 Freeze 시키기

//0309 이거 추가하면서 무기 접촉 후 점프 못하게된다.
//추후에 코루틴? 배우고 하고 싶은거 적용해보자!
//내가 추가함. - 무기는 그냥 지나치게함.
//if(collision.gameObject.tag == "Weapon")
// rigid.constraints = RigidbodyConstraints.Fre

  • 망치 , 권총 획득 후 1,2번 키 누르면 망치와 권총 두개가 렌더링된다.
    : 현재 들고 있는 무기를 저장할 GameObject를 만든다.
 void Swap()
    {
        int index = -1;
        if (sDown1) index = 0;
        if (sDown2) index = 1;

        if((sDown1 || sDown2) && !isDodge && !isJump)
        {
            //빈손일 때를 대비해 예외처리함.
            if (equipWeapon != null)
                equipWeapon.SetActive(false);
            weapons[index].SetActive(true);
            equipWeapon = weapons[index];    
                
        }
    }
  • Swap하는 애니메이션 추가
    : Player 애니메이터에 Swap 애니메이션 추가 및 트리거도 추가하고,
    make transition으로 설정하자.



    애니메이션 동작 진행 및 무기교체 진행 중이다라는 것을 알기 위한 불변수 추가함
    +Invoke 함수 호출함. + 다른 동작의 함수 Jump, Move등에 조건 추가하자.

  • 무기 중복 교체 및 획득 안했는데도 장착이 가능한 상황에 대한 인터락 추가.
    망치를 0으로 했으므로 초기값 -1로 해야한다.

profile
🔥🔥🔥

0개의 댓글