현재 기획안 시스템이 정확히 나오지는 않았지만 대략적인 틀은 아래와 같이 정해졌다.
현재까지 나온 기획안은 이 정도이고, 이후에 진행한 서바이벌 R&D 내용을 듣고서 업무분장을 시작했다.
필수 구현 기능 리스트는 크게 다음과 같이 나뉠 수 있으며, 게임의 기획 컨셉에 따라 내용이 상이할 수 있다.
사실상 R&D가 필요한 영역은 아니다.
파밍 시스템 - 열쇠, 재료 등
수집하고 활용할 수 있는 시스템
습득에 대해 다형성이 확보되어야 함.
다만 이를 상속 등의 방법으로 구현하기에는 매커니즘을 구현하기 어려우므로, 어댑터 패턴을 사용하는 것을 추천한다.
인터페이스를 구성하고, 어댑터로 연결한 다음 이벤트를 발생시키는 방식
인벤토리 : 스크립터블 오브젝트 - 특강 내용 참고
유의 - MVP, MVC 시스템 사용할 것 - 데이터는 따로 저장하자. UI연동 등에 필요
도구 시스템 - 노가다...
도구의 종류에 따라 상호작용 가능한 레이어를 설정하는 방식, 혹은 오버랩 방식
제작 시스템
원재료 조합, 혹은 특정 오브젝트와 상호작용하여 오브젝트 변환
원재료를 특정 조건에 따라서 결과물로 도출하는 방식
방법 1. 노가다 하드코딩... 백트래킹
인벤토리를 순회하면서 해당 아이템이 있으면 해당 아이템 사용 후 아이템 도출
효율성은 좋지 않다.
방법 2. - 해싱
각각의 아이템마다 ID를 부여(4자리)
이를 dictionary를 통해 찾아서 해당 아이템이 있을 시
아직까지 확실한 기획안이 나오진 않았지만, 핵심 기능 위주로 우선 업무분장을 시작했다.
내가 메인으로 담당하게 된 업무는 인벤토리 관련 기능이 되었다.
사실 업무를 받으면서도 자신이 없었지만, 안 해 본 업무를 해 보고 싶었기 때문에 분장 자체에는 불만이 없었다.
특히나 인벤토리 구현과 같은 경우는, 이전의 특강 공부한 내용이 정리되어 있지 않았기 때문에 이번 주말을 기회로 정리를 해야 할 것 같다.
생각보다 내용이 쉽지 않기도 하고, 특강 자체가 이전 코드를 이어서 쓰는 바람에 다시 구현해보니까 터져서... 주말에 처음부터 다시 몰아서 공부해야 할 것으로 보인다.
우선은 현재까지 정리한 예시 코드는 아래와 같이 구성했다.
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
{
// 인벤토리의 아이템을 게임 데이터와 연계하여 저장
}
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();
}