XR플밍 - 11. 사전 합반 프로젝트 2일차 (6/20)

이형원·2025년 6월 20일
0

XR플밍

목록 보기
110/215

1. 대략적인 기획안

현재 기획안 시스템이 정확히 나오지는 않았지만 대략적인 틀은 아래와 같이 정해졌다.

  • 장르 : 서바이벌 장르 게임
  • 핵심 컨셉 : 파밍, 생존, 탈출

현재까지 나온 기획안은 이 정도이고, 이후에 진행한 서바이벌 R&D 내용을 듣고서 업무분장을 시작했다.

2. 서바이벌 R&D 가이드

필수 구현 기능 리스트는 크게 다음과 같이 나뉠 수 있으며, 게임의 기획 컨셉에 따라 내용이 상이할 수 있다.

  • 플레이어 생존 시스템 - 체력, 수분, 배고픔 등
    -> 게임에 지속적인 영향을 주는 요소이기 때문에, 싱글톤으로 관리할 수 있는 전략도 사용 가능하다.

사실상 R&D가 필요한 영역은 아니다.

  • 파밍 시스템 - 열쇠, 재료 등

    • 수집하고 활용할 수 있는 시스템

    • 습득에 대해 다형성이 확보되어야 함.

    • 다만 이를 상속 등의 방법으로 구현하기에는 매커니즘을 구현하기 어려우므로, 어댑터 패턴을 사용하는 것을 추천한다.

    • 인터페이스를 구성하고, 어댑터로 연결한 다음 이벤트를 발생시키는 방식

  • 인벤토리 : 스크립터블 오브젝트 - 특강 내용 참고

유의 - MVP, MVC 시스템 사용할 것 - 데이터는 따로 저장하자. UI연동 등에 필요

  • 도구 시스템 - 노가다...
    도구의 종류에 따라 상호작용 가능한 레이어를 설정하는 방식, 혹은 오버랩 방식

  • 제작 시스템
    원재료 조합, 혹은 특정 오브젝트와 상호작용하여 오브젝트 변환
    원재료를 특정 조건에 따라서 결과물로 도출하는 방식

방법 1. 노가다 하드코딩... 백트래킹
인벤토리를 순회하면서 해당 아이템이 있으면 해당 아이템 사용 후 아이템 도출
효율성은 좋지 않다.

방법 2. - 해싱
각각의 아이템마다 ID를 부여(4자리)
이를 dictionary를 통해 찾아서 해당 아이템이 있을 시

3. 업무분장 및 금일 공부 내용

아직까지 확실한 기획안이 나오진 않았지만, 핵심 기능 위주로 우선 업무분장을 시작했다.

내가 메인으로 담당하게 된 업무는 인벤토리 관련 기능이 되었다.

사실 업무를 받으면서도 자신이 없었지만, 안 해 본 업무를 해 보고 싶었기 때문에 분장 자체에는 불만이 없었다.

특히나 인벤토리 구현과 같은 경우는, 이전의 특강 공부한 내용이 정리되어 있지 않았기 때문에 이번 주말을 기회로 정리를 해야 할 것 같다.

생각보다 내용이 쉽지 않기도 하고, 특강 자체가 이전 코드를 이어서 쓰는 바람에 다시 구현해보니까 터져서... 주말에 처음부터 다시 몰아서 공부해야 할 것으로 보인다.

우선은 현재까지 정리한 예시 코드는 아래와 같이 구성했다.

  • Inventory
public class Inventory : MonoBehaviour
{
    public Item[] items;
    
    public event Action<int> OnItemChanged;

    public bool AddItem(Item item)
    {
        int lastIndex = -1;
        for (int i = 0; i < items.Length; i++)
        {
            if (items[i] == null)
            {
                lastIndex = i;
                break;
            }
        }

        if (lastIndex == -1)
        {
            Debug.Log("인벤토리가 가득찼습니다.");
            return false;
        }

        items[lastIndex] = item;
        OnItemChanged?.Invoke(lastIndex);
        return true;
    }

    public void UseItem(int index)
    {
        if (items[index].Type == ItemType.Usable)
        {
            items[index].Use();
            items[index] = null;
        }
        else if (items[index].Type == ItemType.Equip)
        {

        }

        OnItemChanged?.Invoke(index);
    }    
}

public partial class GameData
{
    // 인벤토리의 아이템을 게임 데이터와 연계하여 저장
}
  • Item (Item 자체는 내 담당이 아니지만, 테스트용으로 만들어야 할 것으로 보인다.)
    스크립터블 오브젝트로 구성했으며, 해당 스크립터블 오브젝트 데이터를 Resources로 관리하는 방법을 고려하고 있다.
using UnityEngine;

public enum ItemType { Material, Usable, Equip }

[CreateAssetMenu (fileName ="Item", menuName="Data/Item")]
public abstract class Item : ScriptableObject
{
    [field : SerializeField] public string Name { private set; get; }
    [field : SerializeField] public float Weight { private set; get; }
    [field : SerializeField] public ItemType Type { private set; get; }
    [field : SerializeField] public Sprite Icon { private set; get; }
    [field : SerializeField] public GameObject Prefab { private set; get; }

    public abstract void Use();
}
profile
게임 만들러 코딩 공부중

0개의 댓글