์ด๊ฑด ๊ฐ„๋‹จ ํ”„๋กœํ† ํƒ€์ž…


์•ˆ๊ฐœ๋Š” ๋Œ€์ถฉ ํฌํ† ์ƒต์œผ๋กœ ๋งŒ๋“ฌ





์ด๊ฑด ์ผœ์ง„ ์ง€์—ญ์€ ํšŒ์ƒ‰์•ˆ๊ฐœ ๋งŒ๋“œ๋Š” ์ž‘์—…๊นŒ์ง€ ์ถ”๊ฐ€ํ•œ๊ฑฐ


์œ„์—๋Š” ํ…์Šค์ณ๊ฐ€ ์กฐ์žกํ•ด์„œ ๊ฑ ์•ŒํŒŒ์—†๋Š” ํ…์Šค์ณ๋ฅผ ํฌํ† ์ƒต์œผ๋กœ ๋‹ค์‹œ ๋งŒ๋“ฌ


( ๋ฐ‘์— ์—์…‹์€ ์‹œ์•ผ ๊ฑฐ๋ฆฌ๋‚ด์—์„œ ์‹œ์•ผ ๋ฐํ˜€์งˆ ์ธ๋ฑ์Šค๋งŒ ์ฃผ๋Š” ๊ฑ ํ—ฌํผ๊ณ 

ํ•œ๋ฒˆ ๊ฐ”๋˜ ์ง€์—ญ์€ ํšŒ์ƒ‰์•ˆ๊ฐœ๋กœ ๋งŒ๋“œ๋Š”๊ฑด ๊ฐ์ž ๋งต๊ตฌ์กฐ์— ๋”ฐ๋ฅธ ๋ฐฉ๋ฒ•๋ก ์„ ์ž๊ธฐ๊ฐ€ ๊ตฌ์ƒํ•ด์„œ ์ž๊ธฐ๊ฐ€ ๊ตฌํ˜„ํ•ด์•ผ๋จ )






๊ตฌํ˜„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•๋ก ์ด ์žˆ์ง€๋งŒ ๋‚˜๋Š”


์œ ๋‹› ์›์ ์—์„œ ์‹œ๊ณ„๋ฐฉํ–ฅ์œผ๋กœ ํƒ์ƒ‰ํ•ด์„œ (์†Œ์šฉ๋Œ์ด์‹์œผ๋กœ)


์žฅ์• ๋ฌผ์ด๋ฉด ์žฅ์• ๋ฌผ์˜ ๊ฐ๋„๋ฅผ ์ถ”๊ฐ€ํ•จ , (90๋„~100๋„ ์ด๋Ÿฐ์‹์œผ๋กœ)


ํƒ์ƒ‰ํ• ๋•Œ ์ผ์ข…์˜ ๊ฐ๋„์— ํฌํ•จ๋˜๋ฉด ์•ˆ๊ฐœํƒ€์ผ๋กœ ์„ค์ •ํ•จ


ํฌํ•จ ์•ˆ๋˜๋ฉด ์‹œ์•ผ์ผœ์ง€๋Š” ํƒ€์ผ๋กœ ์„ค์ •ํ•จ


๊ทธ๋Ÿผ ์žฅ์• ๋ฌผ์— ๊ฐ€๋ ค์ง€๋Š” ์•ˆ๊ฐœํƒ€์ผ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ฌ


์ด๊ฑธ ์œ ๋‹›๋งˆ๋‹ค ๋ฐ˜๋ณตํ•จ (์ด๋ฏธ ๋‹ค๋ฅธ ์œ ๋‹›์—๊ฒŒ ์‹œ์•ผํƒ€์ผ๋กœ ๋ฐํ˜€์ง„ ํƒ€์ผ์ด๋ฉด ํƒ์ƒ‰์•ˆํ•˜๊ณ  ๋‹ค์Œ ํƒ€์ผ์„ ํƒ์ƒ‰ํ•˜๊ณ  ์ด๋Ÿฐ์‹)


๊ฐ๋„๋Š” ์ผ์ผํžˆ ๊ณ„์‚ฐํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ๋ฏธ๋ฆฌ ๊ณ„์‚ฐํ•ด๋†“์€๊ฑธ ์žฌ์‚ฌ์šฉํ•จ





https://github.com/replming/disk/blob/main/FogOfWarHelper.unitypackage


์—์…‹์ž„


๊ธฐ๋ณธ์ ์œผ๋กœ ๋งต์ด ๋‹ค ์‹œ์•ผ ๊บผ์ง„ ์ƒํƒœ์—์„œ ์‹œ์ž‘ํ•ด์•ผ๋จ


์ด๊ฑฐ๋Š” ๊ทธ๋ƒฅ ํ˜„ ์œ ๋‹›๋“ค์˜ ์‹œ์•ผ๊ฑฐ๋ฆฌ์—์„œ ์‹œ์•ผํƒ€์ผ, ์•ˆ๊ฐœํƒ€์ผ ๋ฆฌ์ŠคํŠธ๋งŒ ์ฃผ๋Š” ํ—ฌํผ์ง€


ํ•œ๋ฒˆ ๊ฐ”๋˜ ์ง€์—ญ์€ ํšŒ์ƒ‰์•ˆ๊ฐœ๋กœ ๋งŒ๋“œ๋Š”๊ฑด ๊ฐ์ž ๋งต๊ตฌ์กฐ์— ๋”ฐ๋ฅธ ๋ฐฉ๋ฒ•๋ก ์„ ์ž๊ธฐ๊ฐ€ ๊ตฌ์ƒํ•ด์„œ ์ž๊ธฐ๊ฐ€ ๊ตฌํ˜„ํ•ด์•ผ๋จ





ํ•จ์ˆ˜ ์„ค๋ช…


" using FogOfWarHelperNameSpace; "

= ์œ ๋‹ˆํ‹ฐ ํ•ด๋‹น c#ํŒŒ์ผ์—์„œ ์‚ฌ์šฉํ• ๋•Œ using ํ•ด์ค˜์•ผ๋จ



" fogOfWarHelper ์ „์žฅ์˜์•ˆ๊ฐœ_ํ—ฌํผ = new FogOfWarHelper(Index mapSize); "

= ์ „์žฅ์˜์•ˆ๊ฐœ ํ—ฌํผ ์ƒ์„ฑ , ๋งต์‚ฌ์ด์ฆˆ๋Š” ์ค‘๊ฐ„์— ๋ฐ”๊พธ๊ณ  ์‹ถ๋‹ค๋ฉด "๋ณ€์ˆ˜๋ช….ChangeMapSize(mapSize)" ๋กœ ๋ณ€๊ฒฝ๊ฐ€๋Šฅํ•จ



" ์ „์žฅ์˜์•ˆ๊ฐœ_ํ—ฌํผ.AddObstacle(Index obstacleTileIndex); "

= ์‹œ์•ผ๊ฐ€๋ฆด ๋ฒฝ์ด๋‚˜ ์žฅ์• ๋ฌผ ๋“ฑ๋ก , ๋ณดํ†ต ๋งต์ดˆ๊ธฐ์— ๋งต์— ์žˆ๋Š” ๋ชจ๋“  ์žฅ์• ๋ฌผ์„ ๋“ฑ๋ก ํ•˜๋ฉด ํŽธํ•จ



" ์ „์žฅ์˜์•ˆ๊ฐœ_ํ—ฌํผ.AddUnit(Index unitTileIndex, int fob_distance_by, FOB_OPTION_TYPE fOB_OPTION_TYPE); "

= ์‹œ์•ผ๋ฅผ ๊ฐ€์ง„ ์œ ๋‹›๋“ฑ๋ก , fob_distance = ์œ ๋‹›์˜ ํƒ€์ผ๋‹จ์œ„ ์‹œ์•ผ๊ฑฐ๋ฆฌ , fOB_OPTION_TYPE์€ ์ •์‚ฌ๊ฐํ˜• ์‹œ์•ผ์™€ ์›ํ˜• ์‹œ์•ผ๊ฐ€ ์žˆ์Œ



" ์ „์žฅ์˜์•ˆ๊ฐœ_ํ—ฌํผ.Clear_Unit(); "

= ๋“ฑ๋กํ•œ ๋ชจ๋“  ์œ ๋‹›์„ ์‚ญ์ œํ•จ , ๋ณดํ†ต AddUnit ํ•ด๋„ ๋‹ค์Œ ํ”„๋ ˆ์ž„์—์„œ ์œ ๋‹›์˜ ๋ณ€๊ฒฝ๋œ ์‚ฌํ•ญ์€ ์ ์šฉ๋˜์ง€ ์•Š๊ธฐ์— ์œ ๋‹›์˜ ๋ณ€ํ™”๋ฅผ ์ ์šฉํ• ๋ ค๋ฉด, ๋งค ํ”„๋ ˆ์ž„ ๋งˆ๋‹ค Clear_Unit์„ ํ•ด์ฃผ๊ณ  ๋‹ค์‹œ ๋ชจ๋“  ์œ ๋‹›์„ ๋“ฑ๋กํ•˜๋Š” ๋ฐฉ๋ฒ•๋ก ์„ ์‚ฌ์šฉํ•จ



" ์ „์žฅ์˜์•ˆ๊ฐœ_ํ—ฌํผ.Update(); "

= ํ˜„ ์ƒํ™ฉ์— ๋งž๊ฒŒ ์‹œ์•ผ์ƒํ™ฉ์„ ์—…๋ฐ์ดํŠธํ•จ



" FogOfWarHelper_Output ์—…๋ฐ์ดํŠธ_๊ฒฐ๊ณผ = ์ „์žฅ์˜์•ˆ๊ฐœ_ํ—ฌํผ.Output; "

= ์—…๋ฐ์ดํŠธ ํ–ˆ๋˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์•„์˜ด





" FogOfWarHelper_Option ์˜ต์…˜ = new FogOfWarHelper_Option();

์˜ต์…˜.BasicMode();

์ „์žฅ์˜์•ˆ๊ฐœ_ํ—ฌํผ.SetOption(์˜ต์…˜); "

= ์˜ต์…˜์„ ์„ค์ •ํ•จ ,


softFogMode = ๋ถ€๋“œ๋Ÿฌ์šด ์•ˆ๊ฐœ๋ชจ๋“œ , false๋ฉด output์—์„œ ๊ธฐ๋ณธ ์‚ฌ๊ฐํ˜•์•ˆ๊ฐœ๋งŒ ๋ฐ›๊ณ  true์ด๋ฉด ๋‹ค์–‘ํ•œ ์•ˆ๊ฐœํƒ€์ž… ๋ฐ›์Œ


prevUpdateUnitList_IndexChangeCheck = false๋ฉด update์‹œ ๋ฌด์กฐ๊ฑด ๊ณ„์‚ฐํ•˜๊ณ  , true์ด๋ฉด ๋“ฑ๋ก๋œ ์œ ๋‹›๋“ค์˜ ์ƒํ™ฉ์ด ์ด์ „ ์—…๋ฐ์ดํŠธ๋•Œ ์ƒํ™ฉ๊ณผ ๊ฐ™๋‹ค๋ฉด ๊ณ„์‚ฐํ•˜์ง€ ์•Š๊ณ  ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ์คŒ ์ตœ์ ํ™”์šฉ๋„ ๋‚ด ์ปดํ“จํ„ฐ ๊ธฐ์ค€์—์„  3~4fps์ƒ์Šน? ํ•˜๋Š”๊ฑฐ ๊ฐ™์€๋ฐ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Œ. ๋‚ด๋ถ€์—์„  directory ์ž๋ฃŒ๊ตฌ์กฐ๋กœ ๊ฒ€์ƒ‰ํ•ด์„œ


thickFogMode = ๋‘๊บผ์šด ์•ˆ๊ฐœ๋ชจ๋“œ , ๊ธฐ์กด ์•ˆ๊ฐœ์—์„œ ์ฃผ๋ณ€ ํ•œ ํƒ€์ผ ์•ˆ๊ฐœ๋ฅผ ๋” ๋งŒ๋“ฌ






----------------------------------------------------------------------------------------------------

----------------------------------------------------------------------------------------------------

----------------------------------------------------------------------------------------------------

----------------------------------------------------------------------------------------------------

----------------------------------------------------------------------------------------------------




ex์˜ˆ์ œ. update ํ•จ์ˆ˜ ํ˜•์‹ ์˜ˆ์ œ (๋ณต๋ถ™ํ•œ๋‹ค๊ณ  ๋Œ์•„๊ฐ€๋Š”๊ฑด ์•„๋‹ˆ๊ณ  ๊ทธ๋ƒฅ ์ด๋Ÿฐ์‹์œผ๋กœ ์“ฐ๋ฉด๋œ๋‹ค ์ •๋„)



fogOfWarHelper ์ „์žฅ์˜์•ˆ๊ฐœ_ํ—ฌํผ;



public void Start()

{

์ „์žฅ์˜์•ˆ๊ฐœ_ํ—ฌํผ= new FogOfWarHelper(Index mapSize);


foreach (Index wallIndex in wallIndexs)

ย  ย ย ์ „์žฅ์˜์•ˆ๊ฐœ_ํ—ฌํผ.AddObstacle(wallIndex);

}



public void Update()

{

FogOfWarHelper_Output prevOutput = ์ „์žฅ์˜์•ˆ๊ฐœ_ํ—ฌํผ.Output;


foreach (Index i in prevOutput.lightIndexList)

ย ย ย ย ๋งต[i.y, i.x].SetFog();


foreach (FogIndex i in prevOutput.fogIndexList)

ย ย ย ย ๋งต[i.index.y, i.index.x].SetFog();


// โ†‘ ์ด์ „ ํ”„๋ ˆ์ž„์—์„œ ์ผœ์คฌ๋˜ ์‹œ์•ผ ๋‹ค์‹œ ๊บผ์ฃผ๊ธฐ



์ „์žฅ์˜์•ˆ๊ฐœ_ํ—ฌํผ.Clear_Unit();


foreach (Unit unit in Units)

{

unit.Update();

์ „์žฅ์˜์•ˆ๊ฐœ_ํ—ฌํผ.AddUnit(unit.GetIndex, unit.fob_distance, unit.fOB_OPTION_TYPE);

}

// โ†‘ ์ด์ „ ์œ ๋‹›์ƒํ™ฉ์€ ์ „๋ถ€ ์‚ญ์ œํ•ด์ฃผ๊ณ  ํ˜„ ํ”„๋ ˆ์ž„์— ํฌ์ง€์…˜์ด ๋ฐ”๋€ ์œ ๋‹›์„ ๋‹ค์‹œ ๋“ฑ๋ก



์ „์žฅ์˜์•ˆ๊ฐœ_ํ—ฌํผ.Update();


FogOfWarHelper_Output output = ์ „์žฅ์˜์•ˆ๊ฐœ_ํ—ฌํผ.Output;


foreach (Index i in output.lightIndexList)

ย  ย  ย ๋งต[i.y, i.x].SetLight();


foreach (FogIndex i in output.fogIndexList)

๋งต[i.index.y, i.index.x].SetFog(i.fogType);


// โ†‘ ์—…๋ฐ์ดํŠธ ์ดํ›„ output์„ ๋ฐ›์•„์™€ ์‹œ์•ผ ๋ฐํžˆ๋Š” ์ธ๋ฑ์Šค๋“ค์€ ์ผœ์ฃผ๊ณ  , ์•ˆ๊ฐœ ์ธ๋ฑ์Šค ๋“ค์€ ๊บผ์คŒ

}



----------------------------------------------------------------------------------------------------

----------------------------------------------------------------------------------------------------

----------------------------------------------------------------------------------------------------

----------------------------------------------------------------------------------------------------

----------------------------------------------------------------------------------------------------




๊ตฌํ˜„๊นŒ์ง€ 4์ผ ์ •๋„ ๊ฑธ๋ฆผ (๋„์ค‘ ์ €๋ฒˆ์— ๋น„ ใ…ˆใ„ด์™€์„œ ์—„๋งˆ ์‚ฌ๋ฌด์‹ค ์นจ์ˆ˜๋œ๊ฑฐ ๊ณต์‚ฌ ๋„์™€์ฃผ๊ณ  ๋ง๊ฐ€์ง„ ํ‚ค๋ณด๋“œ ํ™”์ƒํ‚ค๋ณด๋“œ ์จ๊ฐ€๋ฉด์„œ ๊ตฌํ˜„ํ•จ ใ……ใ…‚)



์ •์‚ฌ๊ฐํ˜• ์›ํ˜• ์‹œ์•ผ๋งŒ ๋ง๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋Š” ์‹œ์•ผ๋ฒ”์œ„ ํƒ€์ž… ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š”๋ฐ ๋” ์ด์ƒ ์—ฌ๊ธฐ์— ์‹œ๊ฐ„ ๋ถ™๊ธฐ ์‹ซ์–ด์„œ ์š” ์ •๋„๋งŒ ํ•จ


๋ฒ„๊ทธ ์žˆ๊ฑฐ๋‚˜ ์›ํ•˜๋Š” ๊ธฐ๋Šฅ ๊ฐ™์€๊ฑฐ ์žˆ์œผ๋ฉด ๋งํ•ด๋ณด์…ˆ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ํ•จ ๊ตฌํ˜„ํ•ด๋ด„


๋‚˜์ค‘์— ๋งŒ์•ฝ์—~ ์‰์ด๋” ๊ณต๋ถ€ํ•˜๊ฒŒ ๋˜๋ฉด ์—ฐ๊ณ„ํ•ด์„œ ํ•ด๋ณผ๋“ฏ


๊ทธ๋ฆฌ๊ณ  Output์—์„œ ๋ฐ›๋Š” ๋ฆฌ์ŠคํŠธ๋Š” ReadOnly ์šฉ๋„๋‹ค. ์กฐ์ž‘ํ•˜์ง€๋งˆ๋ผ... ์•„๋งˆ ์กฐ์ž‘ํ•˜๋ฉด ๋ฒ„๊ทธ๋‚ ๊ฑฐ์ž„ (ํ…Œ์ŠคํŠธ ํ•ด๋ณด์ ์€ ์—†์Œ)


์ € Output๋ถ€๋ฌธ ๋•Œ๋ฌธ์— c#๊ตฌ๋ฌธ ๋ฐฐ์›Œ์„œ ๋” ์•ˆ์ „ํ•˜๊ฒŒ ํด๋ž˜์Šค ์„ค๊ณ„ํ•˜๊ณ  ์‹ถ์—ˆ๋Š”๋ฐ output ๋ฆฌ์ŠคํŠธ readonlyํ•˜๋Š”๋ฒ•์žˆ๋ƒ...


๋ฆฌ์ŠคํŠธ ํ•˜๋‚˜ ๋” ๋งŒ๋“ค์–ด์„œ output ํ• ๋•Œ๋งˆ๋‹ค ๋ณต์ œํ•˜๋Š”๋ฒ• ๋ฐ–์— ์—†๋‚˜ ๊ดœํžˆ ์„ฑ๋Šฅ๋‚ญ๋น„ ๊ฐ™์•„์„œ ์•ˆํ–ˆ์Œ , output ์กฐ์ž‘์•ˆํ• ๊ฑฐ๋ผ๊ณ  ๋ฏฟ์Œ!







https://github.com/replming/disk/blob/main/FogOfWarHelper.unitypackage


์—์…‹ ์ฃผ์†Œ


๊ทธ๋ฆฌ๊ณ  ํ˜น์‹œ ์—์…‹์Šคํ† ์–ด์— ๋‹ค๋ฅธ ์ „์žฅ์˜ ์•ˆ๊ฐœ ์—์…‹ ์žˆ์œผ๋ฉด ์•Œ๋ ค์ฃผ์…ˆ