개발 TIL

5/29 부트캠프 개발 TIL (아이템 효과)

HJTL 2024. 5. 29. 20:04

오늘은 아이템에서 구현한 것을 정리하고자 한다.

 

어제 과제에 이어서 이번에는 아이템을 얻었을 때 사용하게 구현하고자 한다.

그림에서 빨간건 체력을 회복하고 파란건 스킬을 회복하는 포션이다.

물론 에셋에 가져온거라 한번 분위기대로 만들려고 하는데 아무튼 이 포션 몹들을 프리팹화 하기 전에 SO(Scriptable Objective)를 작성부터 한다.

 

public enum ItemType	//얻는 아이템 타입 (다른것도 있을테지만 일단 포션만 정의해놨다.)
{
    Potion
}

public enum PotionItem	//포션이면 두가지 종류가 있을 것이다.
{
    Health,
    Skill
}

[CreateAssetMenu(fileName = "ItemData", menuName = "New Item")]
public class ItemData : ScriptableObject
{
	//각 아이템에 필요한 이름, 정보 그리고 종류가 정의되어 있다.
    [Header("Item Info")]
    public string Name;
    public string Description;
    public ItemType Type;

	//아래들은 아이템을 얻으면 얼만큼 회복하는 양이다.
    [Header("Item Prop")]
    public float Recover;

	//말 그대로 포션이 어떤 유형인지
    [Header("Item Potion")]
    public PotionItem PotionType;
}

 

작성 후 두개의 SO파일을 생성하고 다음그림처럼 속성을 설정한다.

체력 스킬 모두 10만큼 회복하게 하였다.

 

그리고 아이템을 획득할수 있게 하는 스크립트를 작성하자

public interface IInteractable
{
    public string GetItemData();
    public void OnInteract();
}

public class ItemObject : MonoBehaviour, IInteractable
{
    public ItemData itemData;

    public string GetItemData()
    {
        return $"{itemData.Name}\n{itemData.Description}";
    }
    public void OnInteract()
    {
        CharacterManager.Instance.Player.itemData = itemData;
        CharacterManager.Instance.Player.status.UseItem(this);
    }
}

아이템 프리팹에서 아까 작성한 SO를 알맞게 넣는다.

public class PlayerGetItem : MonoBehaviour
{
    private void OnCollisionEnter(Collision collision)
    {
        //아이템이랑 충돌하면 자동으로 획득하게
        if (collision.gameObject.TryGetComponent<ItemObject>(out ItemObject item))
        {
            Debug.Log("아이템 획득");
            Destroy(item.gameObject);
            //획득시 사용
            CharacterManager.Instance.Player.status.UseItem(item);
        }
    }
}

플레이어가 아이템을 얻을수 있도록 컴포넌트에 추가

Player에 추가하면 된다.

다음으로 아이템을 얻으면 얻은 효과를 구현하자

public class PlayerStatus : MonoBehaviour
{
    //hp, sp, exp
    public StatusUI status;
    Status hp { get => status.hp; }
    Status sp { get => status.sp; }
    Status exp { get => status.exp; }

    public void UseItem(ItemObject item)
    {
        if(item.itemData.Type == ItemType.Potion)
        {
            UsePotion(item);
        }
    }

    private void UsePotion(ItemObject item)
    {
        switch(item.itemData.PotionType)
        {
            case PotionItem.Health:
                //체력 회복
                hp.Add(item.itemData.Recover);
                break;
            case PotionItem.Skill:
                //스킬 회복
                sp.Add(item.itemData.Recover);
                break;
            case PotionItem.SpeedUp:
                //일정 시간동안 스피드 업
                break;
        }
    }
}

 

 

거의 완성 됐으니 실행해서 확인해보자

반영이 되었는지 확인하기 위하여 체력과 스킬을 일부로 깎아놓았다.