말감로그

[Unity] Valley - 과일 나무(과일 , 나무조각 드랍) , 아이템 박스 인식 & 애니메이션 본문

TIL

[Unity] Valley - 과일 나무(과일 , 나무조각 드랍) , 아이템 박스 인식 & 애니메이션

habbn 2024. 10. 28. 21:07
728x90

과일 나무 드랍

과일 나무를 도끼로 한 번 치면 과일이 떨어지도록 했다.

과일이 스폰될 위치(FruitSpawn) 와 떨어질 위치(FallPos)를 만들었다.

 

각 0.5f의 거리를 유지하도록 총 3개의 fruit 프리팹을 생성하고, 코루틴을 사용하고 Lerp를 통해 떨어질 위치까지 부드럽게 이동시키게 했다.

    void DropFruit()
    {
        isFruitDrop = true;

        for (int i = 0; i < 3; i++)
        {
            Vector3 spawnPosition = fruitSpawnPos.position + new Vector3(i * fruitOffset - fruitOffset, 0, 0);
            GameObject fruit = Instantiate(fruitPrefab, spawnPosition, Quaternion.identity);
            StartCoroutine(MoveFruitToPosition(fruit, fallPos.position + new Vector3(i * fruitOffset - fruitOffset, 0, 0), 1f));
        }
    }

    IEnumerator MoveFruitToPosition(GameObject fruit, Vector2 targetPosition, float duration)
    {
        Vector3 startPosition = fruit.transform.position;
        float elapsedTime = 0f;

        Item interactable = fruit.GetComponent<Item>();
        if (interactable != null)
            interactable.canInteract = false;

        while (elapsedTime < duration)
        {
            fruit.transform.position = Vector2.Lerp(startPosition, targetPosition, elapsedTime / duration);
            elapsedTime += Time.deltaTime;
            yield return null;
        }

        fruit.transform.position = targetPosition;
        interactable.canInteract = true;
    }

 

과일 생성

 

이후 나무를 치면 나무도 쓰러지면서 나무조각 생성

 

 

 

레이캐스트를 사용해서 ItemBox를 인식하면 문이 열리고 벗어나면 닫히는 기능을 구현하였다.

레이캐스트 구간을 벗어났을 경우 자동으로 닫히는 기능을 구현하고 싶어 마지막으로 열었던 상자를 저장해서, 마지막으로 열었던 상자가 있다면 닫도록 하였다.

private ItemBox lastOpenedItemBox;
private bool isBoxOpen = false;

void Interactable()
{
    RaycastHit2D rayHit = Physics2D.Raycast(rb.position, lastMoveDirection, 1f, LayerMask.GetMask("Chest"));

    if (rayHit.collider != null)
    {
        ItemBox itemBox = rayHit.collider.GetComponent<ItemBox>();

        if (Input.GetMouseButtonDown(0) && !isBoxOpen)
        {
            Debug.Log("아이템 박스 오픈");
            isBoxOpen = true;
            itemBox.anim.SetBool("isOpen", true);
            lastOpenedItemBox = itemBox; // 마지막으로 열린 상자 저장
        }
    }
    else if (isBoxOpen)
    {
        Debug.Log("아이템 박스 클로즈");
        isBoxOpen = false;

        // 마지막으로 열었던 상자가 있다면 닫기
        if (lastOpenedItemBox != null)
        {
            lastOpenedItemBox.anim.SetBool("isOpen", false);
            lastOpenedItemBox = null;
        }
    }
}

 

728x90