Unity - excel파일 읽기

김도현·2023년 10월 25일
0

TIL

목록 보기
51/76

Unity를 사용 및 배워보면 데이터를 저장 및 불러오기에 대한 고민이 깊어진다.
유저가 플레이했던 정보를 어떻게 저장할지.., 아이템의 정보는 어떻게 처리할지..., 대화창의 대화는 어떻게 처리할지... 등등
그래서 Unity의 데이터 저장하는 방법중 excel로 불러오는 방법을 적어보고자 한다.

Unity로 엑셀파일을 읽어올 수 있어?

답은 No이면서 Yes이다. Unity내에서 지원되는 부분이 없지만, c#내에서 있는 Microsoft Excecl Object Library을 참조로 추가하여 직접 구현할 수 있다.
또는 유저가 만들어 놓은 스크립트를 이용해야 된다.

그래서 간단한 방법은 무엇이야?

당연빠따 유저가 만들어놓은 것을 사용하는 것이다. - 사이트
사용방법은 README(리드미)를 읽던가 여기 유튜브(고박사의 유니티 노트)를 시청하시면 됩니다.

난 귀찮아 사용방법과 코드 알려줘

  1. 위에 올려놓은 사이트에 접속하여 다운받는다 clone이든 Download zip이등 원하는 방법으로 다운받으면 된다.

  2. Assets폴더 안에있는 ExcelImporter을 자신의 Unity Assets폴더 안으로 옮겨준다.

  3. 첫행에 변수명, 나머지 행에는 값을 넣으주면 된다.

  • #은 주석처리 됩니다 ex)# 주석주석
  • enum도 가능합니다. 아래 사진에서 _itemType은 enum입니다.

_id	_itemName	_itemExplanation	_itemType	_price	_dropPrefabPath	_iconPath	_maxCount
0	나무 검	나무로 만든 검입니다.	Equipment	10	Prefabs/Entities/DropItem/0	Sprite/Icon/0	1
1	허름한 가죽	재료가 될 허름한 가죽입니다.	Equipment	10	Prefabs/Entities/DropItem/1	Sprite/Icon/1	1
2	허름한 가죽 상의	허름한 가죽으로 만든 상의입니다.	Equipment	10	Prefabs/Entities/DropItem/@@@	Sprite/Icon/@@@	1
3	허름한 가죽 하의	허름한 가죽으로 만든 하의입니다.	Equipment	10	Prefabs/Entities/DropItem/@@@	Sprite/Icon/@@@	1
4	허름한 가죽 모자	허름한 가죽으로 만든 모자입니다.	Equipment	10	Prefabs/Entities/DropItem/@@@	Sprite/Icon/@@@	1
5	테스트용 포션	포션	Consumable	1	Prefabs/Entities/DropItem/@@@	Sprite/Icon/@@@	99
6	기타기타기타	기타기타기타	ETC	100	Prefabs/Entities/DropItem/@@@	Sprite/Icon/@@@	99
7	테스트용 퀘스트 아이템	퀘스트 아이템	QuestItem	1	Prefabs/Entities/DropItem/@@@	Sprite/Icon/@@@	1
  1. 위의 변수를 ScriptableObject로 저장할 클래스를 생성해줍니다.

예시

public enum ItemType
{
    Equipment,
    Consumable,
    ETC,
    QuestItem
}

[System.Serializable]
public class ItemData
{
    [SerializeField] private int _id;
    [SerializeField] private string _itemName;
    [SerializeField] private string _itemExplanation;
    [SerializeField] private ItemType _itemType;
    [SerializeField] private int _price;
    [SerializeField] private int _maxCount;
    [SerializeField] private string _dropPrefabPath;
    [SerializeField] private string _iconPath;
    private GameObject _dropPrefab;
    private Sprite _icon;

    public int ID { get { return _id; } }
    public string ItemName { get { return _itemName; } }
    public string ItemExplanation { get { return _itemExplanation; } }
    public ItemType ItemType { get { return _itemType; } }
    public int Price { get { return _price; } }
    public int MaxCount { get { return _maxCount; } }
    public GameObject DropPrefab
    {
        get
        {
            if(_dropPrefab == null)
            {
                _dropPrefab = Resources.Load(_dropPrefabPath) as GameObject;
            }

            return _dropPrefab;
        }
    }

    public Sprite Icon
    {
        get
        {
            if (_dropPrefab == null)
            {
                _icon = Resources.Load(_iconPath) as Sprite;
            }

            return _icon;
        }
    }
}
  1. excel파일을 변환해주는 스크립트 생성하기
    이 부분은 자동화 되어있다 간단히 따라하면 된다.

만든 excel파일을 우클릭하여 생성에 있는 ExcelAssetScript를 눌른다.
그러면 새로운 스크립트가 만들어진다.
이미 만들어진 파일(내용 수정한 상태)

원본 상태

안에 있는 내용을 수정해주면 됩니다.

  • 맨앞의 주석 삭제
  • List<EntityType>List<내가만든 클래스이름>으로 수정하면 됩니다.

수정 후 상태

  1. 다시 임포트 해주기
    Excel파일을 Reimport 해주면 ScriptableObject가 생성됩니다.

  1. 사용하기
    내가 생성한 ScriptableObject명 타입의 변수를 만들어 스크립터블 오브젝트를 할당 후
    ClassName.Class에서 선언된 변수이름.내가 사용할 변수로 사용해주시면 됩니다

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

public class ItemDB : CustomSingleton<ItemDB>
{
    [SerializeField] private ItemExcel _itemExcel;

    public bool GetItemData(int id, out ItemData itemData)
    {
        if(id > _itemExcel.ItemDatas.Count)
        {
            Debug.Log("Error 아이템의 id값을 확인해 주세요.");
            itemData = null;
            return false;
        }
        else
        {
            itemData = _itemExcel.ItemDatas[id];
            return true;
        }
    }
}

0개의 댓글