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를 만들었습니다.
반응형
'코자이너 > Unity' 카테고리의 다른 글
Comments