Today I Learn/25.06

📅06/14 | TIL 아이템 상호작용

오늘도즐겨 2025. 6. 14. 21:19

🎯 목표

  • Scriptable Object 활용
  • 상호작용 로직 다시 공부
  • Action 활용

💡 아이템 프리팹 생성 및 Scriptable Object 활용

[CreateAssetMenu(fileName = "Item", menuName = "New Item")]
public class ItemData : ScriptableObject
{
    [Header("Info")] 
    public string displayName;
    public string description;
    public ItemType type;
    public Sprite icon;
    public GameObject dropPrefab;

    [Header("Stacking")]
    public bool canStack;
    public int maxStackAmount;
    
    [Header("Consumable")]
    public ItemDataConsumable[] Consumables;
}

💡 상호작용 로직 구현

Interaction 클래스

주요기능 : 프롬프트 텍스트 오브젝트 및 String값 메서드 활용

update에서 계속적으로 RaycastHit 체크

private void Update()
{
    if (Time.time - lastCheckTime > checkRate)
    {
        lastCheckTime = Time.time;
        
        Ray ray = camera.ScreenPointToRay(new Vector3(Screen.width/2, Screen.height/2));
        RaycastHit hit;

        if (Physics.Raycast(ray, out hit, maxcheckDistance, layerMask))
        {
            if (hit.collider.gameObject != CurInteractGameObject)
            {
                CurInteractGameObject = hit.collider.gameObject;
                curInteractable = hit.collider.GetComponent<IInteractable>();
                SetPromptText();
            }
        }
        else
        {
            CurInteractGameObject = null;
            curInteractable = null;
            promptText.gameObject.SetActive(false);
        }
    }
}

 


💡 Player에 Action addItem 추가

ItemObject 클래스

상호작용시 해당 데이터 넣어주기

public ItemData itemData;

public class ItemObject : MonoBehaviour, IInteractable
{
    //TODO : 상호작용시 필요한 데이터 넣어주기
    public ItemData data;
    
    public string GetInteractPrompt()
    {
        string str = $"{data.displayName}\n{data.description}";
        return str;
    }

    public void OnInteract()
    {
        CharacterManager.Instance.Player.itemData = data;
        CharacterManager.Instance.Player.addItem?.Invoke();
        Destroy(gameObject);
    }
}

 

OnInteract() 시  addItem.?Invoke();