8년차 모션그래픽디자이너의 고군분투

[Unity Engine] 인벤토리 시스템 구현하기 -4- | 아이템 수집해서 인벤토리 창에 넣기 | C#, Inventory System, 아이템 수집하기 본문

코자이너/Unity

[Unity Engine] 인벤토리 시스템 구현하기 -4- | 아이템 수집해서 인벤토리 창에 넣기 | C#, Inventory System, 아이템 수집하기

쓰리디사람3Dperson 2024. 3. 20. 12:51
반응형

 

안녕하세요 이번 글은 아이템이 플레이어를 찾아 플레이어에게 수집되는 스크립트를 보여드리겠습니다.

 

using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEditor.Search;
using UnityEngine;
using UnityEngine.UI;

public class ItemPickup : MonoBehaviour
{
    public ItemData Item;
    public float _itemSpeed = 5f;
    public Transform Player;
    
    private bool _isPickable = false;

    private void Start()
    {
        _isPickable = true;
        Player = GameObject.FindGameObjectWithTag("Player").transform;
        // 아이템이 나오자마자 플레이어 위치 찾음
    }
    private void Update()
    {
        if (_isPickable)
        {
            float distance = Vector3.Distance(transform.position, Player.position);
            // 아이템 거리와 플레이어의 위치 계산
            if (distance <= 3)
            // 3블록 이내라면
            {
                Pickup();
                // 함수 실행
            }
        }
        else
        {
            return;
            // 아니라면 아무것도 안함
        }
    }
    public void Pickup()
    {
        StartCoroutine(Magnet_Coroutine());
        // 자연스럽게 들어가게 코루틴 함수 사용
    }

    IEnumerator Magnet_Coroutine()
    {
        float startTime = Time.time;
        Vector3 startPosition = transform.position;
        while (Vector3.Distance(transform.position, Player.position) > 0.01f) // 거리가 충분히 가까워질 때까지 반복
        {
            float timeSinceStarted = Time.time - startTime;
            float fractionOfJourney = timeSinceStarted * _itemSpeed;

            transform.position = Vector3.Slerp(startPosition, Player.position, fractionOfJourney / Vector3.Distance(startPosition, Player.position));

            yield return null;
        }
        UI_PopUPItem.Instance.ShowItemPopUp(Item.Icon, Item.Name);
        // 아이템 수집 될 때 해당 아이템이 무엇인지? 팝업 UI 생성 
        _isPickable = false;
        // 수집 불가능으로 만들어주고
        // 아이템 추가 및 인벤토리 업데이트
        InventoryManager.Instance.Add(Item);
        InventoryManager.Instance.ListItem();
        gameObject.SetActive(false);
        // 아이템 삭제
    }
}

 

아이템을 먹으면 아이템이 무엇인지 보여주는 스크립트도 작성했습니다.

using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
using static UnityEditor.Progress;

public class UI_PopUPItem : MonoBehaviour
{

    public Image PopUp;
    public Image PopUpImage;
    public TextMeshProUGUI PopUpText;
    
    public static UI_PopUPItem Instance { get; private set; }
    // 인스턴트화

    private void Awake()
    {
        if (Instance == null)
        {
            Instance = this;
            //DontDestroyOnLoad(gameObject);
        }
        else
        {
            Destroy(gameObject);
        }
    }
    private void Start()
    {
        this.gameObject.SetActive(false);
        // 처음 시작 할 때 비활성화
    }

    public void ShowItemPopUp(Sprite icon, string name)
    // 해당 함수는 인스턴트화 해서 아이템픽업에서 불러왔음
    {
        PopUpImage.sprite = icon;
        PopUpText.text = name;
        PopUp.gameObject.SetActive(true);
        StartCoroutine(HidePopUpAfterDelay(2f));
        // 팝업 2초 지속뒤에 삭제
    }

    private IEnumerator HidePopUpAfterDelay(float delay)
    {
        yield return new WaitForSeconds(delay);
        PopUp.gameObject.SetActive(false);
    }
}

이렇게 UI를 만들었습니다.

 

반응형
Comments