SlideShare a Scribd company logo
맵 에디터 제작하기
Copyright ⓒ 2014 Unity Technologies Korea All rights reserved. All contents cannot be copied without permission
중급
본 교재의 저작권은 유니티테크놀로지스코리아가 소유하고 있으며,
유니티 러닝센터 수강생만 교재를 볼 수 있습니다. 정당한 권리 없이 저작물을 복제, 젂송할 경우
그로 인하여 발생하는 손해를 배상하여야 함을 유념하시기 바랍니다.
타일 정보 구현하기
타일 편집 툴 구현하기
경로 설정용 Path툴 구현하기
맵 데이터 저장/로드 하기
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
타일 정보 구현하기
디펜스 게임에서 타일이 가져야 할 정보들
1. 타일을 표현하는 이미지 정보
2. 타일의 속성(적이 이동하는 길인가?, 타워를 설치할 수 있는 위치인가?
3. 경로와 관련된 정보(시작 위치 및 목적 위치 그리고 이동 해야 할 위치)
4. 특수한 능력을 가지는 타일
타일은 적의 시작위치와, 끝 위치 그리고 경로를 표현해야 한다.
또한 경로가 아닌 곳을 표현할 수 있어야 한다.
타워는 경로가 아닌 곳에 설치할 수 있다.
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
타일 정보 구현하기
게임에서 사용할 타일의 종류
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
타일 정보 구현하기
5가지 타일을 이용하여 표현한 디펜스 게임의 경로
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
타일 정보 구현하기
이미지가 가짂 정보를 저장하기 위해 [ TILESTYLE ] 열거형을 Enum.cs 파일에 선언
using UnityEngine;
using System.Collections;
public enum TILESTYLE
{
NORMAL = 0,
STRAIGHT,
CORNER,
START,
END,
}
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
타일 정보 구현하기
타일의 정보를 적용하기 위해 [ TileInfo ] 스크립트를 생성 후 구현
using UnityEngine;
using System.Collections;
public class TileInfo : MonoBehaviour
{
public TILESTYLE currentTileStyle;
public Material[] tileMaterials;
public void UpdateMaterial()
{
renderer.material = tileMaterials[ (int)currentTileStyle ];
}
}
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
타일 정보 구현하기
[ 직선타일 ] 이미지를 넣었을 때의 상황
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
타일 정보 구현하기
[ TileInfo ] 스크립트를 tile 프리팹에 추가하고 마테리얼 5종 생성 후
이름을 다음과 같이 설정
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
타일 정보 구현하기
[ TILESTYLE ] 순서에 맞게 [ Tile Materials ]에 마테리얼 설정
using UnityEngine;
using System.Collections;
public enum TILESTYLE
{
NORMAL = 0,
STRAIGHT,
CORNER,
START,
END,
}
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
타일 정보 구현하기
[ MapManagerInspector ] 클래스의 [ CreateTiles ] 함수 부분에 기능 추가
public class MapManagerInspector : Editor
{
......
public void CreateTiles(MapManager mapManager)
{
......
for (int i = 0; i < width; ++i)
{
for (int j = 0; j < height; ++j)
{
......
TileInfo tileInfo = mapManager._tiles[ i, j ].GetComponent<TileInfo>();
tileInfo.UpdateMaterial();
}
}
}
}
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
[ Tile ] 프리팹에 있는 Current Tile Style의 값을 ‘STRAIGHT’로 교체
타일 정보 구현하기
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
타일 정보 구현하기
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
타일 편집 툴 구현하기
[ MapManager ] 클래스에 [ _editTileStyle ] 변수 추가
using UnityEngine;
using System.Collections;
public class MapManager : MonoBehaviour
{
public TILESTYLE _editTileStyle = TILESTYLE.NORMAL;
......
}
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
타일 편집 툴 구현하기
[CustomEditor(typeof(MapManager))]
public class MapManagerInspector : Editor
{
......
public void OnSceneGUI()
{
if( Application.isPlaying )
return;
MapManager mapManager = target as MapManager;
Handles.BeginGUI();
if (GUI.Button(new Rect(10, 10, 100, 30), "Normal"))
{
mapManager._editTileStyle = TILESTYLE.NORMAL;
}
if (GUI.Button(new Rect(10, 50, 100, 30), "Straight"))
{
mapManager._editTileStyle = TILESTYLE.STRAIGHT;
}
if (GUI.Button(new Rect(10, 90, 100, 30), "Corner"))
{
mapManager._editTileStyle = TILESTYLE.CORNER;
}
if (GUI.Button(new Rect(10, 130, 100, 30), "Start"))
{
mapManager._editTileStyle = TILESTYLE.START;
}
if (GUI.Button(new Rect(10, 170, 100, 30), "End"))
{
mapManager._editTileStyle = TILESTYLE.END;
}
GUI.color = Color.green;
GUI.Label(new Rect(120, 10, 500, 30),
"Edit Mode : " + mapManager._editTileStyle);
GUI.color = Color.white;
Handles.EndGUI();
}
}
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
[ MapManager ]를 선택하면 구현한 내용이 반영되어 GUI가 씬 뷰에 출력되는 것 확인
타일 편집 툴 구현하기
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
특정 타일을 오른쪽 버튺 클릭 후 회젂하기 위해 타일 프리팹에 레이 케스팅에 의한
충돌검출을 하기 위한 박스 충돌체(Box Collider)를 추가
타일 편집 툴 구현하기
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
씬에 배치된 [ SpaceFloor ] 오브젝트에 붙어있는 박스 충돌체는 제거한 후,
씬 뷰에서 오브젝트 선택 후 타일 값을 변경하는 코드를 구현
타일 편집 툴 구현하기
[CustomEditor(typeof(MapManager))]
public class MapManagerInspector : Editor
{
......
public void OnSceneGUI()
{
......
Event e = Event.current;
if( e.type == EventType.mouseDown )
{
Vector2 mousePosition = e.mousePosition;
Ray ray =
HandleUtility.GUIPointToWorldRay( mousePosition );
RaycastHit hit;
bool result = Physics.Raycast(ray, out hit, 1000.0f);
if (result)
{
GameObject tileObj = hit.transform.gameObject;
TileInfo tileInfo = tileObj.GetComponent<TileInfo>();
if( tileInfo == null )
return;
if (e.button == 0) // left click button
{
tileInfo.currentTileStyle = mapManager._editTileStyle;
tileInfo.UpdateMaterial();
}
else if (e.button == 1) // right click button
{
hit.transform.localEulerAngles +=
new Vector3( 0.0f, 90.0f, 0.0f );
}
}
}
}
}
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
인스펙터 뷰의 잠김 상태 확인
타일 편집 툴 구현하기
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
타일 편집 기능으로 생성한 레벨의 모습
타일 편집 툴 구현하기
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
마우스 드래그로 변경할 수 있도록 구현
타일 편집 툴 구현하기
[CustomEditor(typeof(MapManager))]
public class MapManagerInspector : Editor
{
......
public void OnSceneGUI()
{
......
int controlID = GUIUtility.GetControlID(FocusType.Passive);
HandleUtility.AddDefaultControl( controlID );
Event e = Event.current;
if( e.type == EventType.mouseDown || e.type == EventType.mouseDrag )
{
if ( e.alt )
{
return;
}
......
} // End of OnSceneGUI
}
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
키보드 3~7번까지의 키를 눌렀을 때 타일의 정보가 변경되도록 구현
타일 편집 툴 구현하기
[CustomEditor(typeof(MapManager))]
public class MapManagerInspector : Editor
{
......
public void OnSceneGUI()
{
......
Event e = Event.current;
if( e.isKey )
{
if (e.character == ‘3') mapManager._editTileStyle = TILESTYLE.NORMAL;
else if (e.character == ‘4') mapManager._editTileStyle = TILESTYLE.STRAIGHT;
else if (e.character == ‘5') mapManager._editTileStyle = TILESTYLE.CORNER;
else if (e.character == ‘6') mapManager._editTileStyle = TILESTYLE.START;
else if (e.character == ‘7') mapManager._editTileStyle = TILESTYLE.END;
}
if( e.type == EventType.mouseDown || e.type == EventType.mouseDrag )
{
......
}
}
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
경로 설정용 Path툴 구현하기
[ MapManager ] 클래스에 다음과 같이 선언
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class MapManager : MonoBehaviour
{
......
public List<Transform> _pathList = new List<Transform>();
}
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
Shift 버튺을 누르고 있는 상태로 마우스 클릭을 하면 경로를 추가/삭제 기능 구현
경로 설정용 Path툴 구현하기
......
public void OnSceneGUI()
{
......
Event e = Event.current;
if( e.type == EventType.mouseDown ||
e.type == EventType.mouseDrag )
{
......
if( e.button == 0 ) // left click button
{
if( e.shift )
{
if (mapManager._pathList.Contains( hit.transform ) == false)
mapManager._pathList.Add( hit.transform );
}
else
{
tileInfo.currentTileStyle = mapManager._editTileStyle;
tileInfo.UpdateMaterial();
}
}
else if( e.button == 1 ) // right click button
{
if (e.shift)
{
if (mapManager._pathList.Contains( hit.transform ) == true)
mapManager._pathList.Remove( hit.transform );
}
else
{
if( e.type == EventType.mouseDown )
hit.transform.localEulerAngles +=
new Vector3( 0.0f, 90.0f, 0.0f );
}
}
......
}
}
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
맵을 제거할 때 Path도 제거되도록 구현
경로 설정용 Path툴 구현하기
public class MapManager : MonoBehavior
{
......
public void RemoveAllTiles()
{
......
_pathList.Clear();
}
......
}
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
경로 설정용 Path툴 구현하기
경로의 흐름을 파악할 수 있도록 시각적인 표현을 위한 구현
......
public void OnSceneGUI()
{
MapManager mapManager = target as MapManager;
......
DrawPathList( mapManager );
}
void DrawPathList(MapManager mapManager)
{
for (int i = 0; i < mapManager._pathList.Count; ++i)
{
Transform obj = mapManager._pathList[i];
TileInfo tileInfo = obj.GetComponent<TileInfo>();
if ( tileInfo.currentTileStyle == TILESTYLE.START )
{
Handles.color = Color.green;
}
else if ( tileInfo.currentTileStyle == TILESTYLE.END )
{
Handles.color = Color.red;
}
Handles.SphereCap( i, obj.position + Vector3.up * 0.5f, obj.rotation, 0.5f );
Handles.color = Color.white;
} // End of for (… )
if (mapManager._pathList.Count > 1)
{
Handles.color = Color.magenta;
for (int i = 0; i < mapManager._pathList.Count – 1 ; ++i)
{
Transform obj1 = mapManager._pathList[i];
Transform obj2 = mapManager._pathList[i + 1];
Vector3 pos1 = obj1.position + Vector3.up * 0.5f;
Vector3 pos2 = obj2.position + Vector3.up * 0.5f;
Handles.DrawLine( pos1, pos2 );
}
Handles.color = Color.white;
}
}
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
경로 설정용 Path툴 구현하기
시각적으로 표현된 경로 흐름
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
인스펙터 뷰에서의
데이터 확인을 위한 구현
경로 설정용 Path툴 구현하기
public class MapManagerInspector : Editor
{
public override void OnInspectorGUI()
{
MapManager mapManager = target as MapManager;
......
CommonEditorUi.DrawSeparator(Color.cyan);
DrawPathData(mapManager);
CommonEditorUi.DrawSeparator(Color.cyan);
ShowTiles(mapManager);
}
void DrawPathData( MapManager mapManager )
{
if (GUILayout.Button("Remove All Path Data"))
{
mapManager._pathList.Clear();
}
string pathLabel = "Path List : " + mapManager._pathList.Count;
EditorGUILayout.LabelField( pathLabel );
for (int i = 0; i < mapManager._pathList.Count; ++i)
{
string pathName = "Path Index : " + i;
Transform pathTransform = mapManager._pathList[i];
EditorGUILayout.ObjectField(pathName, pathTransform,
typeof(GameObject));
}
}
}
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
PathData 정보 확인
경로 설정용 Path툴 구현하기
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
맵 데이터 저장/로드 하기
[ MapManager ] 클래스에 맵 데이터를 저장할 때 사용할
파일의 이름의 string 변수 선언
public class MapManager : MonoBehaviour
{
......
public string _fileName = "Map";
}
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
저장할 파일 이름을 편집할 수 있는 문자열 편집 기능과 저장/읽기 버튺 구현
맵 데이터 저장/로드 하기
public class MapManagerInspector : Editor
{
public override void OnInspectorGUI()
{
MapManager mapManager = target as MapManager;
......
DrawGenerateButton(mapManager);
CommonEditorUi.DrawSeparator(Color.cyan);
DrawSaveLoadButton(mapManager);
......
}
void DrawSaveLoadButton( MapManager mapManager )
{
string fileName = EditorGUILayout.TextField("Map File Name",
mapManager._fileName);
if (fileName != mapManager._fileName)
{
CommonEditorUi.RegisterUndo("Map File Name", mapManager);
mapManager._fileName = fileName;
}
EditorGUILayout.BeginHorizontal();
if (GUILayout.Button("Save Map Data"))
{
//Save Process
}
if (GUILayout.Button("Load Map Data"))
{
// Load Process
}
EditorGUILayout.EndHorizontal();
}
}
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
맵 데이터 저장/로드 하기
……
using System.IO;
public class MapManagerInspector : Editor
{
......
void DrawSaveLoadButton( MapManager mapManager )
{
......
if( GUILayout.Button("Save Map Data") )
{
string title = "Save Map File‚;
string msg = ‚Do you want to save map data?‚;
if (EditorUtility.DisplayDialog(title , msg, "yes", "no") == false)
return;
string dataPath = Application.dataPath;
string fullPath = dataPath + "/Resources/MapData/" +
fileName + ".txt";
FileStream fs = new FileStream(fullPath, FileMode.Create);
TextWriter textWriter = new StreamWriter(fs);
int width = mapManager._currentWidth;
int height = mapManager._currentHeight;
textWriter.Write("width " + width + "n");
textWriter.Write("height " + height + "n");
for (int i = 0; i < width; ++i)
{
for (int j = 0; j < height; ++j)
{
Transform tile = mapManager._tiles[i, j].transform;
textWriter.Write(tile.position + "t");
textWriter.Write(tile.eulerAngles + "t");
TileInfo tileInfo = tile.GetComponent<TileInfo>();
textWriter.Write((int)tileInfo.currentTileStyle + "t");
textWriter.Write("n");
}
} // End of for( int i = 0 ...
// save path
int pathCount = mapManager._pathList.Count;
textWriter.Write("PathCount " + pathCount + "n");
for (int i = 0; i < pathCount; ++i)
{
string[] tileIndex = mapManager._pathList[i].name.Split('_');
textWriter.Write(tileIndex[0] + "t");
textWriter.Write(tileIndex[1]);
textWriter.Write("n");
}
textWriter.Close();
} // End of if( GUILayout.Button("Save Map Data") )
} // End of void DrawSaveLoadButton
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
파일 저장 구현
- 앆젂장치구현
맵 데이터 저장/로드 하기
public class MapManagerInspector : Editor
{
......
void DrawSaveLoadButton( MapManager mapManager )
{
......
if( GUILayout.Button("Save Map Data") )
{
……
textWriter.Close();
string backupPath = dataPath + "/Resources/MapData/" +
fileName + "_backup.txt";
if( File.Exists(backupPath) == false )
FileUtil.CopyFileOrDirectory(fullPath, backupPath);
AssetDatabase.Refresh();
}
// End of if( GUILayout.Button("Save Map Data") )
} // End of void DrawSaveLoadButton
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
파일을 저장될 [ Resources/MapData ] 폴더는 미리 생성해 줘야 함
맵 데이터 저장/로드 하기
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
타일의 가로/세로 정보와 각 타일 정보의 출력 모습
맵 데이터 저장/로드 하기
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
경로에 대한 정보의 출력 모습
맵 데이터 저장/로드 하기
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
유니티에서 제공하는 경로에 관한 내용
맵 데이터 저장/로드 하기
Application.persistentDataPath
Application.dataPath
Application.streamingAssetsPath
주소와 관련한 내용 참고 주소 :
1. UnityStudy.net
2. 개발자 블로그
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
[ MapManager ] 클래스 내에 파일로드 구현을 위한 함수 구현
맵 데이터 저장/로드 하기
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.IO;
public class MapManager : MonoBehaviour
{
......
// (1, 2, 3) 이라는 문자열을 Vector3값으로 변경해 주는 함수
public Vector3 GetVector3FromString(string text)
{
string newText = text.Replace( '(', ' ' ); // '(' 문자를 ‘ ’문자로 변경
newText = newText.Replace( ')', ' ' ); // ')' 문자를 ‘ ’문자로 변경
string[] datas = newText.Split( ',' ); // ',' 문자를 기준으로 값 분리
float x = float.Parse( datas[0] ); // 각각의 숫자를 x, y, z로 변환
float y = float.Parse( datas[1] );
float z = float.Parse( datas[2] );
return new Vector3(x, y, z);
}
}
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
[ MapManager ] 클래스 내에 파일로드 구현
맵 데이터 저장/로드 하기
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.IO;
public class MapManager : MonoBehaviour
{
......
public void LoadMapDataFromFile()
{
RemoveAllTiles();
string filePath = "MapData/" + _fileName;
TextAsset asset = (TextAsset)Resources.Load(
filePath, typeof(TextAsset) );
if (asset == null)
{
Debug.Log("Can not open file on Assets/" + filePath + ".txt");
return;
}
//Stream stream = new MemoryStream(asset.bytes);
//TextReader textReader = new StreamReader(stream);
TextReader textReader = new StringReader(asset.text);
// read width
string text = textReader.ReadLine();
string widthText = text.Substring( text.IndexOf(' ') + 1 );
_currentWidth = int.Parse( widthText );
// read height
text = textReader.ReadLine();
string heightText = text.Substring( text.IndexOf(' ') + 1 );
_currentHeight = int.Parse( heightText );
......
}
} // End of LoadMapDataFromFile()
}
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
타일의 정보 읽어오는
기능 구현
맵 데이터 저장/로드 하기
public class MapManager : MonoBehaviour
{
......
public void LoadMapDataFromFile()
{
......
// create map
_tiles = new GameObject[_currentWidth, _currentHeight];
for (int i = 0; i < _currentWidth; ++i)
{
for (int j = 0; j < _currentHeight; ++j)
{
text = textReader.ReadLine();
string[] infos = text.Split('t');
GameObject obj = Instantiate(_baseTilePrefab) as GameObject;
obj.name = i + "_" + j;
obj.transform.parent = transform;
obj.transform.localPosition = GetVector3FromString( infos[0] );
obj.transform.eulerAngles = GetVector3FromString( infos[1] );
TileInfo tileInfo = obj.GetComponent<TileInfo>();
tileInfo.currentTileStyle = (TILESTYLE)( int.Parse( infos[2] ) );
tileInfo.UpdateMaterial();
_tiles[i, j] = obj;
}
}
......
} // End of LoadMapDataFromFile()
}
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
경로 정보 읽어오는
기능 구현
맵 데이터 저장/로드 하기
public class MapManager : MonoBehaviour
{
......
public void LoadMapDataFromFile()
{
......
// load path
text = textReader.ReadLine();
string pathCountText = text.Substring(text.IndexOf(‘ '));
int pathCount = int.Parse(pathCountText);
for (int i = 0; i < pathCount; ++i)
{
text = textReader.ReadLine();
string[] tiles = text.Split('t');
int x = int.Parse(tiles[0]);
int y = int.Parse(tiles[1]);
_pathList.Add( _tiles[x, y].transform );
}
} // End of LoadMapDataFromFile()
}
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
경로를 실제 읽어올 수 있도록 함수 호출 구문 추가
맵 데이터 저장/로드 하기
public class MapManagerInspector : Editor
{
void DrawSaveLoadButton( MapManager mapManager )
{
EditorGUILayout.BeginHorizontal();
if (GUILayout.Button("Save Map Data"))
{
//Save Process
……
}
if (GUILayout.Button("Load Map Data"))
{
// Load Process
mapManager.LoadMapDataFromFile();
}
EditorGUILayout.EndHorizontal();
}
}
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
맵 데이터 저장/로드 하기
void RepairMapTilesProcess(MapManager mapManager)
{
if( mapManager._tiles != null )
return;
int maxX = -1000;
int maxY = -1000;
int count = 0;
foreach( Transform child in mapManager.transform )
{
string name = child.name;
string[] tile = name.Split('_');
int currentX = int.Parse( tile[0] );
int currentY = int.Parse( tile[1] );
maxX = Mathf.Max( currentX, maxX );
maxY = Mathf.Max( currentY, maxY );
++count;
}
++maxX;
++maxY;
if( count != maxX*maxY)
{
EditorUtility.DisplayDialog("Notice", "I can not repair your map. Sorry...",
"OK");
return;
}
mapManager._tiles = new GameObject[maxX, maxY];
foreach( Transform child in mapManager.transform )
{
string name = child.name;
string[] tile = name.Split('_');
int currentX = int.Parse( tile[0] );
int currentY = int.Parse( tile[1] );
mapManager._tiles[currentX, currentY] = child.gameObject;
}
}
본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다.
경로를 실제 읽어올 수 있도록 함수 호출 구문 추가
맵 데이터 복구하기
public class MapManagerInspector : Editor
{
public override void OnInspectorGUI()
{
MapManager mapManager = target as MapManager;
......
CommonEditorUi.DrawSeparator( Color.cyan );
if( GUILayout.Button("Repair Map Tiles" ) )
{
RepairMapTilesProcess(mapManager);
}
}

More Related Content

What's hot

[NDC_16] 캐릭터 한 달에 하나씩 업데이트 하기 : '최강의 군단' 스킬 개발 툴 포스트 모템과 차기작 '건파이트 맨션' 툴 프리뷰
[NDC_16] 캐릭터 한 달에 하나씩 업데이트 하기 : '최강의 군단' 스킬 개발 툴 포스트 모템과 차기작 '건파이트 맨션' 툴 프리뷰[NDC_16] 캐릭터 한 달에 하나씩 업데이트 하기 : '최강의 군단' 스킬 개발 툴 포스트 모템과 차기작 '건파이트 맨션' 툴 프리뷰
[NDC_16] 캐릭터 한 달에 하나씩 업데이트 하기 : '최강의 군단' 스킬 개발 툴 포스트 모템과 차기작 '건파이트 맨션' 툴 프리뷰
승민 백
 
게임 시스템 디자인 시작하기
게임 시스템 디자인 시작하기게임 시스템 디자인 시작하기
게임 시스템 디자인 시작하기
ByungChun2
 
인디 게임을 개발하는 여러 가지 방법들
인디 게임을 개발하는 여러 가지 방법들인디 게임을 개발하는 여러 가지 방법들
인디 게임을 개발하는 여러 가지 방법들springgames
 
[NDC 2021] 게임 PD가 되어 보니
[NDC 2021] 게임 PD가 되어 보니[NDC 2021] 게임 PD가 되어 보니
[NDC 2021] 게임 PD가 되어 보니
Yongha Kim
 
<쿠키런:오븐브레이크> 길드탐험 및 방랑박쥐상점 컨텐츠 역기획서
<쿠키런:오븐브레이크> 길드탐험 및 방랑박쥐상점 컨텐츠 역기획서<쿠키런:오븐브레이크> 길드탐험 및 방랑박쥐상점 컨텐츠 역기획서
<쿠키런:오븐브레이크> 길드탐험 및 방랑박쥐상점 컨텐츠 역기획서
LEE JONGCHANG
 
게임 기획 튜토리얼 (2015 개정판)
게임 기획 튜토리얼 (2015 개정판)게임 기획 튜토리얼 (2015 개정판)
게임 기획 튜토리얼 (2015 개정판)
Lee Sangkyoon (Kay)
 
모바일 게임기획 따라하며 배우기
모바일 게임기획 따라하며 배우기모바일 게임기획 따라하며 배우기
모바일 게임기획 따라하며 배우기
Sunnyrider
 
[NDC2019] 전소현&장기은 - 시나리오 기획자는 대사만 잘쓰면 되는 거 아닌가요? ㅇㅅㅇ
[NDC2019] 전소현&장기은 - 시나리오 기획자는 대사만 잘쓰면 되는 거 아닌가요? ㅇㅅㅇ[NDC2019] 전소현&장기은 - 시나리오 기획자는 대사만 잘쓰면 되는 거 아닌가요? ㅇㅅㅇ
[NDC2019] 전소현&장기은 - 시나리오 기획자는 대사만 잘쓰면 되는 거 아닌가요? ㅇㅅㅇ
Kieun Jang
 
ゲームAI入門(前半)
ゲームAI入門(前半)ゲームAI入門(前半)
ゲームAI入門(前半)
Youichiro Miyake
 
그럴듯한 랜덤 생성 컨텐츠 만들기
그럴듯한 랜덤 생성 컨텐츠 만들기그럴듯한 랜덤 생성 컨텐츠 만들기
그럴듯한 랜덤 생성 컨텐츠 만들기
Yongha Kim
 
게임 스타트업 시작하기
게임 스타트업 시작하기게임 스타트업 시작하기
게임 스타트업 시작하기
기룡 남
 
클라우드 기반 Unity 게임 서버 구축, 60분이면 충분하다
클라우드 기반 Unity 게임 서버 구축, 60분이면 충분하다클라우드 기반 Unity 게임 서버 구축, 60분이면 충분하다
클라우드 기반 Unity 게임 서버 구축, 60분이면 충분하다
Dae Kim
 
확률의 구현법
확률의 구현법확률의 구현법
확률의 구현법
 
NDC 2012 이은석 - 게임회사 취업특강 (커리어세션)
NDC 2012 이은석 - 게임회사 취업특강 (커리어세션)NDC 2012 이은석 - 게임회사 취업특강 (커리어세션)
NDC 2012 이은석 - 게임회사 취업특강 (커리어세션)
Eunseok Yi
 
[IGC 2017] 블루홀 최준혁 - '플레이어언노운스 배틀그라운드' DEV 스토리
[IGC 2017] 블루홀 최준혁 - '플레이어언노운스 배틀그라운드' DEV 스토리[IGC 2017] 블루홀 최준혁 - '플레이어언노운스 배틀그라운드' DEV 스토리
[IGC 2017] 블루홀 최준혁 - '플레이어언노운스 배틀그라운드' DEV 스토리
강 민우
 
메이플2 하우징시스템 역기획서
메이플2 하우징시스템 역기획서메이플2 하우징시스템 역기획서
메이플2 하우징시스템 역기획서
Eui hwan Hyeon
 
캔디크러시사가 레벨디자인 분석
캔디크러시사가 레벨디자인 분석캔디크러시사가 레벨디자인 분석
캔디크러시사가 레벨디자인 분석Hyungyu Kang
 
쩌는게임기획서 이렇게 쓴다
쩌는게임기획서 이렇게 쓴다쩌는게임기획서 이렇게 쓴다
쩌는게임기획서 이렇게 쓴다
Jinho Jung
 
[IGC2018] 이락디지털문화연구소 남기덕 - 게임 디자인의 시작, 테마
[IGC2018] 이락디지털문화연구소 남기덕 - 게임 디자인의 시작, 테마[IGC2018] 이락디지털문화연구소 남기덕 - 게임 디자인의 시작, 테마
[IGC2018] 이락디지털문화연구소 남기덕 - 게임 디자인의 시작, 테마
강 민우
 
NDC2011 - 절차적 지형과 트렌드의 추적자들
NDC2011 - 절차적 지형과 트렌드의 추적자들NDC2011 - 절차적 지형과 트렌드의 추적자들
NDC2011 - 절차적 지형과 트렌드의 추적자들Jubok Kim
 

What's hot (20)

[NDC_16] 캐릭터 한 달에 하나씩 업데이트 하기 : '최강의 군단' 스킬 개발 툴 포스트 모템과 차기작 '건파이트 맨션' 툴 프리뷰
[NDC_16] 캐릭터 한 달에 하나씩 업데이트 하기 : '최강의 군단' 스킬 개발 툴 포스트 모템과 차기작 '건파이트 맨션' 툴 프리뷰[NDC_16] 캐릭터 한 달에 하나씩 업데이트 하기 : '최강의 군단' 스킬 개발 툴 포스트 모템과 차기작 '건파이트 맨션' 툴 프리뷰
[NDC_16] 캐릭터 한 달에 하나씩 업데이트 하기 : '최강의 군단' 스킬 개발 툴 포스트 모템과 차기작 '건파이트 맨션' 툴 프리뷰
 
게임 시스템 디자인 시작하기
게임 시스템 디자인 시작하기게임 시스템 디자인 시작하기
게임 시스템 디자인 시작하기
 
인디 게임을 개발하는 여러 가지 방법들
인디 게임을 개발하는 여러 가지 방법들인디 게임을 개발하는 여러 가지 방법들
인디 게임을 개발하는 여러 가지 방법들
 
[NDC 2021] 게임 PD가 되어 보니
[NDC 2021] 게임 PD가 되어 보니[NDC 2021] 게임 PD가 되어 보니
[NDC 2021] 게임 PD가 되어 보니
 
<쿠키런:오븐브레이크> 길드탐험 및 방랑박쥐상점 컨텐츠 역기획서
<쿠키런:오븐브레이크> 길드탐험 및 방랑박쥐상점 컨텐츠 역기획서<쿠키런:오븐브레이크> 길드탐험 및 방랑박쥐상점 컨텐츠 역기획서
<쿠키런:오븐브레이크> 길드탐험 및 방랑박쥐상점 컨텐츠 역기획서
 
게임 기획 튜토리얼 (2015 개정판)
게임 기획 튜토리얼 (2015 개정판)게임 기획 튜토리얼 (2015 개정판)
게임 기획 튜토리얼 (2015 개정판)
 
모바일 게임기획 따라하며 배우기
모바일 게임기획 따라하며 배우기모바일 게임기획 따라하며 배우기
모바일 게임기획 따라하며 배우기
 
[NDC2019] 전소현&장기은 - 시나리오 기획자는 대사만 잘쓰면 되는 거 아닌가요? ㅇㅅㅇ
[NDC2019] 전소현&장기은 - 시나리오 기획자는 대사만 잘쓰면 되는 거 아닌가요? ㅇㅅㅇ[NDC2019] 전소현&장기은 - 시나리오 기획자는 대사만 잘쓰면 되는 거 아닌가요? ㅇㅅㅇ
[NDC2019] 전소현&장기은 - 시나리오 기획자는 대사만 잘쓰면 되는 거 아닌가요? ㅇㅅㅇ
 
ゲームAI入門(前半)
ゲームAI入門(前半)ゲームAI入門(前半)
ゲームAI入門(前半)
 
그럴듯한 랜덤 생성 컨텐츠 만들기
그럴듯한 랜덤 생성 컨텐츠 만들기그럴듯한 랜덤 생성 컨텐츠 만들기
그럴듯한 랜덤 생성 컨텐츠 만들기
 
게임 스타트업 시작하기
게임 스타트업 시작하기게임 스타트업 시작하기
게임 스타트업 시작하기
 
클라우드 기반 Unity 게임 서버 구축, 60분이면 충분하다
클라우드 기반 Unity 게임 서버 구축, 60분이면 충분하다클라우드 기반 Unity 게임 서버 구축, 60분이면 충분하다
클라우드 기반 Unity 게임 서버 구축, 60분이면 충분하다
 
확률의 구현법
확률의 구현법확률의 구현법
확률의 구현법
 
NDC 2012 이은석 - 게임회사 취업특강 (커리어세션)
NDC 2012 이은석 - 게임회사 취업특강 (커리어세션)NDC 2012 이은석 - 게임회사 취업특강 (커리어세션)
NDC 2012 이은석 - 게임회사 취업특강 (커리어세션)
 
[IGC 2017] 블루홀 최준혁 - '플레이어언노운스 배틀그라운드' DEV 스토리
[IGC 2017] 블루홀 최준혁 - '플레이어언노운스 배틀그라운드' DEV 스토리[IGC 2017] 블루홀 최준혁 - '플레이어언노운스 배틀그라운드' DEV 스토리
[IGC 2017] 블루홀 최준혁 - '플레이어언노운스 배틀그라운드' DEV 스토리
 
메이플2 하우징시스템 역기획서
메이플2 하우징시스템 역기획서메이플2 하우징시스템 역기획서
메이플2 하우징시스템 역기획서
 
캔디크러시사가 레벨디자인 분석
캔디크러시사가 레벨디자인 분석캔디크러시사가 레벨디자인 분석
캔디크러시사가 레벨디자인 분석
 
쩌는게임기획서 이렇게 쓴다
쩌는게임기획서 이렇게 쓴다쩌는게임기획서 이렇게 쓴다
쩌는게임기획서 이렇게 쓴다
 
[IGC2018] 이락디지털문화연구소 남기덕 - 게임 디자인의 시작, 테마
[IGC2018] 이락디지털문화연구소 남기덕 - 게임 디자인의 시작, 테마[IGC2018] 이락디지털문화연구소 남기덕 - 게임 디자인의 시작, 테마
[IGC2018] 이락디지털문화연구소 남기덕 - 게임 디자인의 시작, 테마
 
NDC2011 - 절차적 지형과 트렌드의 추적자들
NDC2011 - 절차적 지형과 트렌드의 추적자들NDC2011 - 절차적 지형과 트렌드의 추적자들
NDC2011 - 절차적 지형과 트렌드의 추적자들
 

Viewers also liked

[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리
[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리
[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리
MinGeun Park
 
A4.애니메이션
A4.애니메이션A4.애니메이션
A4.애니메이션
Unitylearningcenter
 
S2.linq
S2.linqS2.linq
중학생이라도 게임이 만들고싶어! -1- 유니티 바라보기!
중학생이라도 게임이 만들고싶어! -1- 유니티 바라보기!중학생이라도 게임이 만들고싶어! -1- 유니티 바라보기!
중학생이라도 게임이 만들고싶어! -1- 유니티 바라보기!
태양 최
 
Unity3D 에디터 확장
Unity3D 에디터 확장Unity3D 에디터 확장
Unity3D 에디터 확장Heechan Park
 
SVVR아카데미 3월 교육과정 소개
SVVR아카데미 3월 교육과정 소개SVVR아카데미 3월 교육과정 소개
SVVR아카데미 3월 교육과정 소개
Unitylearningcenter
 
중학생이라도 게임이 만들고싶어! -3- 캐릭터를 조작 해보자 !
중학생이라도 게임이 만들고싶어! -3- 캐릭터를 조작 해보자 !중학생이라도 게임이 만들고싶어! -3- 캐릭터를 조작 해보자 !
중학생이라도 게임이 만들고싶어! -3- 캐릭터를 조작 해보자 !
태양 최
 
SVVR아카데미 4월과정 소개_0317
SVVR아카데미 4월과정 소개_0317SVVR아카데미 4월과정 소개_0317
SVVR아카데미 4월과정 소개_0317
Unitylearningcenter
 
증강현실 게임개발
증강현실 게임개발증강현실 게임개발
증강현실 게임개발Junhee Han
 
증강현실을 통한 두더지 잡기 게임
증강현실을 통한 두더지 잡기 게임증강현실을 통한 두더지 잡기 게임
증강현실을 통한 두더지 잡기 게임
Junhee Han
 
P5.적(enemy) 구현하기
P5.적(enemy) 구현하기P5.적(enemy) 구현하기
P5.적(enemy) 구현하기
Unitylearningcenter
 
풀타임 개발 도전기
풀타임 개발 도전기풀타임 개발 도전기
풀타임 개발 도전기
Jungsoo Park
 
셰이더가 뭐에요?
셰이더가 뭐에요?셰이더가 뭐에요?
셰이더가 뭐에요?
Jungsoo Park
 
딥 다크 던전 그래픽 작업기
딥 다크 던전 그래픽 작업기딥 다크 던전 그래픽 작업기
딥 다크 던전 그래픽 작업기
Jungsoo Park
 
딥 다크 던전 그린라이트 도전기
딥 다크 던전 그린라이트 도전기딥 다크 던전 그린라이트 도전기
딥 다크 던전 그린라이트 도전기
Jungsoo Park
 
IEnumerator란 무엇인가?
IEnumerator란 무엇인가?IEnumerator란 무엇인가?
IEnumerator란 무엇인가?
Jungsoo Park
 
HTML5/JSON 을 이용해 범용 2D 맵에디터 제작하기
HTML5/JSON 을 이용해 범용 2D 맵에디터 제작하기HTML5/JSON 을 이용해 범용 2D 맵에디터 제작하기
HTML5/JSON 을 이용해 범용 2D 맵에디터 제작하기
Miyu Park
 
48시간, 복셀로 표현하기
48시간, 복셀로 표현하기48시간, 복셀로 표현하기
48시간, 복셀로 표현하기
Jungsoo Park
 
셰이더 만들기 실습
셰이더 만들기 실습셰이더 만들기 실습
셰이더 만들기 실습
Jungsoo Park
 
Unity 시작하기
Unity 시작하기Unity 시작하기
Unity 시작하기
Changwon National University
 

Viewers also liked (20)

[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리
[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리
[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리
 
A4.애니메이션
A4.애니메이션A4.애니메이션
A4.애니메이션
 
S2.linq
S2.linqS2.linq
S2.linq
 
중학생이라도 게임이 만들고싶어! -1- 유니티 바라보기!
중학생이라도 게임이 만들고싶어! -1- 유니티 바라보기!중학생이라도 게임이 만들고싶어! -1- 유니티 바라보기!
중학생이라도 게임이 만들고싶어! -1- 유니티 바라보기!
 
Unity3D 에디터 확장
Unity3D 에디터 확장Unity3D 에디터 확장
Unity3D 에디터 확장
 
SVVR아카데미 3월 교육과정 소개
SVVR아카데미 3월 교육과정 소개SVVR아카데미 3월 교육과정 소개
SVVR아카데미 3월 교육과정 소개
 
중학생이라도 게임이 만들고싶어! -3- 캐릭터를 조작 해보자 !
중학생이라도 게임이 만들고싶어! -3- 캐릭터를 조작 해보자 !중학생이라도 게임이 만들고싶어! -3- 캐릭터를 조작 해보자 !
중학생이라도 게임이 만들고싶어! -3- 캐릭터를 조작 해보자 !
 
SVVR아카데미 4월과정 소개_0317
SVVR아카데미 4월과정 소개_0317SVVR아카데미 4월과정 소개_0317
SVVR아카데미 4월과정 소개_0317
 
증강현실 게임개발
증강현실 게임개발증강현실 게임개발
증강현실 게임개발
 
증강현실을 통한 두더지 잡기 게임
증강현실을 통한 두더지 잡기 게임증강현실을 통한 두더지 잡기 게임
증강현실을 통한 두더지 잡기 게임
 
P5.적(enemy) 구현하기
P5.적(enemy) 구현하기P5.적(enemy) 구현하기
P5.적(enemy) 구현하기
 
풀타임 개발 도전기
풀타임 개발 도전기풀타임 개발 도전기
풀타임 개발 도전기
 
셰이더가 뭐에요?
셰이더가 뭐에요?셰이더가 뭐에요?
셰이더가 뭐에요?
 
딥 다크 던전 그래픽 작업기
딥 다크 던전 그래픽 작업기딥 다크 던전 그래픽 작업기
딥 다크 던전 그래픽 작업기
 
딥 다크 던전 그린라이트 도전기
딥 다크 던전 그린라이트 도전기딥 다크 던전 그린라이트 도전기
딥 다크 던전 그린라이트 도전기
 
IEnumerator란 무엇인가?
IEnumerator란 무엇인가?IEnumerator란 무엇인가?
IEnumerator란 무엇인가?
 
HTML5/JSON 을 이용해 범용 2D 맵에디터 제작하기
HTML5/JSON 을 이용해 범용 2D 맵에디터 제작하기HTML5/JSON 을 이용해 범용 2D 맵에디터 제작하기
HTML5/JSON 을 이용해 범용 2D 맵에디터 제작하기
 
48시간, 복셀로 표현하기
48시간, 복셀로 표현하기48시간, 복셀로 표현하기
48시간, 복셀로 표현하기
 
셰이더 만들기 실습
셰이더 만들기 실습셰이더 만들기 실습
셰이더 만들기 실습
 
Unity 시작하기
Unity 시작하기Unity 시작하기
Unity 시작하기
 

P4.맵 에디터 제작하기(2)

  • 1. 맵 에디터 제작하기 Copyright ⓒ 2014 Unity Technologies Korea All rights reserved. All contents cannot be copied without permission 중급 본 교재의 저작권은 유니티테크놀로지스코리아가 소유하고 있으며, 유니티 러닝센터 수강생만 교재를 볼 수 있습니다. 정당한 권리 없이 저작물을 복제, 젂송할 경우 그로 인하여 발생하는 손해를 배상하여야 함을 유념하시기 바랍니다.
  • 2. 타일 정보 구현하기 타일 편집 툴 구현하기 경로 설정용 Path툴 구현하기 맵 데이터 저장/로드 하기
  • 3. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다. 타일 정보 구현하기 디펜스 게임에서 타일이 가져야 할 정보들 1. 타일을 표현하는 이미지 정보 2. 타일의 속성(적이 이동하는 길인가?, 타워를 설치할 수 있는 위치인가? 3. 경로와 관련된 정보(시작 위치 및 목적 위치 그리고 이동 해야 할 위치) 4. 특수한 능력을 가지는 타일 타일은 적의 시작위치와, 끝 위치 그리고 경로를 표현해야 한다. 또한 경로가 아닌 곳을 표현할 수 있어야 한다. 타워는 경로가 아닌 곳에 설치할 수 있다.
  • 4. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다. 타일 정보 구현하기 게임에서 사용할 타일의 종류
  • 5. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다. 타일 정보 구현하기 5가지 타일을 이용하여 표현한 디펜스 게임의 경로
  • 6. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다. 타일 정보 구현하기 이미지가 가짂 정보를 저장하기 위해 [ TILESTYLE ] 열거형을 Enum.cs 파일에 선언 using UnityEngine; using System.Collections; public enum TILESTYLE { NORMAL = 0, STRAIGHT, CORNER, START, END, }
  • 7. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다. 타일 정보 구현하기 타일의 정보를 적용하기 위해 [ TileInfo ] 스크립트를 생성 후 구현 using UnityEngine; using System.Collections; public class TileInfo : MonoBehaviour { public TILESTYLE currentTileStyle; public Material[] tileMaterials; public void UpdateMaterial() { renderer.material = tileMaterials[ (int)currentTileStyle ]; } }
  • 8. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다. 타일 정보 구현하기 [ 직선타일 ] 이미지를 넣었을 때의 상황
  • 9. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다. 타일 정보 구현하기 [ TileInfo ] 스크립트를 tile 프리팹에 추가하고 마테리얼 5종 생성 후 이름을 다음과 같이 설정
  • 10. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다. 타일 정보 구현하기 [ TILESTYLE ] 순서에 맞게 [ Tile Materials ]에 마테리얼 설정 using UnityEngine; using System.Collections; public enum TILESTYLE { NORMAL = 0, STRAIGHT, CORNER, START, END, }
  • 11. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다. 타일 정보 구현하기 [ MapManagerInspector ] 클래스의 [ CreateTiles ] 함수 부분에 기능 추가 public class MapManagerInspector : Editor { ...... public void CreateTiles(MapManager mapManager) { ...... for (int i = 0; i < width; ++i) { for (int j = 0; j < height; ++j) { ...... TileInfo tileInfo = mapManager._tiles[ i, j ].GetComponent<TileInfo>(); tileInfo.UpdateMaterial(); } } } }
  • 12. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다. [ Tile ] 프리팹에 있는 Current Tile Style의 값을 ‘STRAIGHT’로 교체 타일 정보 구현하기
  • 13. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다. 타일 정보 구현하기
  • 14. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다. 타일 편집 툴 구현하기 [ MapManager ] 클래스에 [ _editTileStyle ] 변수 추가 using UnityEngine; using System.Collections; public class MapManager : MonoBehaviour { public TILESTYLE _editTileStyle = TILESTYLE.NORMAL; ...... }
  • 15. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다. 타일 편집 툴 구현하기 [CustomEditor(typeof(MapManager))] public class MapManagerInspector : Editor { ...... public void OnSceneGUI() { if( Application.isPlaying ) return; MapManager mapManager = target as MapManager; Handles.BeginGUI(); if (GUI.Button(new Rect(10, 10, 100, 30), "Normal")) { mapManager._editTileStyle = TILESTYLE.NORMAL; } if (GUI.Button(new Rect(10, 50, 100, 30), "Straight")) { mapManager._editTileStyle = TILESTYLE.STRAIGHT; } if (GUI.Button(new Rect(10, 90, 100, 30), "Corner")) { mapManager._editTileStyle = TILESTYLE.CORNER; } if (GUI.Button(new Rect(10, 130, 100, 30), "Start")) { mapManager._editTileStyle = TILESTYLE.START; } if (GUI.Button(new Rect(10, 170, 100, 30), "End")) { mapManager._editTileStyle = TILESTYLE.END; } GUI.color = Color.green; GUI.Label(new Rect(120, 10, 500, 30), "Edit Mode : " + mapManager._editTileStyle); GUI.color = Color.white; Handles.EndGUI(); } }
  • 16. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다. [ MapManager ]를 선택하면 구현한 내용이 반영되어 GUI가 씬 뷰에 출력되는 것 확인 타일 편집 툴 구현하기
  • 17. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다. 특정 타일을 오른쪽 버튺 클릭 후 회젂하기 위해 타일 프리팹에 레이 케스팅에 의한 충돌검출을 하기 위한 박스 충돌체(Box Collider)를 추가 타일 편집 툴 구현하기
  • 18. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다. 씬에 배치된 [ SpaceFloor ] 오브젝트에 붙어있는 박스 충돌체는 제거한 후, 씬 뷰에서 오브젝트 선택 후 타일 값을 변경하는 코드를 구현 타일 편집 툴 구현하기 [CustomEditor(typeof(MapManager))] public class MapManagerInspector : Editor { ...... public void OnSceneGUI() { ...... Event e = Event.current; if( e.type == EventType.mouseDown ) { Vector2 mousePosition = e.mousePosition; Ray ray = HandleUtility.GUIPointToWorldRay( mousePosition ); RaycastHit hit; bool result = Physics.Raycast(ray, out hit, 1000.0f); if (result) { GameObject tileObj = hit.transform.gameObject; TileInfo tileInfo = tileObj.GetComponent<TileInfo>(); if( tileInfo == null ) return; if (e.button == 0) // left click button { tileInfo.currentTileStyle = mapManager._editTileStyle; tileInfo.UpdateMaterial(); } else if (e.button == 1) // right click button { hit.transform.localEulerAngles += new Vector3( 0.0f, 90.0f, 0.0f ); } } } } }
  • 19. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다. 인스펙터 뷰의 잠김 상태 확인 타일 편집 툴 구현하기
  • 20. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다. 타일 편집 기능으로 생성한 레벨의 모습 타일 편집 툴 구현하기
  • 21. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다. 마우스 드래그로 변경할 수 있도록 구현 타일 편집 툴 구현하기 [CustomEditor(typeof(MapManager))] public class MapManagerInspector : Editor { ...... public void OnSceneGUI() { ...... int controlID = GUIUtility.GetControlID(FocusType.Passive); HandleUtility.AddDefaultControl( controlID ); Event e = Event.current; if( e.type == EventType.mouseDown || e.type == EventType.mouseDrag ) { if ( e.alt ) { return; } ...... } // End of OnSceneGUI }
  • 22. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다. 키보드 3~7번까지의 키를 눌렀을 때 타일의 정보가 변경되도록 구현 타일 편집 툴 구현하기 [CustomEditor(typeof(MapManager))] public class MapManagerInspector : Editor { ...... public void OnSceneGUI() { ...... Event e = Event.current; if( e.isKey ) { if (e.character == ‘3') mapManager._editTileStyle = TILESTYLE.NORMAL; else if (e.character == ‘4') mapManager._editTileStyle = TILESTYLE.STRAIGHT; else if (e.character == ‘5') mapManager._editTileStyle = TILESTYLE.CORNER; else if (e.character == ‘6') mapManager._editTileStyle = TILESTYLE.START; else if (e.character == ‘7') mapManager._editTileStyle = TILESTYLE.END; } if( e.type == EventType.mouseDown || e.type == EventType.mouseDrag ) { ...... } }
  • 23. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다. 경로 설정용 Path툴 구현하기 [ MapManager ] 클래스에 다음과 같이 선언 using UnityEngine; using System.Collections; using System.Collections.Generic; public class MapManager : MonoBehaviour { ...... public List<Transform> _pathList = new List<Transform>(); }
  • 24. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다. Shift 버튺을 누르고 있는 상태로 마우스 클릭을 하면 경로를 추가/삭제 기능 구현 경로 설정용 Path툴 구현하기 ...... public void OnSceneGUI() { ...... Event e = Event.current; if( e.type == EventType.mouseDown || e.type == EventType.mouseDrag ) { ...... if( e.button == 0 ) // left click button { if( e.shift ) { if (mapManager._pathList.Contains( hit.transform ) == false) mapManager._pathList.Add( hit.transform ); } else { tileInfo.currentTileStyle = mapManager._editTileStyle; tileInfo.UpdateMaterial(); } } else if( e.button == 1 ) // right click button { if (e.shift) { if (mapManager._pathList.Contains( hit.transform ) == true) mapManager._pathList.Remove( hit.transform ); } else { if( e.type == EventType.mouseDown ) hit.transform.localEulerAngles += new Vector3( 0.0f, 90.0f, 0.0f ); } } ...... } }
  • 25. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다. 맵을 제거할 때 Path도 제거되도록 구현 경로 설정용 Path툴 구현하기 public class MapManager : MonoBehavior { ...... public void RemoveAllTiles() { ...... _pathList.Clear(); } ...... }
  • 26. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다. 경로 설정용 Path툴 구현하기 경로의 흐름을 파악할 수 있도록 시각적인 표현을 위한 구현 ...... public void OnSceneGUI() { MapManager mapManager = target as MapManager; ...... DrawPathList( mapManager ); } void DrawPathList(MapManager mapManager) { for (int i = 0; i < mapManager._pathList.Count; ++i) { Transform obj = mapManager._pathList[i]; TileInfo tileInfo = obj.GetComponent<TileInfo>(); if ( tileInfo.currentTileStyle == TILESTYLE.START ) { Handles.color = Color.green; } else if ( tileInfo.currentTileStyle == TILESTYLE.END ) { Handles.color = Color.red; } Handles.SphereCap( i, obj.position + Vector3.up * 0.5f, obj.rotation, 0.5f ); Handles.color = Color.white; } // End of for (… ) if (mapManager._pathList.Count > 1) { Handles.color = Color.magenta; for (int i = 0; i < mapManager._pathList.Count – 1 ; ++i) { Transform obj1 = mapManager._pathList[i]; Transform obj2 = mapManager._pathList[i + 1]; Vector3 pos1 = obj1.position + Vector3.up * 0.5f; Vector3 pos2 = obj2.position + Vector3.up * 0.5f; Handles.DrawLine( pos1, pos2 ); } Handles.color = Color.white; } }
  • 27. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다. 경로 설정용 Path툴 구현하기 시각적으로 표현된 경로 흐름
  • 28. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다. 인스펙터 뷰에서의 데이터 확인을 위한 구현 경로 설정용 Path툴 구현하기 public class MapManagerInspector : Editor { public override void OnInspectorGUI() { MapManager mapManager = target as MapManager; ...... CommonEditorUi.DrawSeparator(Color.cyan); DrawPathData(mapManager); CommonEditorUi.DrawSeparator(Color.cyan); ShowTiles(mapManager); } void DrawPathData( MapManager mapManager ) { if (GUILayout.Button("Remove All Path Data")) { mapManager._pathList.Clear(); } string pathLabel = "Path List : " + mapManager._pathList.Count; EditorGUILayout.LabelField( pathLabel ); for (int i = 0; i < mapManager._pathList.Count; ++i) { string pathName = "Path Index : " + i; Transform pathTransform = mapManager._pathList[i]; EditorGUILayout.ObjectField(pathName, pathTransform, typeof(GameObject)); } } }
  • 29. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다. PathData 정보 확인 경로 설정용 Path툴 구현하기
  • 30. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다. 맵 데이터 저장/로드 하기 [ MapManager ] 클래스에 맵 데이터를 저장할 때 사용할 파일의 이름의 string 변수 선언 public class MapManager : MonoBehaviour { ...... public string _fileName = "Map"; }
  • 31. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다. 저장할 파일 이름을 편집할 수 있는 문자열 편집 기능과 저장/읽기 버튺 구현 맵 데이터 저장/로드 하기 public class MapManagerInspector : Editor { public override void OnInspectorGUI() { MapManager mapManager = target as MapManager; ...... DrawGenerateButton(mapManager); CommonEditorUi.DrawSeparator(Color.cyan); DrawSaveLoadButton(mapManager); ...... } void DrawSaveLoadButton( MapManager mapManager ) { string fileName = EditorGUILayout.TextField("Map File Name", mapManager._fileName); if (fileName != mapManager._fileName) { CommonEditorUi.RegisterUndo("Map File Name", mapManager); mapManager._fileName = fileName; } EditorGUILayout.BeginHorizontal(); if (GUILayout.Button("Save Map Data")) { //Save Process } if (GUILayout.Button("Load Map Data")) { // Load Process } EditorGUILayout.EndHorizontal(); } }
  • 32. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다. 맵 데이터 저장/로드 하기 …… using System.IO; public class MapManagerInspector : Editor { ...... void DrawSaveLoadButton( MapManager mapManager ) { ...... if( GUILayout.Button("Save Map Data") ) { string title = "Save Map File‚; string msg = ‚Do you want to save map data?‚; if (EditorUtility.DisplayDialog(title , msg, "yes", "no") == false) return; string dataPath = Application.dataPath; string fullPath = dataPath + "/Resources/MapData/" + fileName + ".txt"; FileStream fs = new FileStream(fullPath, FileMode.Create); TextWriter textWriter = new StreamWriter(fs); int width = mapManager._currentWidth; int height = mapManager._currentHeight; textWriter.Write("width " + width + "n"); textWriter.Write("height " + height + "n"); for (int i = 0; i < width; ++i) { for (int j = 0; j < height; ++j) { Transform tile = mapManager._tiles[i, j].transform; textWriter.Write(tile.position + "t"); textWriter.Write(tile.eulerAngles + "t"); TileInfo tileInfo = tile.GetComponent<TileInfo>(); textWriter.Write((int)tileInfo.currentTileStyle + "t"); textWriter.Write("n"); } } // End of for( int i = 0 ... // save path int pathCount = mapManager._pathList.Count; textWriter.Write("PathCount " + pathCount + "n"); for (int i = 0; i < pathCount; ++i) { string[] tileIndex = mapManager._pathList[i].name.Split('_'); textWriter.Write(tileIndex[0] + "t"); textWriter.Write(tileIndex[1]); textWriter.Write("n"); } textWriter.Close(); } // End of if( GUILayout.Button("Save Map Data") ) } // End of void DrawSaveLoadButton
  • 33. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다. 파일 저장 구현 - 앆젂장치구현 맵 데이터 저장/로드 하기 public class MapManagerInspector : Editor { ...... void DrawSaveLoadButton( MapManager mapManager ) { ...... if( GUILayout.Button("Save Map Data") ) { …… textWriter.Close(); string backupPath = dataPath + "/Resources/MapData/" + fileName + "_backup.txt"; if( File.Exists(backupPath) == false ) FileUtil.CopyFileOrDirectory(fullPath, backupPath); AssetDatabase.Refresh(); } // End of if( GUILayout.Button("Save Map Data") ) } // End of void DrawSaveLoadButton
  • 34. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다. 파일을 저장될 [ Resources/MapData ] 폴더는 미리 생성해 줘야 함 맵 데이터 저장/로드 하기
  • 35. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다. 타일의 가로/세로 정보와 각 타일 정보의 출력 모습 맵 데이터 저장/로드 하기
  • 36. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다. 경로에 대한 정보의 출력 모습 맵 데이터 저장/로드 하기
  • 37. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다. 유니티에서 제공하는 경로에 관한 내용 맵 데이터 저장/로드 하기 Application.persistentDataPath Application.dataPath Application.streamingAssetsPath 주소와 관련한 내용 참고 주소 : 1. UnityStudy.net 2. 개발자 블로그
  • 38. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다. [ MapManager ] 클래스 내에 파일로드 구현을 위한 함수 구현 맵 데이터 저장/로드 하기 using UnityEngine; using System.Collections; using System.Collections.Generic; using System.IO; public class MapManager : MonoBehaviour { ...... // (1, 2, 3) 이라는 문자열을 Vector3값으로 변경해 주는 함수 public Vector3 GetVector3FromString(string text) { string newText = text.Replace( '(', ' ' ); // '(' 문자를 ‘ ’문자로 변경 newText = newText.Replace( ')', ' ' ); // ')' 문자를 ‘ ’문자로 변경 string[] datas = newText.Split( ',' ); // ',' 문자를 기준으로 값 분리 float x = float.Parse( datas[0] ); // 각각의 숫자를 x, y, z로 변환 float y = float.Parse( datas[1] ); float z = float.Parse( datas[2] ); return new Vector3(x, y, z); } }
  • 39. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다. [ MapManager ] 클래스 내에 파일로드 구현 맵 데이터 저장/로드 하기 using UnityEngine; using System.Collections; using System.Collections.Generic; using System.IO; public class MapManager : MonoBehaviour { ...... public void LoadMapDataFromFile() { RemoveAllTiles(); string filePath = "MapData/" + _fileName; TextAsset asset = (TextAsset)Resources.Load( filePath, typeof(TextAsset) ); if (asset == null) { Debug.Log("Can not open file on Assets/" + filePath + ".txt"); return; } //Stream stream = new MemoryStream(asset.bytes); //TextReader textReader = new StreamReader(stream); TextReader textReader = new StringReader(asset.text); // read width string text = textReader.ReadLine(); string widthText = text.Substring( text.IndexOf(' ') + 1 ); _currentWidth = int.Parse( widthText ); // read height text = textReader.ReadLine(); string heightText = text.Substring( text.IndexOf(' ') + 1 ); _currentHeight = int.Parse( heightText ); ...... } } // End of LoadMapDataFromFile() }
  • 40. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다. 타일의 정보 읽어오는 기능 구현 맵 데이터 저장/로드 하기 public class MapManager : MonoBehaviour { ...... public void LoadMapDataFromFile() { ...... // create map _tiles = new GameObject[_currentWidth, _currentHeight]; for (int i = 0; i < _currentWidth; ++i) { for (int j = 0; j < _currentHeight; ++j) { text = textReader.ReadLine(); string[] infos = text.Split('t'); GameObject obj = Instantiate(_baseTilePrefab) as GameObject; obj.name = i + "_" + j; obj.transform.parent = transform; obj.transform.localPosition = GetVector3FromString( infos[0] ); obj.transform.eulerAngles = GetVector3FromString( infos[1] ); TileInfo tileInfo = obj.GetComponent<TileInfo>(); tileInfo.currentTileStyle = (TILESTYLE)( int.Parse( infos[2] ) ); tileInfo.UpdateMaterial(); _tiles[i, j] = obj; } } ...... } // End of LoadMapDataFromFile() }
  • 41. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다. 경로 정보 읽어오는 기능 구현 맵 데이터 저장/로드 하기 public class MapManager : MonoBehaviour { ...... public void LoadMapDataFromFile() { ...... // load path text = textReader.ReadLine(); string pathCountText = text.Substring(text.IndexOf(‘ ')); int pathCount = int.Parse(pathCountText); for (int i = 0; i < pathCount; ++i) { text = textReader.ReadLine(); string[] tiles = text.Split('t'); int x = int.Parse(tiles[0]); int y = int.Parse(tiles[1]); _pathList.Add( _tiles[x, y].transform ); } } // End of LoadMapDataFromFile() }
  • 42. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다. 경로를 실제 읽어올 수 있도록 함수 호출 구문 추가 맵 데이터 저장/로드 하기 public class MapManagerInspector : Editor { void DrawSaveLoadButton( MapManager mapManager ) { EditorGUILayout.BeginHorizontal(); if (GUILayout.Button("Save Map Data")) { //Save Process …… } if (GUILayout.Button("Load Map Data")) { // Load Process mapManager.LoadMapDataFromFile(); } EditorGUILayout.EndHorizontal(); } }
  • 43. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다. 맵 데이터 저장/로드 하기 void RepairMapTilesProcess(MapManager mapManager) { if( mapManager._tiles != null ) return; int maxX = -1000; int maxY = -1000; int count = 0; foreach( Transform child in mapManager.transform ) { string name = child.name; string[] tile = name.Split('_'); int currentX = int.Parse( tile[0] ); int currentY = int.Parse( tile[1] ); maxX = Mathf.Max( currentX, maxX ); maxY = Mathf.Max( currentY, maxY ); ++count; } ++maxX; ++maxY; if( count != maxX*maxY) { EditorUtility.DisplayDialog("Notice", "I can not repair your map. Sorry...", "OK"); return; } mapManager._tiles = new GameObject[maxX, maxY]; foreach( Transform child in mapManager.transform ) { string name = child.name; string[] tile = name.Split('_'); int currentX = int.Parse( tile[0] ); int currentY = int.Parse( tile[1] ); mapManager._tiles[currentX, currentY] = child.gameObject; } }
  • 44. 본 자료는 유니티 러닝센터 수강생을 위한 수업 교재로, 저작권은 유니티테크놀로지스코리아가 소유하고 있습니다. 경로를 실제 읽어올 수 있도록 함수 호출 구문 추가 맵 데이터 복구하기 public class MapManagerInspector : Editor { public override void OnInspectorGUI() { MapManager mapManager = target as MapManager; ...... CommonEditorUi.DrawSeparator( Color.cyan ); if( GUILayout.Button("Repair Map Tiles" ) ) { RepairMapTilesProcess(mapManager); } }