🎯 목표
- 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();
'Today I Learn > 25.06' 카테고리의 다른 글
📅06/16 | TIL 인벤토리 & 아이템 사용 (0) | 2025.06.16 |
---|---|
📅06/12 | TIL 3D 데미지 처리 및 낮 밤 구현 (0) | 2025.06.12 |