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);
}
}
}