Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

인텔리킴의 Unity Studying & Game Analysis

40. 3D 쿼터뷰 게임 제작 - 드랍 무기 입수 본문

게임 개발 일지/유니티 엔진 공부

40. 3D 쿼터뷰 게임 제작 - 드랍 무기 입수

인텔리킴 2024. 6. 24. 16:31

오브젝트 감지

void OnTriggerEnter(Collider other)
{
    if (other.tag == "Weapon")
        nearObject = other.gameObject;

    Debug.Log(nearObject.gameObject.name);
}

 

간단한 트리거 함수 작성

코드 적용 예제

 

상호작용 키 따로 작성

키 설정'

void OnTriggerEnter(Collider other)
{
    if (other.tag == "Weapon")
        nearObject = other.gameObject;

    Debug.Log(nearObject.gameObject.name);
}

트리거 함수를 통해 근처에 'Weapon'이라는 태그를 가진 오브젝트가 있다면

그 오브젝트를 변수에 저장함

void OnInteract()
{
    if(nearObject != null && !isJumping && !isDodge)
    {
        if(nearObject.tag == "Weapon")
        {
            Item item = nearObject.GetComponent<Item>();
            int weaponIndex = item.value;
            hasWeapons[weaponIndex] = true;

            Destroy(nearObject);
        }
    }
}

 

특정 조건을 만족할때 근처 오브젝트의 태그가 'Weapon'이면

아이템을 hasWeapons 배열의 인자로 저장하고 아이템 제거

 

아이템 먹고 플래그 활성화됨

플레이어에게 무기 장착

플레이어에게 무기를 건네줄 위치

플레이어에게 무기를 건내줄 위치 정함

위치 조정

실린더를 배치해 플레이어에게 무기를 배치할 위치 지정

 

무기 배치

오른손에 무기 배치해놓음

 

무기 할당

배치한 무기 할당

 

Input Manager

인풋 매니저에서 버튼 할당

 

void OnSwap1()
{
    Swap(0);
}
void OnSwap2()
{
    Swap(1);
}
void OnSwap3()
{
    Swap(2);
}

void Swap(int i)
{
    if(!isDodge && !isJumping && hasWeapons[i] == true)
    {
        weapons[i].SetActive(true);
    }
}

각 버튼함수가 int 불러오도록하고

Swap함수에서 아이템을 획득했을 경우 true로 함

 

활성화

무기 획득하면 활성화됨

하지만 여러 무기 휙득하면 무기가 중복으로 착용된다는 문제가 있음

무기 중복 착용

 

void Swap(int i)
{
    if(!isDodge && !isJumping && hasWeapons[i] == true)
    {
        //빈손이 아니라면 먼저 처음 가지고 있는 무기 비활성화
        if(equipWeapon != null)
            equipWeapon.SetActive(false);
        equipWeapon = weapons[i];
        weapons[i].SetActive(true);
    }
}

먼저 손에 들고 있는 무기를 비활성화해서 해결

빈손일 경우에는 null 에러가 날 수 있기 때문에 null 체크를 먼저 해줌

무기 변경됨

 

변경 애니메이션

무기 변경 애니메이션 추가

 

animator.SetTrigger("doSwap");

 

코드를 추가해 액션 추가

Swap 애니메이션 재생

 

void Swap(int i)
{
    if(!isDodge && !isJumping && hasWeapons[i] == true)
    {
        //빈손이 아니라면 먼저 처음 가지고 있는 무기 비활성화
        if(equipWeapon != null)
            equipWeapon.SetActive(false);
        equipWeapon = weapons[i];
        weapons[i].SetActive(true);

        isSwap = true;
        animator.SetTrigger("doSwap");
        Invoke("SwapOut", 0.8f);
    }
}

void SwapOut()
{
    isSwap = false;
}

마지막으로 플래그를 이용해 무기 교체 중엔 다른 행동 못하도록 함

 

int equipWeaponIndex = -1;
void Swap(int i)
{
    if (equipWeaponIndex == i)
        return;
    if(!isDodge && !isJumping && hasWeapons[i] == true)
    {
        //빈손이 아니라면 먼저 처음 가지고 있는 무기 비활성화
        if(equipWeapon != null)
            equipWeapon.SetActive(false);
        equipWeaponIndex = i; 
        equipWeapon = weapons[i];
        weapons[i].SetActive(true);

        isSwap = true;
        animator.SetTrigger("doSwap");
        Invoke("SwapOut", 0.5f);
    }
}

 

장착된 무기를 다시 중복해서 불러오는것도 막음