Unity 숙련주차 - Survival 게임 자원 채취

Amberjack·2024년 2월 3일
0

Unity

목록 보기
30/44
post-custom-banner

🌳 자원 채취용 나무를 만들어보자

빈 오브젝트 Resource_Tree를 만든다. 이후 준비된 에셋에서 Tree를 가져와 밑에 넣어준다.
Resource_Tree의 Layer를 Resource로 변경해주자. 마지막으로 Box Collider를 추가하여 사이즈를 맞춰준다.

👨‍💻 Resource.cs 작성

Resource_Tree의 피격 처리를 위한 Resource.cs를 작성하자.
Environments 폴더 밑에 Resource.cs 파일을 생성해준다. 이후 생성된 스크립트를 Resource_Tree에게 준다.

public class Resource : MonoBehaviour
{
    public itemData itemToGive;
    public int quantityPerHit = 1;      // 한번 맞을 때 줄 아이템의 개수
    public int capacity;

    public void Gather(Vector3 hitPoint, Vector3 hitNormal)
    {
        for(int i = 0; i < quantityPerHit; i++)
        {
            if (capacity <= 0) break;

            capacity -= 1;

            // 아이템 드랍. 충돌이 일어난 지점에서 충돌이 난 방향으로 아이템을 드랍한다.
            // hitPoint + Vector3.up : 충돌 발생 지점
            // Quaternion.LookRotation(hitNormal, Vector3.up) : 충돌이 난 방향
            Instantiate(itemToGive.dropPerfab, hitPoint + Vector3.up, Quaternion.LookRotation(hitNormal, Vector3.up));

            if(capacity <= 0) Destroy(gameObject);      // 더 이상 지닌 자원이 없으면 게임 오브젝트 삭제. ex) 나무에서 목재를 다 캐면 나무가 사라지도록
        }
    }
}

이제 Resource_Tree의 Resource 스크립트에서 데이터들을 넣어주자.

👨‍💻 EquipTool.cs 수정

공격 처리를 위해 EquipTool.cs를 수정하자.

public void OnHit()
{
    // 화면 가운데서 Raycast를 쏜다.
    Ray ray = _camera.ScreenPointToRay(new Vector3(Screen.width / 2, Screen.height / 2, 0));
    RaycastHit hit;

    if(Physics.Raycast(ray, out hit, attackDistance))
    {
        // 현재 내 장비가 자원 채취용 장비이면서 공격 받은 대상이 Resource 클래스라면
        // hit.collider.TryGetComponent(out Resource resource) : 부딪힌 collider의 컴포넌트에 Resource 클래스가 있는지 확인, 있으면 resource로 가져오기
        if (doesGatherResources && hit.collider.TryGetComponent(out Resource resource))
        {
            resource.Gather(hit.point, hit.normal);
        }

        // 현재 내 장비가 무기면서 공격 받은 대상이 데미지를 받을 수 있는 객체라면
        if(doesDealDamage && hit.collider.TryGetComponent(out IDamagable damagable))
        {
            damagable.TakePhysicalDamage(damage);
        }
    }
}

마지막으로 도끼와 칼의 프리팹을 수정해주자.

🎥 애니메이션 Event 추가하기

해당 OnHit()을 호출하기 위해 공격 애니메이션에서 공격하는 순간에 맞춰 OnHit()을 호출하도록 만들어보자!
공격이 들어가는 시점에 Add Event를 추가하자.

Add Event를 하면 Inspector 창에서 Animation Event에 대한 Function을 설정할 수 있다.

확인해보기

  1. 칼로는 자원 획득이 안됨
  2. 도끼로 자원 획득이 가능하며 총 5대를 치면 나무가 사라짐
  3. 도끼로 나무를 칠 때마다 목재가 드랍됨
  4. 드랍된 목재를 획득

모두 잘 동작하는 것을 확인할 수 있다!

🌲 나무 프리팹 시키기

이제 Resource_Tree를 프리팹 시키자.

Prefabs 폴더 밑에 Resource 폴더를 만들자.

post-custom-banner

0개의 댓글