์ค๋์ ํ ์ผ
0. ์ด์ ๋ชป๋คํ ์์ ํด๊ฒฐ
1-4. ํํ ์ค ์์ดํ ํ๋ ํ ๋ฐฉ ํ์ ( ๊ฐฏ์ ๋ฐ ์์น, ์ต์ 3x3 - ์ ํฌ์ฉ ๋ฐฉ๊ณผ๋ ์๊ฒน์น๊ฒ ) -> ์ด๊ฑด ํด๊ฒฐ๋จ
์ข์ ๋ฐฉ์๋ ์์ดํ ์ด ๋จ์ด์ ธ์์ด ์ฃผ์ธ ์ ์์ด์ผํ๋ค. -> ์ด๊ฑด ๋ค๋ก ๋ฏธ๋ฃธ
๋ฒฝํ์ผ ๋ฆฌ์คํธ๋ ์ป๊ธฐ -> ์ถ๊ฐ
๋ฒฝํ์ผ ๋ฆฌ์คํธ๋ฅผ ์ป์ผ๋ ค๋ฉด BorderBuilder.csํ์ผ์ ์ด์ด๋ด์ผ ๋ฉ๋๋ค.
์์ BlockBuilder์ ๋ง์ฐฌ๊ฐ์ง๋ก GroundBlocksArray๋ผ๋ ๋ฐ์ ๋ฐ๋ฅ ํ์ผ์ ์ ์ฅํ๋ ์ด๋ ์ด๋ฆฌ์คํธ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
๊ทผ๋ฐ ํด๋น ์ด๋ ์ด๋ฆฌ์คํธ์ ๋ฌด์จ ํ์ ์ค๋ธ์ ํธ๊ฐ ๋ค์ด๊ฐ๋์ง ํ์๊ฐ ์๋์ ํท๊ฐ๋ฆฌ๋๊น
using System.Collections.Generic;์ ์๋จ์ ์ถ๊ฐํ๊ณ
ArrayList -> List<GameObject>๋ก ๋ณ๊ฒฝํ์ต๋๋ค.
BorderBlocksArray๋ ๋ง์ฐฌ๊ฐ์ง๊ณ BlockBuilderํด๋์ค์ GroundBlocksArray๋ ์ถ๊ฐํ์ด์
๊ทธ๊ฒ๋ง ์์ ํ๋ฉด ๋ค๋ฅธ ๋ถ๋ถ ๋ณ๋ก ์๋ฐ๊ฟ๋ ๋๋๋ผ๊ตฌ์.
๊ทธ๋ค์์ ์๋ BuildBorderArray์ ํ๋ผ๋ฏธํฐ๋ก ย ArrayList๋ผ๋ ๋์ ๋ฐ๊ณ , GroundBlocksArray ๋ผ๋ ๋ฉค๋ฒ๋ณ์์ ํ ๋นํ๋๊ฑธ ๋ณด๋ฉด
์ ์ด๋์ด BlockBuilder ( ๋ฐ๋ฅ๊น๋๋ ) ์์ ์์ฑ๋ ๋ฐ๋ฅํ์ผ(๊ฒ์์ค๋ธ์ ํธ)๋ฆฌ์คํธ๋ฅผ ๋ฐ์์์ ๋ชจ์๋ฆฌ ์ธ๊ณฝ์ ์ธ์ง ์ฒดํฌํํ
๋น๋ถ๋ถ์ ๋ณด๋ ( ์ธ๊ณฝ์ )์ ๋ง๋๋๊ตฌ๋ ์์์์ฃ .
์์ ํด๋์ค๋ฅผ ์ง ๊ฑธ ์๊ฐํด๋ณด๋ฉด ย ๊ทธ ๋ณด๋(๊ฒ์์ค๋ธ์ ํธ)๋ค์ BuildBorderArrayํจ์ ํ๋ฒ๋๋ฆฌ๊ณ ๋๋ฉด
BorderBlocksArray์ ์ ์ฅ๋๋ค๋๊ฑธ ์์์์ด์.
์ฐ๋ฆฌ๋ getBorderBlocksArray() ํจ์๋ง ํ๋ ๋ง๋ค๋ฉด ๋๊ฒ ๊ตฐ์.
๊ทธ๋ฆฌ๊ณ ๊ฒ์์ค๋ธ์ ํธ๋ก ๊ฐ์ GenerateBorder์ ์ฒดํฌ๋ฅผ ํ๋ฉด
์๋ง ๋ณด๋๊ฐ ์๊ธฐ๊ฒ ์ฃ ? ์๋ ๋ธ๋ก๋น๋( ๋ฐ๋ฅ๊น๋๋ )์์ ์ด๋์ ๋ณด๋๋ฅผ ๋ง๋๋๊ฐ ํ๋๋
BuildBlocks(๋ฐ๋ฅ๊น๋ ํจ์)์ ๊ฐ์ฅ๋์ ์๋ค์.
๋ฐฐ์ด๋ก ์์ฑํ ํ ์คํธ ํ์ผ๋ก ์ถ๋ ฅ -> ์ถ๊ฐ
๊ทธ๋์ ํ ์คํธ ํ์ผ๋ก ์ ์ฅํ๋ ํจ์์ธ SaveTextFile ํจ์๋ BuildBlocksํจ์๊ฐ ์คํ๋ ๋ค์ ์คํ๋์ผ ํฉ๋๋ค.
์ด๋ ๊ฒ์.
๊ทธ๋ฆฌ๊ณ SaveTextFileํจ์๋ ์ด๋ฐ์์๋ก ๋์ํฉ๋๋ค.
๋ชจ๋ ๋ฐ๋ฅ,๋ฒฝ ํ์ผ์ x์ขํ ์ต์/์ต๋๊ฐ, y์ขํ ์ต์/์ต๋๊ฐ์ ์ฐพ์ต๋๋ค.
์ต๋๊ฐ-์ต์๊ฐ+1๋ก ์ ์ฒด ๋ฐฐ์ด์ ๊ฐ๋ก/์ธ๋ก ๊ฐ์ ๊ตฌํฉ๋๋ค.
์ด๋ ๊ฒ์.
๊ทธํ ์์ ์ ๊ฐ์ผ๋ฉด
int[,] map = new int[44,45];
๊ฐ์ด ํด์ ํด๋น ๋ฐฐ์ด์ ๊ฐ์ ์ฑ์๋๋ค.
๋ฐ๋ฅ์ 1, ๋ฒฝ์ 2, ์์์ 3, ๋์ 4, ์ ํฌ์ฉ๋ฐฉ๊ธฐ์ค์ 5, ์์ดํ ๋ฐฉ๊ธฐ์ค์ 6
( ๋ฐฉ ๊ธฐ์ค์ ์ ์๋ ์ขํ๋ก ๋จ๊ธฐ๋ ค๊ณ ํ๋๋ฐ ์ ๋๋์ง ํ์ธ์ด ์ด๋ ค์์ ์ด๋ ๊ฒ ํฉ๋๋ค. )
์์ง ํ ์คํธ ํ์ผ๋ก๋ ์๋ฝ์๋ณด๊ณ ๋ฐฐ์ด๊น์ง๋ง ์์ฑํ๊ณ ์ถ๋ ฅํ๋ SaveTextFileํจ์์ ๋๋ค.
----- ์ ์ทจ์ ----
private void SaveTextFile(){
int len = GroundBlocksArray.Count;
Vector2 minXY = new Vector2(0,0);
Vector2 maxXY = new Vector2(0,0);
GameObject tmpObj;
for(int i = 0; i < len; ++i){
tmpObj = GroundBlocksArray[i] as GameObject;
if(tmpObj.transform.position.x < minXY.x){
minXY.x = tmpObj.transform.position.x;
}
if(tmpObj.transform.position.y < minXY.y){
minXY.y = tmpObj.transform.position.y;
}
if(tmpObj.transform.position.x > maxXY.x){
maxXY.x = tmpObj.transform.position.x;
}
if(tmpObj.transform.position.y > maxXY.y){
maxXY.y = tmpObj.transform.position.y;
}
}
List<GameObject> BorderBlocksArray = GetComponent<BorderBuilder>().getBorderBlocksArray();
len = BorderBlocksArray.Count;
for(int i = 0; i < len; ++i){
tmpObj = BorderBlocksArray[i] as GameObject;
if(tmpObj.transform.position.x < minXY.x){
minXY.x = tmpObj.transform.position.x;
}
if(tmpObj.transform.position.y < minXY.y){
minXY.y = tmpObj.transform.position.y;
}
if(tmpObj.transform.position.x > maxXY.x){
maxXY.x = tmpObj.transform.position.x;
}
if(tmpObj.transform.position.y > maxXY.y){
maxXY.y = tmpObj.transform.position.y;
}
}
print (minXY);
print (maxXY);
Vector2 widthHeight = new Vector2();
widthHeight.x = maxXY.x - minXY.x + 1;
widthHeight.y = maxXY.y - minXY.y + 1;
print( widthHeight.x + "," + widthHeight.y );
int[,] map = new int[ Mathf.FloorToInt(widthHeight.x), Mathf.FloorToInt(widthHeight.y)];
len = GroundBlocksArray.Count;
for(int i = 0; i < len; ++i){
tmpObj = GroundBlocksArray[i] as GameObject;
map[Mathf.FloorToInt(tmpObj.transform.position.x - minXY.x), Mathf.FloorToInt(tmpObj.transform.position.y - minXY.y)] = 1;
}
len = BorderBlocksArray.Count;
for(int i = 0; i < len; ++i){
tmpObj = BorderBlocksArray[i] as GameObject;
map[Mathf.FloorToInt(tmpObj.transform.position.x - minXY.x), Mathf.FloorToInt(tmpObj.transform.position.y - minXY.y)] = 2;
}
map[Mathf.FloorToInt(StartPoint.x - minXY.x), Mathf.FloorToInt(StartPoint.y - minXY.y)] = 3;
map[Mathf.FloorToInt(EndPoint.x - minXY.x), Mathf.FloorToInt(EndPoint.y - minXY.y)] = 4;
len = listBattleRoom.Count;
for(int i = 0; i < len; ++i){
map[Mathf.FloorToInt(listBattleRoom[i].x - minXY.x), Mathf.FloorToInt(listBattleRoom[i].y - minXY.y)] = 5;
}
len = listItemRoom.Count;
for(int i = 0; i < len; ++i){
map[Mathf.FloorToInt(listItemRoom[i].x - minXY.x), Mathf.FloorToInt(listItemRoom[i].y - minXY.y)] = 6;
}
string result = "";
int height = Mathf.FloorToInt( widthHeight.y );
for(int y = 0; y < widthHeight.y; ++y){
for(int x = 0; x < widthHeight.x; ++x){
result += map[x,height-1 - y];
}
result += " ";
}
print (result);
}
ย ---- ํจ์๋ ---
๋ณด๋๋ ์ ๋์ค๋ ๊ฑฐ ๊ฐ๊ตฌ์ . ์ผ๋ถ ๊ฒฝ์ฐ ๋ณด๋๊ฐ ์ข ๋ฐ๋ฅํ์ผ ์ฃผ๋ณ์ ์๋ฒฝํ ๊ฐ์ธ์ง ์๋ ๊ฒฝ์ฐ๊ฐ ์๋๋ฐ ์ฐ์ ์ ๋ฌด์ํฉ์๋ค.
์๋ ๋์ด๊ฐ 53์นธ ์ง๋ฆฌ์ธ๋ฐ ํ ์คํธํ์ผ์ด๋ผ ๋์ด์์ ์บก์ณ๊ฐ ์๋๋ค์ฌ
ํ์ฌํผ ๋น์ทํ๊ฒ ๋์ต๋๋ค.
ํ์ผ ์ธ์ด๋ธ ๊ธฐ๋ฅ์
http://worldeye.tistory.com/entry/Unity-ํ ์คํธ-ํ์ผ์ ์ถ๋ ฅ
๋ธ๋ก๊ทธ๋ฅผ ๋ณด๊ณ ๋ฐ๋ผํ๊ฒ ์ต๋๋ค.
WriteDataํจ์๋ง ๊ฐ์ ธ๋ค ์ฐ๋ฉด ๋๊ฒ ์ฃ .
using System.IO; ๋ฅผ ์ถ๊ฐํ๊ณ
ํ์ผ ๊ฒฝ๋ก๋ฅผ ์ง์ ํ ์ ์๊ฒ ๋ฐ๊พธ๊ตฌ์
ย ย ย public void WriteData(string path, string strData) {
ย ย ย ย FileStream ย f = new FileStream( path, FileMode.Append, FileAccess.Write);
ย ย ย ย StreamWriter writer = new StreamWriter(f, System.Text.Encoding.Unicode);
ย ย ย ย writer.WriteLine(strData);
ย ย ย ย writer.Close();
}
Assetsํด๋ ์์ Texts๋ผ๋ ํด๋๋ฅผ ํ๋ ๋ง๋ค๊ณ ,
ํ์ด์ด๋ผํค ์ฐฝ์์ Level Generator์ levelName์ ย D1์ด๋ผ๊ณ ํ๊ณ ( ๋์ 1์ธตํน์ 1๋ฒ ์ด๋ ๋ป์ธ๋ฐ ์ํ๋ ๋ค๋ฅธ๊ฑธ ํ์ ๋ ์ข์ฃ )
ํ๋ ์ด๋ฅผ ๋๋ฅด๋ฉด... ์ฝ.. ์ฌ์งํ์ผ ์ด๊ณผ๋ก ๋ค์์ฅ์
1-5. ์์ผ๊ธฐ๋ฅ์ ๋ฃ์ด์ผ ํ๋ค. -> ์ด๊ฒ๋ ๋ค๋ก ๋ฏธ๋ฃธ.. ์ธ๊ฒ์์์ ๋ฃ์ด์ผ
1. ์ค๋์ ์์ ๋ชฉํ
2-1. ๋งต ํ ์คํธ ํ์ผ์์ ๊ฒ์์ผ๋ก ๋ถ๋ฌ์ค๊ธฐ
2-2. ๋งต์ด๋ ์ํ์์ ์ ํฌ์ฉ ๋ฐฉ์ ๋ชฌ์คํฐ ์คํฐ / ์์ดํ ๋ฐฉ์ ์์ดํ ์คํฐ
ย ย ย ์์์ง์ ์ ์ฌ๋ผ๊ฐ๋ ๊ณ๋จ ์คํฐ, ๋์ง์ ์ ๋ด๋ ค๊ฐ๋ ๊ณ๋จ ์คํฐ
2-3. ๊ฐ๋จํ ์์ผ๊ธฐ๋ฅ
2-4. ๊ฐ๋จํ ์๋์ด๋ย
2-5. ์คํฐ๋ ๋ชฌ์คํฐ๋ ์ถฉ๋์ ์ ํฌ์์ ๋ฆฌ๋ ์์น๋ก ๋ชจ์๋ค๊ฐ 3x3์์น๋ก ํ์ฐ, ๋ชฌ์คํฐ๋ ์ฐ์ธก์์ ๋ฑ์ฅ
ย ย ย ๋ฒ์ฉ์ด๋ ์ดํํธ ์ถ๊ฐ
ย ย ย ์์ดํ ๊ณผ ์ถฉ๋, ํฐ์น์ ์์ดํ ํ๋
2-6. ์ ํฌ ์ข ๋ฃ ํ ๋งต์ด๋ ์ํ๋ก ์ ํ
2-7. ๋์ง์
๋๊ธ 0