본문 바로가기
대학생활/수업

게임데이터설계 13주차 - 게임데이터의 형식과 활용

by se.jeon 2023. 6. 7.
728x90
반응형

게임데이터의 형식과 활용

엑셀 자체가 데이터는 아니다.

XML, CSV, JSON

우리가 만드는 엑셀이 과연 어떻게 쓰이는지. 어떻게 활용되는지 이해를 해야 데이터를 온전히 이해하는 것이다.

 

Structured vs Unstructured Data

무엇이 다른가?

참고자료 : https://learn.g2.com/structured-vs-unstructured-data

 

구조화되지 않은 비정형 데이터는 관리가 어렵다.

구조화된 데이터는 다소 패턴화되고 뻔하지만 관리가 된다는 장점이 있고,

비정형 데이터는 결과물은 멋지게 나올 수 있지만 관리가 어렵다. 그래서 구조화된 데이터를 많이 쓴다.

 

정형화 데이터의 특징

구조화된 데이터는 매우 체계적이고 기계 언어로 쉽게 이해된다.

관계형 데이터베이스 내에서 작업하는 살마들은 구조화된 데이터를 비교적 빠르게 입력, 검색 및 조작 할 수 있다.

구조화된 데이터의 가장 매력적인 특징.

- 스프레드 시트

- 스크립트 데이터

- 툴을 통한 리소스 파일

 

다양한 형식의 게임 데이터

'게임 플레이'나 '퀘스트'처럼 '예외성이 큰 구현 요소'를 다룰 때는 스크립트 형태의 데이터를 쓰는 경우가 많다.

기획자는 스크립트를 하나 정도 공부 해 두면 큰 도움이 된다.

 

스크립트는 종류에 따라서 문법이 다르다.

lua의 경우 메타버스, 샌드박스 형태에 많이 쓰이고 있다.

 

'AI'나 '퀘스트', '게임모드', '레벨디자인'의 경우는 게임 내부의 툴을 활용하여 데이터를 만드는 경우가 많다.

https://www.gamemeca.com/view.php?gid=231588 

 

[유즈맵 제작]가이드 3탄, 트리거와 데이터 모듈를 알아보자

게임메카는 온라인게임 뉴스, 인기게임 순위, 신작과 업데이트 정보, 게임 공략, 모바일게임 순위, 웹게임 순위를 제공합니다.

www.gamemeca.com

 

스타크래프트2의 예시

스타크래프트2는 데이터 편집기를 통해서 게임 내부 데이터의 값을 확인할 수 있다.

- 데이터 유형에서 유닛을 선택한 후 해병으로 검색하자 검색된 데이터를 클릭하면 해병에 관한 모든 정보가 출력된다.

- 해병을 생성해서 싸워보면 기본적인 해병을 확인 할 수 있다.

- 하지만 해병의 데이터를 편집기 툴을 통해서 바꿔보면 조금 더 재미있는 해병을 확인 할 수 있다.

> 스타2의 데이터는 '유닛(해병)'과 '공격유형(기관총)'이 고정된 구조가 아님을 알 수 있다.

 

스프레드 시트의 변환 : 대표적인 데이터 형식

- XML 

- JSON

- CSV

 

XML (eXtensible Markup Language)

데이터를 저장하고 전달할 목적으로 만들어진 언어. (HTML과 비슷하면서도 다름)

조상과 자식의 상하관계 구조를 가진다.

XML의 가장 큰 특징 : 스키마 데이터를 가진다.

XSD : XML Schema Definition

Notepad++과 같은 에디터를 통해 편집하는 것이 좋다.

 

XML의 문법

1. 모든 XML 요소는 종료 태그를 가져야 한다.

2. XML 태그는 대소문자를 구분한다.

3. XML에서는 시작 태그와 종료 태그가 모두 대소문자까지 같아야 한다.

4. XML 태그의 여닫는 순서는 반드시 지켜져야 한다.

5. XML에서 속성값은 반드시 따옴표로 감싸야 한다.

6. XML에서는 띄어쓰기를 인식한다.

 

XSD 사용 실습

XmlTest.xsd
0.00MB


엑셀 개발 도구 활성화

상단 바 > 기타 명령 > 리본 사용자 지정 > 기본 탭 > 개발 도구 체크박스 활성화

핸드폰의 개발자모드처럼 이 기능을 사용할 일은 별로 없기 때문에 비활성화 되어있다.

 

개발도구 > 원본

추가 > XSD 파일 삽입

원본에 표시된 값은 XSD에 입력된 값들임을 알 수 있다.

우클릭하여 요소 매핑 사용

요소 매핑 진행.

데이터가 매핑 된 것을 확인 할 수 있다.

내보내기를 눌러 XML 파일로 변환.

변환 결과값 : 

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Item xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
	<Weapon>
		<Code>1</Code>
		<Name>빛검</Name>
		<Type>1</Type>
		<Grade>1</Grade>
		<Set>100</Set>
		<Damage>100</Damage>
	</Weapon>
	<Weapon>
		<Code>2</Code>
		<Name>암흑검</Name>
		<Type>2</Type>
		<Grade>1</Grade>
		<Set>200</Set>
		<Damage>90</Damage>
	</Weapon>
	<Weapon>
		<Code>3</Code>
		<Name>불검</Name>
		<Type>3</Type>
		<Grade>1</Grade>
		<Set>300</Set>
		<Damage>80</Damage>
	</Weapon>
	<Weapon>
		<Code>4</Code>
		<Name>물검</Name>
		<Type>4</Type>
		<Grade>1</Grade>
		<Set>400</Set>
		<Damage>70</Damage>
	</Weapon>
	<Weapon>
		<Code>5</Code>
		<Name>바람검</Name>
		<Type>5</Type>
		<Grade>1</Grade>
		<Set>500</Set>
		<Damage>60</Damage>
	</Weapon>
	<Weapon>
		<Code>6</Code>
		<Name>번개검</Name>
		<Type>양손검</Type>
		<Grade>2</Grade>
		<Set>600</Set>
		<Damage>50</Damage>
	</Weapon>
</Item>

XmlTest.xml
0.00MB

 

XML데이터를 Unity 스크립트를 통해서 파싱 해 보는 실습 진행.

1. Project 창에 [Assets] 폴더 아래 [Resources] 폴더를 만든 후 만들어 놓은 XML 데이터를 복사한다.

2. 누군가 만들어 놓은 (감사합니다) XML 파싱 C# Script를 빈 게임 오브젝트에 붙이고 실행한다.

3. 디버그 로그로 데이터가 찍히는 것을 확인한다.

* Parshing 하는 방법은 구글링을 통해 공부 할 수 있다.

XmlTest.cs
0.00MB

 

Json (JavaScript Object Notation)

좀 더 쉽게 데이터를 교환하고 저장하기 위하여 만들어진 텍스트 기반의 데이터

 

JSON과 XML의 공통점

1. 둘 다 데이터를 저장하고 전달하기 위해 고안되었다.
2. 둘 다 기계뿐만 아니라 사람도 쉽게 읽을 수 있다.
3. 둘 다 계층적인 데이터 구조를 가진다.
4. 둘 다 다양한 프로그래밍 언어에 의해 파싱될 수 있다.
5. 둘 다 XMLHttpRequest 객체를 이용하여 서버로부터 데이터를 전송 받을 수 있다.

 

JSON과 XML의 차이점

1. JSON은 종료 태그를 사용하지 않는다.
2. JSON의 구문이 XML의 구문보다 더 짧다.
3. JSON 데이터가 XML 데이터보다 더 빨리 읽고 쓸 수 있다.(용량이 상대적으로 작다)
4. XML은 배열을 사용할 수 없지만, JSON은 배열을 사용할 수 있다.
5. XML은 XML 파서로 파싱되며, JSON은 자바스크립트 표준 함수인 eval() 함수로 파싱된다.

 

JSON과 XML의 사용

- JSON은 XML보다 빠른 처리속도를 보여준다.

- HTML과 자바스크립트가 연동되어 빠른 응답이 필요한 웹 환경에서 JSON이 많이 사용된다.

- 데이터의 무결성, 검증이 필요한 곳에서는 스키마를 사용해서 검증 할 수 있는 XML이 많이 사용된다.

 

JSON을 엑셀에서 데이터로 변경하여 사용하는 실습

- 엑셀 VBA를 통한 데이터 변환

- 자바 스크립트를 통한 데이터 변환

 

엑셀 VBA를 사용하여 데이터를 JSON으로 변환하는 실습

Excellent JSON.xlsm
0.02MB

1. Excellent JSON.xlsm 매크로 파일에 데이터를 입력한다.

2. Sheet2에 있는 Parse 버튼을 클릭한다.

3. Notepad++을 열어서 Parse된 내용을 붙여 넣는다.

 

JS를 사용하여 데이터를 JSON으로 변환하는 실습

Excel2Json.js
0.03MB

1. Excel2Json.js 파일과 데이터 파일을 함께 놓는다.

2. 스크립트 작동을 위해서 JsonTest.xlsx을 수정한다.

    JSON 파일로 변환할 데이터 컬럼 가장 왼쪽에 #data[{}] 셀을 추가한다.

3. Excel2Json.js 파일을 실행한다.

4. document 폴더가 생기고 JsonTest.json이 만들어진다.

5. 해당 Json파일을 notepad++로 확인 해 본다. * 엔진에서의 데이터 파싱은 XML과 같이 파서를 사용해서 처리

[
  {
    "Code": "1",
    "Name": "빛검",
    "Type": "1",
    "Grade": "1",
    "Set": "100",
    "Damage": "100"
  },
  {
    "Code": "2",
    "Name": "암흑검",
    "Type": "2",
    "Grade": "1",
    "Set": "200",
    "Damage": "90"
  },
  {
    "Code": "3",
    "Name": "불검",
    "Type": "3",
    "Grade": "1",
    "Set": "300",
    "Damage": "80"
  },
  {
    "Code": "4",
    "Name": "물검",
    "Type": "4",
    "Grade": "1",
    "Set": "400",
    "Damage": "70"
  },
  {
    "Code": "5",
    "Name": "바람검",
    "Type": "5",
    "Grade": "1",
    "Set": "500",
    "Damage": "60"
  },
  {
    "Code": "6",
    "Name": "번개검",
    "Type": "양손검",
    "Grade": "2",
    "Set": "600",
    "Damage": "50"
  }
]

 

JSON 뷰어를 통해 트리 형태로 볼 수 있는 특징이 있다.

http://jsonviewer.stack.hu/ : Format 버튼을 눌러서 JSON 포맷으로 재정렬 할 수 있다.

 

Online JSON Viewer

 

jsonviewer.stack.hu

 

CSV (Comma Separated Value)

쉼표를 기준으로 항목을 구분하여 저장하는 데이터

가장 엑셀과 유사한 데이터.

 

CSV로 데이터를 변환하는 실습

엑셀을 다른 이름으로 저장하면 CSV 항목이 있다.

CSV는 실행 시 엑셀의 형태로 실행된다.

CSV을 Notepad로 열어보면 차이를 이해 할 수 있다.

Code,Name,Type,Grade,Set,Damage
1,빛검,1,1,100,100
2,암흑검,2,1,200,90
3,불검,3,1,300,80
4,물검,4,1,400,70
5,바람검,5,1,500,60
6,번개검,양손검,2,600,50

 

엑셀이 경고했던 내용은 무엇일까?

- 테스트를 위해서 '메모(Shift+F2)'를 하나 제작한다.

- CSV 파일로 변환하여 열람 해 보면 정렬, 메모와 같은 데이터 외의 내용들이 사라져 있음을 알 수 있다.

 

CSV 파일은 파일 형식을 UTF-8로 변환하여 사용한다.

Notepad > 인코딩 > UTF-8로 변환 가능하다.

 

Unity로 CSV 데이터를 파싱하는 실습

CSVTest.cs
0.00MB
CSVReader.cs
0.00MB

using UnityEngine;
using System;
using System.Collections;
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, object>> Read(string file)
    {
        var list = new List<Dictionary<string, 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, 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("\\", "");
                object finalvalue = value;
                int n;
                float f;
                if (int.TryParse(value, out n))
                {
                    finalvalue = n;
                }
                else if (float.TryParse(value, out f))
                {
                    finalvalue = f;
                }
                entry[header[j]] = finalvalue;
            }
            list.Add(entry);
        }
        return list;
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CSVTest : MonoBehaviour
{

    // Start is called before the first frame update
    void Start()
    {
        List<Dictionary<string, object>> data = CSVReader.Read("CSVTest");

        for (var i = 0; i < data.Count; i++)
        {
            Debug.Log("index " + data[i]["Code"] + " " + data[i]["Name"] + " " + data[i]["Type"] + " " + data[i]["Grade"] + " " + data[i]["Set"] + " " + data[i]["Damage"]);
            //print("index " + data[i]["Code"] + " " + data[i]["Name"] + " " + data[i]["Type"] + " " + data[i]["Grade"] + " " + data[i]["Set"] + " " + data[i]["Damage"]);
        }
    }
}

1. CSVReader와 CSVTest 스크립트를 데이터에 맞게 수정한다.

2. 작성한 CSVTest C#을 Main Camera에 추가한다.

3. Scene을 실행하고 디버그 로그를 확인한다.

Unreal 엔진은 CSV 사용이 용이하다. 언리얼 프로젝트에서는 CSV 형식으로 데이터를 많이 사용한다.

한글을 쓰는 데이터에서는 csv 말고 다른 형태를 사용하는 것이 좋다.

 

데이터는 관리하기 쉽도록 엑셀을 통해서 만들고 프로그래머와 협의 후 포맷을 변환해서 사용하자.

데이터는 엑셀의 형태를 가질 뿐, 엑셀이 아니다.

 

기말 과제 공지 : 이벤트 데이터테이블 만들기

글자 수집 이벤트. 글씨를 모아서 특정 아이템과 교환하는 이벤트.

"맙소사 벌써 종강이라니" 라는 10글자를 수집하는 이벤트.

 

이벤트 미션을 통해서 '종강P' 획득 가능.

- 출석 체크하기 (1일 1회 제한) : 종강 P 50 보상

- 시나리오 플레이 10회 (제한 없음) : 종강 P 10 보상

- 아레나 대전 승리 10회 (1일 3회 제한) : 종강 P 30 보상

- 던전 플레이 10회 (1일 3회 제한) : 종강 P 20 보상

- 캐릭터 뽑기 5회 (제한 없음) : 종강 P 30 보상

'종강P' 100을 소모하여 '종강기념 글자상자' 뽑기 1회 가능

   * '종강기념 글자상자 열쇠'를 통해서도 가능 (상점에서 판매)

 

종강기념 글자상자를 열면, 10글자 중 1글자가 랜덤으로 나온다. 글자는 중복으로 나올 수 있음.

각 글자가 나올 때 글자마다 정해진 보상을 반복적으로 제공한다.

 

동일한 글자 3개를 소모해서 다른 글자 1개로 변환하는 변환시스템을 제공한다.

   *변환으로 글자를 만들 때에는 상자를 열어서 글자 획득 시 받는 보상을 제공하지 않는다.

 

10개의 모든 글자를 수집하면 '종강뺏지' 1개와 교환할 수 있다.

종강뺏지 누적 획득 수 (1, 3, 5, 7회)에 따라서 보상을 지급한다.

누적한 '종강뺏지'로 아이템을 구매할 수 있는 이벤트 상점을 제공한다.

   *종강뺏지는 1만골드로 되팔 수 있고. 1시간에 1번씩  랜덤으로 변경되는 이벤트 상점의 상품을 교환하는데 사용할 수 있다. 같은 아이템이라도 가격이 다르게 나올 수 있다. (리스트 자유)

 

필수 제출 과제물

종강글자모으기이벤트기획서.ppt

종강글자모으기 이벤트를 구현하기 위한 기획서

    1. 그래픽 팀원과 프로그래머가 이벤트를 개발하기 위해 볼 문서 작성

    2. 구현을 위한 게임 데이터 활용 방법 반드시 포함 (별도의 발표 없음)

종강글자모으기이벤트데이터.xls & json

이벤트 구현을 위해 필요한 데이터를 테이블로 정리

    1. 별도로 필요한 데이터가 있는 경우 자유롭게 추가! (각 컬럼에 메모 필수로 포함!)

    2. 스크립트 형태의 데이터가 아닌 스프레드 시트 형태의 데이터로 제작

    3. Json 파일로 변환해서 함께 제출!!

 

평가 기준

1. 이벤트의 구현 알고리즘을 데이터와 연계하여 잘 설명하였는가? : 10점

2. 요구사항에 맞게 데이터 테이블을 잘 구성하였는가? : 10점

3. 데이터 테이블 구조의 효율성과 각 컬럼의 명확성이 우수한가? : 20점

제출 기한 : 오늘부터 - 6월 20일 화요일 23시 59분까지.

 

수업 중 실습 (과제)

수업 중 실습으로 만든 테이블 중 하나를 자유롭게 선택하여 XML, JSON, CSV 형태로 변환 해 보자.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Item xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
	<Tower>
		<TOWER_CODE>11</TOWER_CODE>
		<TOWER_NAME>궁수타워</TOWER_NAME>
		<TOWER_TYPE>1</TOWER_TYPE>
		<TOWER_LEVEL>1</TOWER_LEVEL>
		<TOWER_GOLD>70</TOWER_GOLD>
		<TOWER_RESELL>0.6</TOWER_RESELL>
		<TOWER_ATK_TYPE>1</TOWER_ATK_TYPE>
		<TOWER_ATK_DMG_MIN>4</TOWER_ATK_DMG_MIN>
		<TOWER_ATK_DMG_MAX>6</TOWER_ATK_DMG_MAX>
		<TOWER_ATK_SPEED>1.2</TOWER_ATK_SPEED>
		<TOWER_ATK_RANGE>80</TOWER_ATK_RANGE>
		<TOWER_ATK_TARGET>2</TOWER_ATK_TARGET>
		<TOWER_SPLASH_TYPE>0</TOWER_SPLASH_TYPE>
		<TOWER_SPLASH_RANGE>0</TOWER_SPLASH_RANGE>
		<TOWER_SPLASH_FILTER>0</TOWER_SPLASH_FILTER>
		<TOWER_SPLASH_DMG_MIN>0</TOWER_SPLASH_DMG_MIN>
		<TOWER_SPLASH_DMG_MAX>0</TOWER_SPLASH_DMG_MAX>
		<TOWER_SPLASH_LIMIT>0</TOWER_SPLASH_LIMIT>
		<TOWER_ATK_EFFECT_TYPE>0</TOWER_ATK_EFFECT_TYPE>
		<TOWER_ATK_EFFECT_VALUE>0</TOWER_ATK_EFFECT_VALUE>
		<TOWER_ATK_EFFECT_DURATION>0</TOWER_ATK_EFFECT_DURATION>
		<TOWER_ATK_EFFECT_RESOURCE>0</TOWER_ATK_EFFECT_RESOURCE>
		<TOWER_UPGRADE_1>12</TOWER_UPGRADE_1>
		<TOWER_UPGRADE_2>0</TOWER_UPGRADE_2>
		<TOWER_UPGRADE_3>0</TOWER_UPGRADE_3>
	</Tower>
	<Tower>
		<TOWER_CODE>12</TOWER_CODE>
		<TOWER_NAME>장궁병 타워</TOWER_NAME>
		<TOWER_TYPE>1</TOWER_TYPE>
		<TOWER_LEVEL>2</TOWER_LEVEL>
		<TOWER_GOLD>140</TOWER_GOLD>
		<TOWER_RESELL>0.6</TOWER_RESELL>
		<TOWER_ATK_TYPE>1</TOWER_ATK_TYPE>
		<TOWER_ATK_DMG_MIN>6</TOWER_ATK_DMG_MIN>
		<TOWER_ATK_DMG_MAX>8</TOWER_ATK_DMG_MAX>
		<TOWER_ATK_SPEED>1.3</TOWER_ATK_SPEED>
		<TOWER_ATK_RANGE>85</TOWER_ATK_RANGE>
		<TOWER_ATK_TARGET>2</TOWER_ATK_TARGET>
		<TOWER_SPLASH_TYPE>0</TOWER_SPLASH_TYPE>
		<TOWER_SPLASH_RANGE>0</TOWER_SPLASH_RANGE>
		<TOWER_SPLASH_FILTER>0</TOWER_SPLASH_FILTER>
		<TOWER_SPLASH_DMG_MIN>0</TOWER_SPLASH_DMG_MIN>
		<TOWER_SPLASH_DMG_MAX>0</TOWER_SPLASH_DMG_MAX>
		<TOWER_SPLASH_LIMIT>0</TOWER_SPLASH_LIMIT>
		<TOWER_ATK_EFFECT_TYPE>0</TOWER_ATK_EFFECT_TYPE>
		<TOWER_ATK_EFFECT_VALUE>0</TOWER_ATK_EFFECT_VALUE>
		<TOWER_ATK_EFFECT_DURATION>0</TOWER_ATK_EFFECT_DURATION>
		<TOWER_ATK_EFFECT_RESOURCE>0</TOWER_ATK_EFFECT_RESOURCE>
		<TOWER_UPGRADE_1>13</TOWER_UPGRADE_1>
		<TOWER_UPGRADE_2>0</TOWER_UPGRADE_2>
		<TOWER_UPGRADE_3>0</TOWER_UPGRADE_3>
	</Tower>
    
    (이하 생략)
</Item>
{
	"data": [
		{
			"TOWER_CODE": 11,
			"TOWER_NAME": "궁수타워",
			"TOWER_TYPE": 1,
			"TOWER_LEVEL": 1,
			"TOWER_GOLD": 70,
			"TOWER_RESELL": 0.6,
			"TOWER_ATK_TYPE": 1,
			"TOWER_ATK_DMG_MIN": 4,
			"TOWER_ATK_DMG_MAX": 6,
			"TOWER_ATK_SPEED": 1.2,
			"TOWER_ATK_RANGE": 80,
			"TOWER_ATK_TARGET": 2,
			"TOWER_SPLASH_TYPE": 0,
			"TOWER_SPLASH_RANGE": 0,
			"TOWER_SPLASH_FILTER": 0,
			"TOWER_SPLASH_DMG_MIN": 0,
			"TOWER_SPLASH_DMG_MAX": 0,
			"TOWER_SPLASH_LIMIT": 0,
			"TOWER_ATK_EFFECT_TYPE": 0,
			"TOWER_ATK_EFFECT_VALUE": 0,
			"TOWER_ATK_EFFECT_DURATION": 0,
			"TOWER_ATK_EFFECT_RESOURCE": 0,
			"TOWER_UPGRADE_1": 12,
			"TOWER_UPGRADE_2": 0,
			"TOWER_UPGRADE_3": 0
		},
		{
			"TOWER_CODE": 12,
			"TOWER_NAME": "장궁병 타워",
			"TOWER_TYPE": 1,
			"TOWER_LEVEL": 2,
			"TOWER_GOLD": 140,
			"TOWER_RESELL": 0.6,
			"TOWER_ATK_TYPE": 1,
			"TOWER_ATK_DMG_MIN": 6,
			"TOWER_ATK_DMG_MAX": 8,
			"TOWER_ATK_SPEED": 1.3,
			"TOWER_ATK_RANGE": 85,
			"TOWER_ATK_TARGET": 2,
			"TOWER_SPLASH_TYPE": 0,
			"TOWER_SPLASH_RANGE": 0,
			"TOWER_SPLASH_FILTER": 0,
			"TOWER_SPLASH_DMG_MIN": 0,
			"TOWER_SPLASH_DMG_MAX": 0,
			"TOWER_SPLASH_LIMIT": 0,
			"TOWER_ATK_EFFECT_TYPE": 0,
			"TOWER_ATK_EFFECT_VALUE": 0,
			"TOWER_ATK_EFFECT_DURATION": 0,
			"TOWER_ATK_EFFECT_RESOURCE": 0,
			"TOWER_UPGRADE_1": 13,
			"TOWER_UPGRADE_2": 0,
			"TOWER_UPGRADE_3": 0
		},
        
        (이하 생략)   
	]
}
TOWER_CODE,TOWER_NAME,TOWER_TYPE,TOWER_LEVEL,TOWER_GOLD,TOWER_RESELL,TOWER_ATK_TYPE,TOWER_ATK_DMG_MIN,TOWER_ATK_DMG_MAX,TOWER_ATK_SPEED,TOWER_ATK_RANGE,TOWER_ATK_TARGET,TOWER_SPLASH_TYPE,TOWER_SPLASH_RANGE,TOWER_SPLASH_FILTER,TOWER_SPLASH_DMG_MIN,TOWER_SPLASH_DMG_MAX,TOWER_SPLASH_LIMIT,TOWER_ATK_EFFECT_TYPE,TOWER_ATK_EFFECT_VALUE,TOWER_ATK_EFFECT_DURATION,TOWER_ATK_EFFECT_RESOURCE,TOWER_UPGRADE_1,TOWER_UPGRADE_2,TOWER_UPGRADE_3
11,궁수타워,1,1,70,0.6,1,4,6,1.2,80,2,0,0,0,0,0,0,0,0,0,0,12,0,0
12,장궁병 타워,1,2,140,0.6,1,6,8,1.3,85,2,0,0,0,0,0,0,0,0,0,0,13,0,0
13,명사수 타워,1,3,210,0.6,1,8,10,1.4,90,2,0,0,0,0,0,0,0,0,0,0,14,15,0
14,레인지,1,4,280,0.6,1,10,15,1.5,100,2,0,0,0,0,0,0,0,0,0,0,0,0,112
15,총사대,1,4,280,0.6,1,10,15,1.5,100,2,0,0,0,0,0,0,0,0,0,0,0,0,113
21,민병대 병영,2,1,70,0.6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,0,0
31,마법사 타워,3,1,100,0.6,2,11,20,0.6,50,2,0,0,0,0,0,0,2,50,30,0,32,0,0
41,드워프 포대,4,1,125,0.6,1,9,17,0.4,50,1,1,50,2,15,20,0,3,0,20,3DData\Effect\Slow,42,0,0
51,테슬라104,4,1,150,0.6,1,3,5,0.6,50,1,2,50,2,3,5,3,0,0,0,0,52,0,0
61,의료사 거점,5,1,100,0.6,3,1,2,0.6,50,1,0,0,0,0,0,0,0,0,0,0,62,0,0
62,치료사 거점,5,2,200,0.6,3,2,5,0.7,60,1,0,0,0,0,0,0,0,0,0,0,63,0,0
63,치유사 거점,5,3,300,0.6,3,7,10,0.8,70,1,0,0,0,0,0,0,0,0,0,0,64,65,0
64,성직자 거점,5,4,400,0.6,3,20,25,1,80,1,0,0,0,0,0,0,0,0,0,0,0,0,201
65,성기사 거점,5,4,400,0.6,3,10,15,1,120,1,0,0,0,0,0,0,0,0,0,0,0,0,202

 

728x90
반응형