inflearn logo
강의

Khóa học

Chia sẻ kiến thức

Lập trình hệ thống Unity Pt.1 - Gói tất cả trong một về các hệ thống cốt lõi để hiện thực hóa trò chơi thương mại

Hệ thống quản lý bảng dữ liệu (DataTableManager, CSVReader)

CSVReader 자세하게 설명 가능하신가요?

Đã giải quyết

226

moonfgg

10 câu hỏi đã được viết

0

다른 프로젝트에서 사용하고 싶은데 자세하게 설명 가능하신가요?

C# unity 객체지향

Câu trả lời 1

0

burningcarrot

안녕하세요! BurningCarrot입니다. 문의해 주신 내용에 답변 드립니다.

 

일단 CSV파일은 Resources 폴더 하위에 위치해야 하고, Read 함수 호출 시 매개 변수는 Resources 폴더 내의 CSV파일 경로(파일명 포함, 파일 확장자명은 X)로 설정해 주시면 됩니다. ChapterDataTable.csv 파일을 읽어오면 어떤 자료구조의 형태로 받아오게 되는지는 아래 스크린샷을 참고 부탁 드립니다.

image.png

만약 조금 더 복잡한 구조의 csv파일을 변환하고 싶으실 경우 예시를 첨부해 주시면 좀 더 상세히 도움 드리겠습니다.

0

moonfgg

1개의 컬럼에 값들이 전부 하나씩 들어가 있는데 여러개의 값(생각중인 타입은 string입니다)을 구분자를 이용하여 넣고

key에 해당하는 value를 가져온뒤 구분자를 사용했으니 split으로 구별하여 여러 개의 값을 사용 가능한가요?

image.png


현재 script 부분이 4개로 나누어져 있는데

한 곳에서 모든 걸 다 입력하고 코드에서는 다시 4개로 나누어서 사용하고 싶어요

그리고 static string SPLIT_RE = @",(?=(?:[^""]*""[^""]*"")*(?![^""]*""))";

이 부분 설명 듣고싶습니다
감사합니다!

1

burningcarrot

static string SPLIT_RE = @",(?=(?:[^""]*""[^""]*"")*(?![^""]*""))"; 는 csv파일의 한 행에서 따옴표를 기준으로 데이터를 분리하는 기능을 합니다.

수강생 분의 csv파일을 읽어오려면 아래와 같은 코드로 작성하시면 되겠습니다. 각 컬럼의 값을 한번 더 SPLIT_RE 로 분리하여 리스트로 저장하는 방식을 취했습니다.

using UnityEngine;
using System.Collections.Generic;
using System.Text.RegularExpressions;

public class CSVReader
{
    static string SPLIT_RE = @",(?=(?:[^""]*""[^""]*"")*(?![^""]*""))";
    static string LINE_SPLIT_RE = @"\r\n|\n\r|\n|\r";
    static char[] TRIM_CHARS = { '\"' };

    public static List<Dictionary<string, List<object>>> Read(string file)
    {
        var list = new List<Dictionary<string, List<object>>>();
        TextAsset data = Resources.Load(file) as TextAsset;

        var lines = Regex.Split(data.text, LINE_SPLIT_RE);

        if (lines.Length <= 1) return list;

        var header = Regex.Split(lines[0], SPLIT_RE);
        for (var i = 1; i < lines.Length; i++)
        {
            var values = Regex.Split(lines[i], SPLIT_RE);
            if (values.Length == 0 || values[0] == "") continue;

            var entry = new Dictionary<string, List<object>>();
            for (var j = 0; j < header.Length && j < values.Length; j++)
            {
                string value = values[j];
                value = value.TrimStart(TRIM_CHARS).TrimEnd(TRIM_CHARS).Replace("\\", "");

                var splitedValues = Regex.Split(value, SPLIT_RE);
                List<object> finalValue = new List<object>();
                foreach (var item in splitedValues)
                {
                    int n;
                    float f;
                    object itemValue = item;
                    if (int.TryParse(item, out n))
                    {
                        itemValue = n;
                    }
                    else if (float.TryParse(item, out f))
                    {
                        itemValue = f;
                    }
                    finalValue.Add(itemValue);
                }
                entry[header[j]] = finalValue;
            }
            list.Add(entry);
        }
        return list;
    }
}

싱글턴패턴

0

11

1

LobbyUIController의 백키가 사라졌는데 왜그런건가요?

0

42

2

무조건 타이틀 씬부터 시작해야하나요?

0

41

1

BaseUI, UIManager

0

51

3

3d프로젝트에 적용해도 무방한가요?ㅁ

0

71

2

UserDataManager 코드 질문입니다.

0

88

2

업적/미션 Pt.3에서 OnClickClaimBtn 호출 시 Sort 부분 호출 동작

0

107

1

데이터 로드 관련 질문

0

88

2

16번 강의에서 ShowUI 함수부분 오타가 있는거 같습니다.

0

72

2

PlayerPrefs 에 대해서 문의드립니다.

0

106

2

다운 받은 자료 용량 관련 문의입니다.

0

93

2

userDataList Json으로 저장

0

101

2

Lobby 프리팹 구성 질문

0

99

3

씬로딩 관련한 질문드립니다.

0

103

2

보충강의를 들었는데도 불구하고 Confirm UI 창이 표시가 되지 않습니다.

0

141

2

Resources폴더의 로드에 대하여 궁금한 것이 있습니다.

1

155

2

LoadData함수가 호출되지 않습니다.

0

87

1

캔버스를 여러 장 사용하는 이유

0

151

1

인피티니스크롤 item의 rect Transform에 Nan값

0

110

2

아이템 필터 기능

0

145

1

[Title씬 구성 관련 질문 : 프리팹]

0

181

2

안녕하세요 일시정지부분

0

168

2

세션5 게임 셋팅 팝업 창 관련(unity6)

0

204

3

마지막 챕터를 클리어했을때 예외처리 질문입니다.

0

135

2