말감로그

[Unity] Valley - 나무 자르기(나무 애니메이션, 나무조각 생성) 본문

TIL

[Unity] Valley - 나무 자르기(나무 애니메이션, 나무조각 생성)

habbn 2024. 10. 25. 17:54
728x90

 

플레이어가 도끼를 들고 나무를 3번 치면 나무가 쓰러지면서 나무조각이 생성되게 할 것이다.

나무 인식을 땅을 파는 작업을 했던 것처럼 타일맵으로 인식할까, GameObject로 나무를 생성해서 인식할까 하다가

아무래도 애니메이션 작업도 유용한 GameObject로 프리팹을 만들기로 했다.

 

우선 Raycast를 이용해서 Tree GameObject를 인식하게 했다.

 

그리고 쓰러지는 애니메이션을 주기 위해 직접 애니메이션을 만들었다.

Tree의 Rotation값을 통해 쓰러지는 효과를 주었고,

쓰러지면서 Tree의 BoxCollider에 의해 플레이어가 옆으로 밀려나는 현상이 있어서, BoxCollider또한 꺼주었다.

 

 

본격적으로 Player가 나무를 인식하고 도끼를 들고 마우스 클릭 시 hitCount를 증가시켜주고, 플레이어 hit 애니메이션을 실행시켜준다.

    void Hit()
    {
        Debug.DrawRay(rb.position + Vector2.up * 0.5f, lastMoveDirection * 1f, new Color(0, 1, 0));
        RaycastHit2D rayHit = Physics2D.Raycast(rb.position, lastMoveDirection, 1f, LayerMask.GetMask("Tree"));

        if (rayHit.collider != null)
        {
            if (Input.GetMouseButtonDown(0))
            {
                if (inventoryManager.toolbar.selectedSlot.itemName == "Axe")
                {
                    isAxing = true;
                    anim.SetTrigger("isAxing");
                    Tree tree = rayHit.collider.GetComponent<Tree>();
                    tree.hitCount++;
                    StartCoroutine(WaitForAnimation());
                }
            }
        }
    }

 

 

Tree.cs를 만들어서 3번 쳤을 경우, 쓰러지는 애니메이션 효과와 함께 나무조각 2개를 생성하게 했다.

using UnityEngine;

public class Tree : MonoBehaviour
{
    public int hitCount;
    public GameObject WoodPrefab;
    Animator anim;

    void Start()
    {
        anim = GetComponent<Animator>();
        spriteRenderer = GetComponent<SpriteRenderer>();
    }

    void Update()
    {
        if (hitCount == 3)
        {
            Invoke("SpawnWood", 0.3f);
            hitCount = 0;
        }
    }

    void SpawnWood()
    {
        Vector3 spawnPosition = transform.position;
        GameObject wood = Instantiate(WoodPrefab, spawnPosition, Quaternion.identity);
        Rigidbody2D rb = wood.GetComponent<Rigidbody2D>();
        if (rb != null)
        {
            float randomX = Random.Range(-1f, 2f);
            float randomY = Random.Range(1f, -2f);
            rb.AddForce(new Vector2(randomX, randomY), ForceMode2D.Impulse);
        }
        GameObject wood2 = Instantiate(WoodPrefab, spawnPosition, Quaternion.identity);
        Rigidbody2D rb2 = wood2.GetComponent<Rigidbody2D>();
        if (rb2 != null)
        {
            float randomX = Random.Range(-1f, 2f);
            float randomY = Random.Range(1f, -3f);
            rb2.AddForce(new Vector2(randomX, randomY), ForceMode2D.Impulse);
        }
        anim.SetTrigger("isFalling");
        Destroy(gameObject, 1f);
    }
}

나무가 쓰러지면서 나무조각 2개가 생성된 모습을 볼 수 있따.

728x90