퀘스트 시스템 확장

이재형·2025년 8월 6일

MinerFergus 개발 정리

목록 보기
10/10

추가된 퀘스트 시스템

어떤 퀘스트 시스템을 추가하는가?

현재 NPC가 장비를 의뢰하여 제작한 다음 제출하는 퀘스트가 유일한데
NPC한테 장비를 받아 강화하여 제출하는 퀘스트를 추가해
다양한 퀘스트를 플레이어한테 제공하고자 합니다.


퀘스트SO 클래스

[SerializeField]
public enum OrderNPC
{
    All,
    Guild,
    Merchant,
    Wizard
}

[CreateAssetMenu(fileName = "Quest Data", menuName = "Scriptable Object/Quest Data")]
public class QuestSO : ScriptableObject
{
    [Header("Quest Info")]
    public int id;
    [TextArea]
    public string questName;
    [TextArea]
    public string description;
    public ItemSO item;
    public int itemLevel;
    public int amount;

    [Header("Quest Sub")]
    public int day;
    public bool isMain = false;
    public OrderNPC npc;

    [Header("QuestType")]
    public bool is_Get;      // 아이템 수령 여부
    public ItemSO getItem;   // 수령할 아이템
    public int getItemLevel; // 수령할 아이템 레벨
    public int getAmount;    // 수령할 아이템 개수

    [Header("Reward")]
    public int gold;
    public int exp;
}

QuestType에 수령 여부에 따른 필드를 생성하여 수령 아이템의 정보를 에디터에서 입력한다.

에디터에서 퀘스트의 프로퍼티

수령 아이템의 레벨은 제출할 아이템의 레벨보다 낮아야 조건이 충족되므로 퀘스트를 생성할 때 주의해야한다.


코드를 작성하여 퀘스트를 수주 시

주의해야할 예외 사항

인벤토리에 아이템을 획득 할 수 없을 때
퀘스트를 수주 하지 못하도록 예외처리를 진행해야합니다.

[이후 추가 구현 필요]

장비를 받으므로 퀘스트를 클리어 하지 못한 경우 패널티를 부여가 필요합니다.

퀘스트를 수주했을 때 인벤토리 여부를 확인 후 아이템 획득

public void AddQuest()
{
	// Bool형식 메서드로 변환하여 True,False를 반환하여 조건 확인
    if (QuestManager.Instance.AddQuest(questList[selectNum]))
    {
        orders[selectNum].detailButton.interactable = false;
        orders[selectNum].questNameText.text = "퀘스트가 없습니다.";
    }
}
퀘스트를 추가하는 메서드에서 반환 조건을 추가하고 충족 시 퀘스트를 받지 못하도록 변경

퀘스트의 수령 여부를 확인하고 아이템 획득이 가능한지 확인 후 반환한다.

public bool AddQuest(QuestSO quest)
{
	// 퀘스트의 수령 여부 확인
    if (quest.is_Get)
    {
    	// 아이템을 획득 가능한 상태인지 확인
        if (InventoryManager.Instance.inventory.CanAcquireItem(quest.getItem))
        {
        	// 조건이 충족되면 수령아이템을 획득한다.
            InventoryManager.Instance.inventory.AcquireItem(quest.getItem, quest.getItemLevel);
        }
        else
        {
        	// 조건이 충족되지 않다면 이유를 UI에 출력하고 False로 반환
            GameManager.UI.GetT<UI_Check>(UiName.UICheck).CheckView("인벤토리가 가득 찼습니다.");
            return false;
        } 
    }
    // 수령 여부가 충족되었거나 수령 여부가 없을 경우 퀘스트를 추가하고
    // 퀘스트 UI에 추가된 퀘스트슬롯을 생성하고 True를 반환
    questList.Add(new Quest(quest));
    GameManager.UI.GetT<UI_QuestView>(UiName.UIQuestView).InstantiateQuest(questList[questList.Count-1]);
    return true;
}
Void에서 Bool로 변환을 했지만 반환값이 있는 것 뿐이지 다른 메서드에서의 추가 구현을 할 필요가 없음

인게임 테스트 사진

인벤토리가 비어있을 때

인벤토리가 꽉 차 있을 때

profile
한국사람

0개의 댓글