[내배캠] 최종 프로젝트 #12. 몬스터 드랍 아이템

Sungchan Ahn(안성찬)·2024년 12월 19일

내일배움캠프

목록 보기
85/104

몬스터 처치 시 아이템 드랍

  1. 몬스터가 죽으면 죽는 애니메이션이 끝났을 때 몬스터가 드랍할 수 있는 아이템 리스트에서 가중치 랜덤 알고리즘을 이용하여 하나를 뽑아 해당 아이템을 생성한다.
  2. 아이템은 플레이어와 일정 거리 이상 가까워지거나 던전의 한 룸이 클리어되었을 때 플레이어에게 날아간다.
  3. 플레이어와 닿으면 아이템 정보를 아이템 매니저에 넘겨주어 인벤토리에 넣어준다.

2번에서 룸이 클리어 되었을 때 이벤트로 알려주어 이벤트에 등록된 OnRoomClear 메서드가 실행된다.

public class DropItemObject : MonoBehaviour
{
    private ItemData data;
    [SerializeField] private GameObject Target;
    [SerializeField] private Rigidbody _rigidbody;
    [SerializeField] private float moveSpeed;
    [SerializeField] private bool isDropComplete = false;
    [SerializeField] private bool isRoomClear = false;

    private void OnEnable()
    {
        Target = PlayerManager.Instance.player.gameObject;
        _rigidbody = GetComponent<Rigidbody>();
        DungeonManager.Instance.OnRoomClear += OnRoomClear;
    }
    private void OnDisable()
    {
        DungeonManager.Instance.OnRoomClear -= OnRoomClear;
    }

    private void Start()
    {
        // 생성 후 랜덤한 위쪽 방향으로 짧게 쏳아올리고 바닥에 완전히 떨어질 때까지 기다림
        _rigidbody.AddForce((Vector3.up * 2f + Random.onUnitSphere) * 2f, ForceMode.Impulse);
        StartCoroutine(CheckDropComplete());
    }

    private void FixedUpdate()
    {
        // 픽업 거리 안에 있거나 룸이 클리어되었을 때 플레이어에게 날아옴
        if (isDropComplete && IsInPickUpRange() || isRoomClear)
        {
            _rigidbody.velocity = GetTargetDirection() * moveSpeed;
        }
    }

    public void SetItemData(ItemData itemData)
    {
        data = itemData;
    }

    private void OnRoomClear()
    {
        isRoomClear = true;
    }
	
    // 플레이어와 부딪히면 ItemManager에 item data를 넘겨줌
    private void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.CompareTag("Player"))
        {
            // ItemManager에서 아이템 인스턴스 생성 후 인벤토리에 넣어줌
            ItemManager.Instance.AddItem(data.ID);
            Destroy(gameObject);
        }
    }
}
profile
게임 개발 기록

0개의 댓글