Unity/기록

Item System 구현

우대비 2024. 6. 8. 22:13
반응형

 

 

몬스터가 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

 

 

반응형
LIST

'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