몬스터가 Item을 떨어뜨리고 줍는 기능 구현했습니다.
JustKnight/Assets/Scripts/Objs/ItemManager.cs at main · znlsnel/JustKnight
2D Unity Project. Contribute to znlsnel/JustKnight development by creating an account on GitHub.
github.com
Item을 관리하는 ItemManager Script를 만들었습니다.
public class ItemManager : Singleton<ItemManager>
{
[SerializeField] GameObject _itemObjPrefab;
private ObjectPool<GameObject> _itemObjPool;
public override void Awake()
{
base.Awake();
_itemObjPool = new ObjectPool<GameObject>(
createFunc: () => Instantiate(_itemObjPrefab),
actionOnGet: obj => obj.SetActive(true),
actionOnRelease: obj => obj.SetActive(false),
actionOnDestroy: Destroy,
collectionCheck: false,
defaultCapacity: 10,
maxSize: 20
) ;
}
public GameObject GetItemObj(Vector3 genPos)
{
GameObject result = _itemObjPool.Get();
ItemController io = result.GetComponent<ItemController>();
result.transform.position = genPos;
io.SpawnItem();
return result;
}
public void ReleaseObject(GameObject obj)
{
_itemObjPool.Release(obj);
}
}
ItemManager는 Singleton으로 구현하여 어디서든 접근할 수 있게 하였습니다.
Unity의 ObjectPool 기능을 이용해서 Item Obejct를 관리했습니다.
JustKnight/Assets/Scripts/Objs/ItemObject.cs at main · znlsnel/JustKnight
2D Unity Project. Contribute to znlsnel/JustKnight development by creating an account on GitHub.
github.com
ItemObject를 관리하는 ItemController Class를 만들었습니다.
public void SpawnItem()
{
_rigid.simulated = true;
_itemIdx = UnityEngine.Random.Range(1, 1000);
Vector2 force = new Vector2(UnityEngine.Random.Range(-2.0f, 2.0f), UnityEngine.Random.Range(1.0f, 2.0f));
_rigid.AddForce(force, ForceMode2D.Impulse);
spawnTIme = Time.time;
}
초기화 코드입니다.
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.gameObject.GetComponent<PlayerController>() != null)
return;
float delay = Math.Clamp(1.0f - (Time.time - spawnTime), 0.0f, 1.0f);
StartCoroutine(ReleaseAfterTime(delay));
}
IEnumerator ReleaseAfterTime(float delay)
{
yield return new WaitForSeconds(delay);
_isPicked = true;
}
플레이어랑 충돌하면 습득이 되는데
생성되자마자 바로 습득하면 item이 보이지도 않기 때문에
코루틴을 이용했습니다.
_isPicked -> 아이템을 주웠다면
private void Update()
{
if (_isPicked)
MoveToPlayer();
}
void MoveToPlayer()
{
Vector3 dir = (GameManager.instance.GetPlayer().transform.position + new Vector3(0.0f, 0.5f, 0.0f)) - gameObject.transform.position;
if (dir.magnitude < 0.1f)
{
_isPicked = false;
UIHandler.instance._inventory.AddItem(_itemIdx);
ReleaseItem();
return;
}
_rigid.simulated = false;
dir = dir.normalized;
gameObject.transform.position += dir * Time.deltaTime * 15.0f;
}
아이템이 플레이어에게 이동하는 함수가 실행됩니다.
이후 플레이어에게 이동이 완료되면 ReleaseItem이 실행되어 ObjectPool로 돌아갑니다.
또한 UIHandler에서 관리하는 inventory에 아이템의 아이디가 추가됩니다.
JustKnight/Assets/Scripts/UI/UIHandler.cs at main · znlsnel/JustKnight
2D Unity Project. Contribute to znlsnel/JustKnight development by creating an account on GitHub.
github.com
JustKnight/Assets/Scripts/UI/InventoryManager.cs at main · znlsnel/JustKnight
2D Unity Project. Contribute to znlsnel/JustKnight development by creating an account on GitHub.
github.com
'Unity > 기록' 카테고리의 다른 글
상호작용 기능 구현 (0) | 2024.06.22 |
---|---|
인벤토리 기능 (0) | 2024.06.13 |
Unity Shader Hp Bar (0) | 2024.05.14 |
유니티 프로젝트 기록 - Monster (0) | 2024.05.13 |
Unity 2D 배경 움직임 (0) | 2024.05.05 |