내일배움캠프 55일차 TIL, 최종프로젝트 개발일지3

황오영·2024년 7월 12일
0

TIL

목록 보기
55/56
post-thumbnail

최종프로젝트

  • 이번주 작업은 이것저것.. 많이 했었다. 그 Git Merge 하고 팀원분들과 작업 나눈거해서 기초적인 시스템은 일단 구현 얼추 다 한듯하다. 아직 데이터작업이 미흡하긴 하지만 이건 남은기간에 작업예정

박스, 보관함시스템

  • 그중 인벤토리 관련해서 시스템을 만들고있어서 스타듀밸리류 게임의 필수 아이템 상자 시스템을 구현했다.
  • 방식에 대해선 고민을 많이 하긴 했는데.. 음 좀 더 개선이 필요해 보이는 부분들도 있어서 아마 지속적인 작업은 계속 해 나가야 할것같다.

아이디어

  1. Box 오브젝트를 만들어 상호작용 하는 방식으로 작동
  2. Box 오브젝트에 Box Script에서 보관하고 있는 아이템, 상호작용시 열리는 UI관리
  • 우선 이 순서로 작동하고 UI 열리는것 까지 먼저 구현했다.

이렇게 오브젝트를 배치 한뒤 Box Script를 작성

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Box : MonoBehaviour, IInteractable
{
    public GameObject[] itemList;
    public GameObject UIprefab;
    private void Start()
    {
        itemList = new GameObject[30];
    }

    public void Interact()
    {
        ResourceManager.Instance.Instantiate(UIprefab).GetComponent<UI_Box>().SetBoxItemList(itemList);
    }
}
  • 코드자체는 별거없다. 그냥 itemList를 가진상태에서 그것을 인자로 전달해줘서 UI를 여는방식으로 구현 아마 지금은 Object인데 이부분은 수정할 예정 데이터로 바꿔야되는데 아직 데이터 테이블이 미완이라 일단은 오브젝트 자체를 저장하는 방식으로 구현

  • 그렇게 열면 일단 위에가 box에 있는 아이템 리스트 아래가 플래이어의 인벤토리 가 슬릇으로 생성되어 UI로 띄어준다
  • 플래이어 인벤토리의 이동시스템처럼 구현되서 아이템 슬릇을 이동하는것 까지 구현을 했었다. 그러고 하나의 어려움을 발견했는데

구현하면서 겪은 어려움

  • 다른것이 아니라 데이터를 옮기는 방식에 대해 고민이 있었다. 플래이어 인벤토리 내에서 서로 움직이는거면 데이터 저장을 고민할 것이 없는게 그냥 바로 플래이어의 인벤 배열을 바꿔주면 되기만 하는 부분이라 간단했다.
  • 하지만 플래이어와 박스가 가진 서로의 배열에서 데이터를 전달해야하는데 이것을 참조하는 방식이 많이 어려웠었다.
  • 해결은 생각보다 좀 단순한 방식으로 했는데 슬릇마다 박스의 슬릇이면 박스의 데이터를 플래이어의 슬릇이면 플래이어 슬릇을 참조하도록 설정하여 얕은복사의 성질을 이용했다. 주소값만 가지고 있으면 그것을 바꿔주면 되는 부분이라
    void SetBoxInven()
    {
        foreach (Transform child in boxInventoryPanel.transform)
            Managers.Resource.Destroy(child.gameObject);

        //사용가능 인벤토리 + 첫줄은 퀵슬릇 창이랑 동기화
        for (int i = 0; i < boxInventory.Length; i++)
        {
            UI_ItemSlot ItemSlot = Managers.UI.MakeSubItem<UI_ItemSlot>(boxInventoryPanel.transform);
            ItemSlot.SetIndex(i, boxInventory, ui_DragSlot);
            if (boxInventory[i] != null)
                ItemSlot.SetItemInfo(boxInventory[i]);
        }
    }
    void SetPlayerInven()
    {
        foreach (Transform child in playerinventoryPanel.transform)
            Managers.Resource.Destroy(child.gameObject);

        //사용가능 인벤토리 + 첫줄은 퀵슬릇 창이랑 동기화
        for (int i = 0; i < 10; i++)
        {
            UI_ItemSlot ItemSlot = Managers.UI.MakeSubItem<UI_ItemSlot>(playerinventoryPanel.transform);
            ItemSlot.SetIndex(i, playerInventory, ui_DragSlot);
            if (playerInventory[i] != null)
            {
                ItemSlot.SetItemInfo(playerInventory[i]);
            }

        }

        //사용 불가 이벤토리(확장필요)
        for (int i = 11; i < 31; i++)
        {
            UI_ItemSlot ItemSlot = Managers.UI.MakeSubItem<UI_ItemSlot>(playerinventoryPanel.transform);
            ItemSlot.SetIndex(i, playerInventory, ui_DragSlot, false);
        }
    }
    
  • 아래코드가 정보를 설정해주는것, 생각보다 뭔가 너무많아져서 복잡해져서 개선이 필요할것같긴하다.. ㅠㅠ 덕지덕지 임시방편으로 붙여놓은 듯한 느낌
    public void SetIndex(int _index, GameObject[] _slotsData = null , UI_DragSlot _instance = null, bool _isAvailable = true)
    {
        index = _index;
        instance = _instance;
        isAvailable = _isAvailable;
        slotsData = _slotsData;
    }
  • 그런식으로 슬릇에 정보르 담아두는 방식으로 설정하고 확장메서드를 통해 배열을 옮겨주는 방식을 채용
 slotsData.ArraySwap(instance.itemSlot.slotsData, index, instance.itemSlot.index);

    public static void ArraySwap<T>(this T[] Fromarray, T[] Toarray, int from, int to)
    {
        T tmp = Fromarray[from];
        Fromarray[from] = Toarray[to];
        Toarray[to] = tmp;
    }
  • ArraySwap은 나자신의 배열값을 도착하느 배열값과 인덱스를 받아 그쪽으로 넘겨주고 바꿔주는 작업을 해주는 확장 메서드로 구현했다.
  • 요런식으로 나가도 잘 작동했다. 좀더 개선은 해야겠지만 일단은 잘 작동해서 뿌듯했다.

주간회고 + 오늘의 회고

  • 오랜만에 TIL작성, 생각보다 작업하면서 할것도 많아서 쓸 시간이 부족했다. 그래도 간간히 이런식으로 만드는것 써서 정리 잘 해야겠다.

  • 최근 기술면접 대비도 하고있는데 생각보다 뿌듯 하다.

  • 기술면접 쓰면서 확실히 개발관련 지식이 많이 늘은것을 느꼈다. 이런저런 상속, 추상부터 제네릭메소드 확장메소드 까지 이제 코드를 잘 읽고 이해할 수 있어서 캠프를 시작했었을때 보다 더 성장했다는 것을 느꼈다.

  • 다만 아직 걱정인것이 디자인패턴이 조금 부족한느낌? 지금은 그냥 주먹구구식으로 관리하고 있는것같긴하다 코드들 리팩토링도 꾸준히 할 필요가 있고 디자인패턴을 잘 적응할 수 있으면 더 좋은 개발자가 될것 같다. 남은 기간동안 꾸준히 디자인 패턴들 잘 공부해 봐야겠다.

profile
게임개발을 꿈꾸는 개발자

0개의 댓글