๐Ÿ•น ํƒ€์ดํ‹€ : Daydream - Tower of The Loar -
๐Ÿ•น ์žฅ๋ฅด : 2D ์•ก์…˜
๐Ÿ•น ํ”Œ๋žซํผ : PC
๐Ÿ•น ๊ฐœ๋ฐœ๊ธฐ๊ฐ„ : 2020.06 ~ 2021.05
๐Ÿ•น ๊ฐœ๋ฐœ์ธ์› : 2๋ช… ( ํ”„๋กœ๊ทธ๋ž˜๋จธ, ๋””์ž์ด๋„ˆ)
๐Ÿ•น ํ”Œ๋ ˆ์ดํƒ€์ž„ : 20-30๋ถ„
๐Ÿ•น ์‚ฌ์šฉ ํˆด : Unity


๐Ÿ”ธ ํ”Œ๋ ˆ์ด ์˜์ƒ

  • ์Šคํ…Œ์ด์ง€ 1 ํ”Œ๋ ˆ์ด ์˜์ƒ ( ๊ธฐ์‚ฌ / ์‚ฌ๋ƒฅ๊พผ)
  • ์Šคํ…Œ์ด์ง€ 2 ํ”Œ๋ ˆ์ด ์˜์ƒ ( ๋งˆ๋ฒ•์‚ฌ / ๊ด‘์ „์‚ฌ)

๐Ÿ”ธ ์Šคํฌ๋ฆฐ ์ƒท

first second third fourth fifth sixth


๐Ÿ”ธ ๊ฒŒ์ž„ ์„ค๋ช…

first

์นœ๊ตฌ์˜ ์ƒ์ผ์„ ๋ฌผ ๋งŒ๋“ค์–ด์ฃผ๊ธฐ ํ”„๋กœ์ ํŠธ๋กœ ๋งŒ๋“ค์–ด์ง„ PROJECT-AํŒ€์˜ ์„ธ๋ฒˆ์งธ ๊ฒŒ์ž„์ž…๋‹ˆ๋‹ค.
์žฅ๋ฅด๋Š” ํšก์Šคํฌ๋กค ์•ก์…˜์ด๊ณ , ์†Œ์›์„ ์ด๋ฃจ๊ธฐ ์œ„ํ•ด ํƒ‘์— ์˜ฌ๋ผ ๊ฐ•์ ๋“ค์„ ์“ฐ๋ ค๋œจ๋ ค์•ผ ํ•˜๋Š” ๋ชจํ—˜๊ฐ€๋“ค์˜ ์ด์•ผ๊ธฐ์ž…๋‹ˆ๋‹ค. ๊ท€์—ฝ์ง€๋งŒ ๋‹ค์†Œ ์ž”ํ˜นํ•œ? ๋ถ„์œ„๊ธฐ์˜ ๊ฒŒ์ž„์œผ๋กœ 2๋ช…์˜ ์บ๋ฆญํ„ฐ๋ฅผ ์„ ํƒํ•ด ํƒ‘์„ ์˜ฌ๋ผ์•ผ ํ•˜๋ฉฐ, ํƒ‘์˜ ํ•œ์ธต ํ•œ์ธต์—๋Š” ๊ฐ•๋ ฅํ•œ ๋ณด์Šค๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์š”์†Œ ์—†์ด ์˜ค๋กœ์ง€ ๋ณด์Šค์™€์˜ ์ „ํˆฌ์—๋งŒ ์ง‘์ค‘ํ•˜๋Š” ๋ณด์Šค๋Ÿฌ์‹œ ํ˜•์‹์˜ ๊ฒŒ์ž„์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ๊นŒ์ง€๋Š” 2์ข…๋ฅ˜์˜ ๋ณด์Šค๊ฐ€ ๊ตฌํ˜„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์™„์„ฑ๋„๋Š” ์กฐ๊ธˆ ๋ถ€์กฑํ•˜์ง€๋งŒ, ๋งŽ์€ ๊ณต๋ถ€๊ฐ€ ๋˜์—ˆ๋˜ ํ”„๋กœ์ ํŠธ ์ž…๋‹ˆ๋‹ค.

โ—ผ ์บ๋ฆญํ„ฐ์™€ ๋ณด์Šค ๋ชฌ์Šคํ„ฐ

[ ์บ๋ฆญํ„ฐ ]

4๋ช…์˜ ์บ๋ฆญํ„ฐ๊ฐ€ ์กด์žฌํ•˜๋ฉฐ ๊ฐ ์บ๋ฆญํ„ฐ๋Š” ๋Œ€์‰ฌ์™€ 3๊ฐ€์ง€ ์Šคํ‚ฌ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ•ํ•˜๊ณ  ๋Š๋ฆฐ ์Šคํ‚ฌ๊ณผ ์กฐ๊ธˆ ์•ฝํ•˜์ง€๋งŒ ๋น ๋ฅธ ์Šคํ‚ฌ ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ๊ณ , ํŠน๋ณ„ํ•œ ๋Šฅ๋ ฅ์„ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ณ ์œ  ์Šคํ‚ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ณ ์œ  ์Šคํ‚ฌ์€ ์บ๋ฆญํ„ฐ์˜ ํ”Œ๋ ˆ์ด ์Šคํƒ€์ผ์„ ๋“œ๋Ÿฌ๋‚ผ ์ˆ˜ ์žˆ๋Š” ํŠน์ง•์ ์ธ ์Šคํ‚ฌ์ž…๋‹ˆ๋‹ค.

first
< "๊ธฐ์‚ฌ" ์บ๋ฆญํ„ฐ ๋งˆํฌ์™€ ์Šคํ…Œ์ดํ„ฐ์Šค ๋ฐ” >

๊ฐ ์Šคํ‚ฌ์€ SP(ํ™œ๋ ฅ)์ด๋ผ๋Š” ์ž์›์„ ์†Œ๋ชจํ•˜๋Š”๋ฐ SP๋Š” ํ•ญ์ƒ ์กฐ๊ธˆ์”ฉ ํšŒ๋ณต๋ฉ๋‹ˆ๋‹ค. ํŠน๋ณ„ํžˆ ํ…Œ๋‘๋ฆฌ๊ฐ€ ์ณ์ ธ์žˆ๋Š” ์บ๋ฆญํ„ฐ ๊ณ ์œ  ์Šคํ‚ฌ์€ SP๋ฅผ ์†Œ๋ชจํ•˜๋Š” ๋Œ€์‹  ์ตœ๋Œ€ SP์˜ ๊ฐ’์„ ์†Œ๋ชจํ•˜์—ฌ ํŠน์ˆ˜ํ•œ ํšจ๊ณผ๋ฅผ ๋ฐœํœ˜ํ•ฉ๋‹ˆ๋‹ค. ์ตœ๋Œ€ SP์˜ ํ•œ๊ณ„๊ฐ’๋„ ์‹œ๊ฐ„์— ๋”ฐ๋ผ ํšŒ๋ณตํ•˜์ง€๋งŒ ํšŒ๋ณต์†๋„๊ฐ€ SP์— ๋น„ํ•ด์„œ๋Š” ๋Š๋ฆฝ๋‹ˆ๋‹ค.

๊ฐ ์บ๋ฆญํ„ฐ์˜ ๊ณ ์œ  ์Šคํ‚ฌ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์บ๋ฆญํ„ฐ ๊ณ ์œ  ์Šคํ‚ฌ ์„ค๋ช…
๊ธฐ์‚ฌ ๋ฐฉ์–ด ์‚ฌ์šฉ ์ค‘ ๋ฐ›๋Š” ํ”ผํ•ด๋ฅผ ๋ฌด์‹œ
์‚ฌ๋ƒฅ๊พผ ๋ซ ์„ค์น˜ ๋ซ์„ ์„ค์น˜ํ•˜์—ฌ ๋ซ์— ๊ฑธ๋ฆฐ ์ ์—๊ฒŒ ์ผ์ •์‹œ๊ฐ„ ์ถ”๊ฐ€ ํ”ผํ•ด
๊ด‘์ „์‚ฌ ๊ด‘๋ถ„ ์ฆ‰์‹œ ์ตœ๋Œ€ SP์˜ 100%๋ฅผ ํšŒ๋ณต
๋งˆ๋ฒ•์‚ฌ ๋งˆ๋ ฅ ์••์ถ• SP์†Œ๋ชจ ์—†์ด ๋‹ค๋ฅธ ์Šคํ‚ฌ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋งˆ๋ ฅ๊ตฌ์Šฌ ์†Œํ™˜

๋‘๋ช…์˜ ์บ๋ฆญํ„ฐ์ค‘ ์ž์‹ ์ด ์กฐ์ž‘ํ•˜๊ณ  ์žˆ์ง€ ์•Š๋Š” ์บ๋ฆญํ„ฐ๋Š” ํ•ญ์ƒ ์กฐ์ž‘์ค‘์ธ ์บ๋ฆญํ„ฐ๋ฅผ ์ผ์ • ๊ฑฐ๋ฆฌ ๋‚ด์—์„œ ๋”ฐ๋ผ๋‹ค๋‹ˆ๋ฉฐ, ์ฒด๋ ฅ์ด ๋‹คํ•ด ์“ฐ๋Ÿฌ์ง€์ง€ ์•Š์€ ํ•œ ์–ธ์ œ๋“ ์ง€ ์Šค์œ„์นญํ•ด๊ฐ€๋ฉฐ ์ „ํˆฌ๋ฅผ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์บ๋ฆญํ„ฐ๋Š” ํ•˜๋‚˜์˜ Base ์Šคํฌ๋ฆฝํŠธ์™€ Animator๋ฅผ ์ƒ์†๋ฐ›์•„ ์ด๋™, ์ ํ”„, ๊ธฐ๋ณธ๊ณต๊ฒฉ ๋“ฑ ๊ณตํ†ต๋œ ํ–‰๋™์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์บ๋ฆญํ„ฐ๋งˆ๋‹ค์˜ ๋‹ค๋ฅธ ์Šคํ‚ฌ์€ Base ์Šคํฌ๋ฆฝํŠธ์—์„œ ๊ฐ€์ƒํ•จ์ˆ˜์™€ ์˜ค๋ฒ„๋ผ์ด๋”ฉ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•˜์˜€๊ณ , ์• ๋‹ˆ๋ฉ”์ด์…˜์€ Animator Override Controller๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐ™์€ Base Animator๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•˜์—ฌ ์‚ฌ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค.


[ ๋ณด์Šค๋ชฌ์Šคํ„ฐ ]

๋ณด์Šค๋ชฌ์Šคํ„ฐ๋Š” ํ˜„์žฌ๊นŒ์ง€ 2์ข…๋ฅ˜์˜ ๋ณด์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ฐœ๋ฐœ ์ค‘ ์ฒซ๋ฒˆ์งธ ๋ณด์Šค๋ฅผ ๋งŒ๋“  ๋ฐฉ๋ฒ•์ด ๋น„ํšจ์œจ์ ์ด๋ผ๊ณ  ์ƒ๊ฐ๋˜์–ด, ๋‘๋ฒˆ์งธ ๋ณด์Šค๋ถ€ํ„ฐ๋Š” ๊ฐœ๋ฐœ ๊ธฐ๊ฐ„์„ ๋‹จ์ถ•์‹œํ‚ค๊ธฐ ์œ„ํ•œ ๊ณ ๋ฏผ์„ ํ–ˆ๊ณ  ํŒจํ„ด ์ œ์ž‘ ๋„๊ตฌ๋ฅผ ๋งŒ๋“ค์–ด ๊ฐœ๋ฐœ์„ ์ด์–ด๋‚˜๊ฐ”์Šต๋‹ˆ๋‹ค.

์ฒซ๋ฒˆ์งธ ๋ณด์Šค์ธ ์ง€์‹์˜ ๊ณจ๋ ˜์€ ๊ฐ ๋ถ€์œ„๋ณ„๋กœ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋งŒ๋“  ํ›„ ์‹œ๊ฐ„์— ๋”ฐ๋ฅธ ๋ถ€์œ„๋ณ„ ์œ„์น˜๋ฅผ ์• ๋‹ˆ๋ฉ”์ด์…˜์œผ๋กœ ์ง์ ‘ ์ œ์ž‘ํ•˜์—ฌ Animator๋ฅผ ํ†ตํ•ด ์›€์ง์ด๋„๋ก ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ๊ณจ๋ ˜์˜ Ai๋Š” ์Šคํฌ๋ฆฝํŠธ ๋‚ด์—์„œ FSM๊ณผ ๊ฐ์ข… ์กฐ๊ฑด๋ฌธ์— ๋”ฐ๋ผ์„œ ํ–‰๋™์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค. ํƒ€๊ฒŸ๊ณผ์˜ ๊ฑฐ๋ฆฌ์— ๋”ฐ๋ผ์„œ ์›๊ฑฐ๋ฆฌ ๋˜๋Š” ๊ทผ๊ฑฐ๋ฆฌ ๊ณต๊ฒฉ ํŒจํ„ด์„ ์‚ฌ์šฉํ•œ ํ›„, ์งง์€ ์‹œ๊ฐ„ ํƒ€๊ฒŸ์—๊ฒŒ๋กœ ์ด๋™ํ•ด ๋‹ค์‹œ ๊ณต๊ฒฉ์„ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ณด์Šค๋Š” ์† ๋ถ€์œ„๋ฅผ ํƒ€๊ฒฉํ•˜๋ฉด ๋ˆ„์ ๋œ ๋ฐ๋ฏธ์ง€์— ๋”ฐ๋ผ ์† ๋ถ€๋ถ„์ด ํŒŒ๊ดด๋˜๋„๋ก ์„ค๊ณ„ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ํ•œ์ชฝ ์†์ด ํŒŒ๊ดด๋˜๋ฉด ๊ทธ๋•Œ๋ถ€ํ„ฐ ํ•ด๋‹นํ•˜๋Š” ์–ด๊นจ์—์„œ ๋ถˆ / ์–ผ์Œ์†์„ฑ ๋งˆ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‚œ์ด๋„๊ฐ€ ์ฆ๊ฐ€ํ•˜๊ฒŒ ๋˜๋ฉฐ ์ฒด๋ ฅ์ด ๋‚ฎ์•„์ง€๋ฉด ์–ผ๊ตด์—์„œ ๋ ˆ์ด์ €๋ฅผ ๋ฟœ๋Š” ๊ณต๊ฒฉ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ œ์ž‘ํ•˜๋ฉด์„œ ๋ช‡๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ์กด์žฌํ–ˆ์Šต๋‹ˆ๋‹ค.

  1. ๊ณจ๋ ˜์˜ ์–‘์ชฝ ์–ด๊บ ์˜ ์ฑ…์žฅ ์ƒ‰์ด ๋ฐฉํ–ฅ์— ๊ด€๊ฒŒ์—†์ด ํ•ญ์ƒ ๊ณ ์ •์ด์—ˆ์–ด์•ผ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ขŒ/์šฐ ๋ฐฉํ–ฅ ๋‘๊ฐ€์ง€ ๋™์ผํ•œ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๋งŒ๋“ค์—ˆ๋Š”๋ฐ, ์ด ๋ฐฉ์‹์€ ๋™์ž‘์„ ์ˆ˜์ •ํ•  ๋•Œ๋งˆ๋‹ค ๋ฐฉํ–ฅ๋ณ„๋กœ ์ „๋ถ€ ์ˆ˜์ •์„ ํ•ด์ฃผ์–ด์•ผ ํ•ด์„œ ๋ฒˆ๊ฑฐ๋กญ๊ณ  ์‹œ๊ฐ„์ด ๋งŽ์ด ์†Œ๋ชจ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Animator๊ฐ€ ๋ณต์žกํ•ด์ง€๋Š” ๊ฒƒ๋„ ๋งˆ์Œ์— ๋“ค์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋‚˜์ค‘์—์„œ์•ผ ์˜คํžˆ๋ ค Bone์„ ์ ์šฉํ•˜์—ฌ ๋งŒ๋“ค์—ˆ๋‹ค๋ฉด ๋” ์ข‹์•˜์„ํ…๋ฐ ํ•˜๋Š” ์•„์‰ฌ์›€์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ํ•œ๋ฒˆ์˜ ํ•˜๋‚˜์˜ ํ–‰๋™๋งŒ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํŒจํ„ด์ด ๋‹จ์กฐ๋กญ๊ณ  ๋ฐ˜๋ณต๋˜๋Š” ์–‘์ƒ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ํŒจํ„ด์˜ ์ˆ˜๊ฐ€ ๊ทธ๋ฆฌ ๋งŽ์ง€ ์•Š๊ณ  ๋ฐ˜๋ณต๋˜๊ธฐ ๋•Œ๋ฌธ์— ํ”Œ๋ ˆ์ด๊ฐ€ ์ง€๋ฃจํ•˜๋‹ค๋Š” ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›์•˜์—ˆ์Šต๋‹ˆ๋‹ค.
  3. ์˜ค๋กœ์ง€ ์Šคํฌ๋ฆฝํŠธ๋‚ด๋ถ€์—์„œ๋งŒ ๊ณจ๋ ˜์˜ ํ–‰๋™์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์—ˆ๊ณ  ์กฐ๊ฑด๋ฌธ์ด ์ค‘์ฒฉ๋˜๋ฉฐ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง€๋Š” ๋ฌธ์ œ์™€, ์—”์ง„ ์œ„์—์„œ๋Š” ๊ณต๊ฒฉํŒจํ„ด์˜ ์ถ”๊ฐ€๋‚˜ ์ˆ˜์ •์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ๋ฌธ์ œ๋กœ ์ƒ๋‹นํžˆ ๋ถˆํŽธํ•˜์˜€์Šต๋‹ˆ๋‹ค.
  4. ๋˜ํ•œ ๊ณต๊ฒฉ๊ฑฐ๋ฆฌ๋ฅผ ํŒ๋‹จํ•˜๋Š” AttackDistCheck ํ•จ์ˆ˜์—์„œ ๊ณต๊ฒฉํŒจํ„ด์„ ๊ฒฐ์ •ํ•˜๊ณ  ์žˆ์–ด ์ด๋ฆ„๊ณผ ๊ธฐ๋Šฅ์ด ๋งž์ง€ ์•Š๊ณ  ํŒจํ„ด์˜ ์„ ํƒ ํ™•๋ฅ ๋„ ํ•˜๋“œ์ฝ”๋”ฉ๋˜์–ด ์ข‹์ง€ ์•Š์€ ์ฝ”๋“œ๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
๊ณจ๋ ˜์˜ ๊ณต๊ฒฉํŒจํ„ด ์„ ํƒ ์ฝ”๋“œ
public override void Attack()
{
    if (isAttack == false)
    {
        animator.SetBool("isAttack", true);
        animator.SetInteger("attack", atkNum);
    }
}


bool HPTrigger = false;

//๊ณต๊ฒฉ๊ฑฐ๋ฆฌ๋ฅผ ํŒ๋‹จํ•˜๋Š” ์ด๋ฆ„์˜ ํ•จ์ˆ˜์—์„œ ๊ณต๊ฒฉ์„ ๊ฒฐ์ •ํ•˜๊ณ  ์žˆ์–ด ์ข‹์ง€ ๋ชปํ•œ ๊ฒฝ์šฐ..
public override void AttackDistCheck()
{
    if (!animator.GetCurrentAnimatorStateInfo(0).IsName("Neutral_Move"))
    {
        //์ฒด๋ ฅํŠธ๋ฆฌ๊ฑฐ๋กœ 30ํ”„๋กœ๊ฐ€ ๋  ๋•Œ ํ™•์ •์œผ๋กœ ํ•œ๋ฒˆ ์‚ฌ์šฉ, ์ดํ›„ ํ™•๋ฅ ์ ์œผ๋กœ ๋ ˆ์ด์ €๊ณต๊ฒฉ
        if (Stat.CurrentHP <= Stat.TotalHp * 0.3f)
        {
            if (HPTrigger == false)
            {
                HPTrigger = true;
                atkNum = GetDirection() * 20; //์• ๋‹ˆ๋ฉ”์ดํ„ฐ์—์„œ ์ง€์ •๋œ ํ–‰๋™๋ฒˆํ˜ธ๋ฅผ ์„ ํƒ
                state = eFSM.attack; //ํ˜„์žฌ ์ƒํƒœ๋ฅผ ๊ณต๊ฒฉ์œผ๋กœ ์ „ํ™˜
                return;
            }

            else
            {
                bool random = Random.value <= 0.2f ? true : false;
                if (random == true)
                {
                    atkNum = GetDirection() * 20; //์• ๋‹ˆ๋ฉ”์ดํ„ฐ์—์„œ ์ง€์ •๋œ ํ–‰๋™๋ฒˆํ˜ธ๋ฅผ ์„ ํƒ
                    state = eFSM.attack;
                    return;
                }
            }
        }

        //๊ทผ๊ฑฐ๋ฆฌ ๊ณต๊ฒฉ๋ฒ”์œ„์— ์žˆ๋‹ค๋ฉด
        if (Vector3.Distance(target.position, transform.position) < meleeArea)
        {
            //๋‘ํŒ” ๋‹ค ํŒŒ๊ดด์‹œ
            if (leftH.activeSelf == false && rightH.activeSelf == false)
            {
                atkNum = GetDirection() * (10 + 1); //์• ๋‹ˆ๋ฉ”์ดํ„ฐ์—์„œ ์ง€์ •๋œ ํ–‰๋™๋ฒˆํ˜ธ๋ฅผ ์„ ํƒ
                state = eFSM.attack;
            }

            //์˜ค๋ฅธ์† ํŒŒ๊ดด์‹œ
            else if (rightH.activeSelf == false)
            {
                if (GetDirection() == 1)
                {
                    atkNum = GetDirection() * 1;
                    state = eFSM.attack;
                }
                else if (GetDirection() == -1)
                {
                    if (Mathf.Abs(target.position.x - transform.position.x) < 2f)
                    {
                        int rand = Random.value <= 0.8f ? 3 : 11;
                        atkNum = GetDirection() * rand;
                        state = eFSM.attack;
                    }
                }
            }
            // ์˜ค๋ฅธ์ชฝ    ๊ทผ์ ‘: ๋ฐ€์น˜๊ธฐ   ์›๊ฑฐ๋ฆฌ: ์ ํ”„, ๋จธ๋ฆฌ์ฐ๊ธฐ
            // ์™ผ์ชฝ  ๊ทผ์ ‘: ํ•œ์†์ฐ๊ธฐ  ์›๊ฑฐ๋ฆฌ: ์ ํ”„

            //์™ผ์† ํŒŒ๊ดด์‹œ
            else if (leftH.activeSelf == false)
            {
                if (GetDirection() == -1)
                {
                    atkNum = GetDirection() * 1;
                    state = eFSM.attack;
                }
                else if (GetDirection() == 1)
                {
                    if (Mathf.Abs(target.position.x - transform.position.x) < 2f)
                    {
                        int rand = Random.value <= 0.8f ? 3 : 11;
                        atkNum = GetDirection() * rand;
                        state = eFSM.attack;
                    }
                }
            }
            //์˜ค๋ฅธ์† ๊ทผ์ ‘: ํ•œ์†์ฐ๊ธฐ ์›๊ฑฐ๋ฆฌ ์ ํ”„
            //์™ผ์† ๊ทผ์ ‘:๋ฐ€์น˜๊ธฐ ์›๊ฑฐ๋ฆฌ ์ ํ”„ ๋จธ๋ฆฌ์ฐ๊ธฐ

            //๋ฉ€์ฉกํ•  ๋•Œ
            else
            {
                //๊ทผ์ ‘ ๋‚ด๋ ค์ฐ๊ธฐ
                if (Mathf.Abs(target.position.x - transform.position.x) >= 2f)
                {
                    atkNum = GetDirection() * 1;
                }
                else
                {
                    atkNum = GetDirection() * Random.Range(2, 4);
                }
                state = eFSM.attack;
            }
        }

        //์›๊ฑฐ๋ฆฌ ๊ณต๊ฒฉ๋ฒ”์œ„์— ์žˆ๋‹ค๋ฉด
        else if (Vector3.Distance(target.position, transform.position) < rangeArea)
        {
            if (rightH.activeSelf == false && leftH.activeSelf == false)
            {
                atkNum = GetDirection() * (10 + 1);
                state = eFSM.attack;
            }

            else if (leftH.activeSelf == false)
            {
                if (GetDirection() == -1)
                {
                    atkNum = GetDirection() * (10 + Random.Range(1, 3));
                    state = eFSM.attack;
                }
                else if (GetDirection() == 1)
                {
                    atkNum = GetDirection() * (10 + 1);
                    state = eFSM.attack;
                }
            }

            else if (rightH.activeSelf == false)
            {
                if (GetDirection() == 1)
                {
                    atkNum = GetDirection() * (10 + Random.Range(1, 3));
                    state = eFSM.attack;
                }
                else if (GetDirection() == -1)
                {
                    atkNum = GetDirection() * (10 + 1);
                    state = eFSM.attack;
                }
            }

            //๋ฉ€์ฉกํ• ๋•Œ
            else
            {
                atkNum = GetDirection() * (10 + Random.Range(1, 3));
                state = eFSM.attack;
            }
        }
        //์ผ์ •์‹œ๊ฐ„ ๋’ค ๋‹ค์‹œ ๊ณต๊ฒฉํ• ์ง€ ๋ง์ง€ ํŒ๋‹จ์€ Boss_CancleAttack์—์„œ
    }
}


first
< ๊ณจ๋ ˜์˜ ๊ณต๊ฒฉํŒจํ„ด ์• ๋‹ˆ๋ฉ”์ด์…˜ ํ…Œ์ŠคํŠธ>

first
< ๊ณจ๋ ˜์˜ Animator. ์ˆ˜๋งŽ์€ transition์œผ๋กœ ์—ฐ๊ฒฐ๋˜์–ด์žˆ๋‹ค. >

๊ทธ๋ž˜์„œ

๋‘๋ฒˆ์งธ ๋ณด์Šค์ธ ์‹œ๊ฐ„์˜ ๊ด€๋ฆฌ์ž ๋Š” ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋ถ€์œ„๋ณ„๋กœ ์กฐํ•ฉํ•˜์—ฌ ์‚ฌ์šฉํ–ˆ๋˜ ์ฒซ ๋ณด์Šค์™€ ๋‹ฌ๋ฆฌ, ๋ณด์Šค์˜ ๋ชธ์ฒด๋ฅผ ์ตœ์†Œํ•œ์˜ ์˜ค๋ธŒ์ ํŠธ๋งŒ์œผ๋กœ ๊ตฌ์„ฑํ–ˆ๊ณ  ๋‹จ์ผ ์Šคํ”„๋ผ์ดํŠธ๊ฐ€ ํ”„๋ ˆ์ž„์— ๋”ฐ๋ผ ๋ณ€ํ•˜๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋ฐฉ์‹์œผ๋กœ ์ œ์ž‘๋ฐฉ์‹์„ ๋ณ€๊ฒฝํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๊ทธ์™€ ๋™์‹œ์— ํŒจํ„ด ์ œ์ž‘ ๋„๊ตฌ์˜ ๋„์ž…์œผ๋กœ ์•ž์„  ๋ฌธ์ œ๋“ค์„ ๋Œ€๋ถ€๋ถ„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋””์ž์ด๋„ˆ๊ฐ€ ๊ฐ์ข… ํ–‰๋™์˜ ํ”„๋ ˆ์ž„์„ ๋งŒ๋“ค์–ด๋‚ด๋Š๋ผ ์กฐ๊ธˆ ๊ณ ์ƒํ•˜๊ธฐ๋Š” ํ–ˆ์ง€๋งŒ..

  1. ํŒจํ„ด ์ƒ์„ฑ๊ธฐ๋ฅผ ์ด์šฉํ•ด ๋ฏธ๋ฆฌ ์ •์˜๋˜์–ด์žˆ๋Š” ์ „์ฒด ๋™์ž‘๋“ค ์ค‘์— ์ˆ˜ํ–‰ํ•  ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ง์ ‘ ์„ ํƒํ•˜๊ณ  ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— Animator๊ฐ€ transition์œผ๋กœ ๋ณต์žกํ•ด์ง€๋Š” ๋ฌธ์ œ๊ฐ€ ํ•ด์†Œ๋˜์—ˆ๊ณ  ๋™์ž‘์˜ ์ถ”๊ฐ€ ๋ฐ ์ˆ˜์ •๋„ ์šฉ์ดํ•ด์กŒ์Šต๋‹ˆ๋‹ค.
  2. ๋˜ํ•œ ํŒจํ„ด ์ƒ์„ฑ๊ธฐ์—์„œ ํ•˜๋‚˜์˜ ํŒจํ„ด์— ์—ฌ๋Ÿฌ ํ–‰๋™์„ ์ฝค๋ณด์ฒ˜๋Ÿผ ์—ฐ๋‹ฌ์•„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜์—ฌ ํ•œ๋ฒˆ์— ํ•˜๋‚˜์˜ ํ–‰๋™๋งŒ ์ˆ˜ํ–‰ํ•ด ๋‹จ์กฐ๋กญ๋˜ ํŒจํ„ด์„ ๋‹ค์–‘ํ™”ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•ด์„œ๋Š” ํ•˜๋‹จ ๋ชฌ์Šคํ„ฐ ํŒจํ„ด ์ƒ์„ฑ ๋„๊ตฌ ํ•ญ๋ชฉ์—์„œ ์ถ”๊ฐ€๋กœ ์„ค๋ช…ํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
  3. ํŒจํ„ด ์ƒ์„ฑ๊ธฐ๊ฐ€ ํŒจํ„ด์„ ์„ ํƒํ•˜๋Š” ๋ถ€๋ถ„์„ ๋Œ€์‹ ํ•จ์œผ๋กœ์„œ ์ฒซ๋ฒˆ์งธ ๋ณด์Šค์˜ ์ค‘์ฒฉ์กฐ๊ฑด๋ฌธ ๋“ฑ ๋ณต์žกํ–ˆ๋˜ ํŒจํ„ด์„ ํƒํ•จ์ˆ˜์˜ ์ฝ”๋“œ๊ฐ€ ๊ต‰์žฅํžˆ ๊ฐ„๊ฒฐํ•ด์กŒ์Šต๋‹ˆ๋‹ค. ํŒจํ„ด ์ƒ์„ฑ๊ธฐ๋Š” ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์•„๋‹Œ ์—”์ง„์œ„์—์„œ ์ž‘์—…ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์Šคํฌ๋ฆฝํŠธ๋กœ๋งŒ ์ œ์–ด ๊ฐ€๋Šฅํ•˜๋˜ ๋ฌธ์ œ๋„ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  4. ํ•จ์ˆ˜์˜ ์ด๋ฆ„๊ณผ ๊ธฐ๋Šฅ์ด ๋งž์ง€ ์•Š๋˜ ๋ถ€๋ถ„๋„ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ถ„๋ฆฌ๋˜์–ด AttackDistCheck๋Š” ์˜ค๋กœ์ง€ ๊ณต๊ฒฉํƒ€์ž…์„ ํŒ๋‹จํ•˜๋Š” ๊ธฐ๋Šฅ๋งŒ ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
์‹œ๊ฐ„๋ณด์Šค์˜ ๊ณต๊ฒฉํŒจํ„ด ์„ ํƒ ์ฝ”๋“œ
//FSM์—์„œ ์ƒํƒœ๊ฐ€ move์ผ ๋•Œ ๋‹ค์Œ ๊ณต๊ฒฉ์˜ ํƒ€์ž…์„ ํŒ๋‹จํ•œ๋‹ค.
 public virtual void AttackDistCheck()
{
    //์บ๋ฆญํ„ฐ์™€์˜ ๊ฑฐ๋ฆฌ๋ฅผ ์ฒดํฌํ•˜์—ฌ ๋‹ค์Œ ๊ณต๊ฒฉ์˜ range/melee ํŒ๋‹จ
    if (Vector3.Distance(target.position, transform.position) < meleeArea)
    {
        typeOfAttack = eEnemy_TypeOfAttack.MELEE;
    }
    else 
    {
        typeOfAttack = eEnemy_TypeOfAttack.RANGE;
    }

    //FSM ์ƒํƒœ๋ฅผ ๊ณต๊ฒฉ์œผ๋กœ ์ „ํ™˜
    SetState(eFSM.attack);
}

//FSM์—์„œ ์ƒํƒœ๊ฐ€ attack์ด ๋˜๋ฉด ์ˆ˜ํ–‰๋œ๋‹ค.
public virtual void Attack()
{
    //์• ๋‹ˆ๋ฉ”์ดํ„ฐ๋ฅผ ๊ณต๊ฒฉ์ƒํƒœ๋กœ ์ „ํ™˜
    if (isAttack == false)
    {
        animator.SetBool("isAttack", true);
    }

    //์ด๋™ ์ค‘์ด๋ผ๋ฉด ์ฝ”๋ฃจํ‹ด์„ ๋Š๊ณ  ๊ฐ•์ œ๋กœ ๊ณต๊ฒฉ ์ˆ˜ํ–‰
    if (coroutine != null) 
        StopCoroutine(coroutine);

    //ํŒจํ„ด ์ƒ์„ฑ๊ธฐ ๋‚ด์˜ ๊ณต๊ฒฉํŒจํ„ด์„ ์„ ํƒํ•˜์—ฌ ์ˆ˜ํ–‰ํ•  ํ–‰๋™๋“ค์„ ํ์— ๋‹ด๋Š”๋‹ค.
    actionQueue = enemyPatternManager.SelectPattern(typeOfAttack, this);

    // ํ์— ๋‹ด๊ธด ํ–‰๋™์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•œ๋‹ค. ๋นˆ ํŒจํ„ด์ผ ๊ฒฝ์šฐ ์˜ˆ์™ธ์ฒ˜๋ฆฌ
    if(actionQueue != null)
    {
        ChangeAnimation(actionQueue.Dequeue().action);
    }   
}


first
< ์‹œ๊ฐ„๋ณด์Šค์˜ ๊ณต๊ฒฉํŒจํ„ด ์• ๋‹ˆ๋ฉ”์ด์…˜ ํ…Œ์ŠคํŠธ>

first
< ์ƒˆ๋กœ ๊ตฌ์„ฑํ•œ Animator. ๋‹จ์ˆœํžˆ ์• ๋‹ˆ๋ฉ”์ด์…˜๋งŒ ์ •์˜๋˜์–ด ์žˆ๋‹ค. >

์‹œ๊ฐ„์˜ ๊ด€๋ฆฌ์ž๋Š” ์‹œ๊ณ„์นจ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ์ข… ๊ณต๊ฒฉ์„ ์‚ฌ์šฉํ•˜๋ฉฐ ์ฒด๋ ฅ์ด ๋‚ฎ์•„์ง€๋ฉด ๊ณต์ค‘์— ์˜ฌ๋ผ๊ฐ€ ์ง€์ƒ์— ๋ชจ๋ž˜์‹œ๊ณ„๋ฅผ 3๊ฐœ ์†Œํ™˜ํ•˜๋ฉฐ 2ํŽ˜์ด์ฆˆ๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋ž˜์‹œ๊ณ„๊ทผ์ฒ˜ ์˜์—ญ์— ๋“ค์–ด๊ฐ€๋ฉด SP๊ฐ€ ํšŒ๋ณต๋˜์ง€ ์•Š๋Š” ๋””๋ฒ„ํ”„๊ฐ€ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค. ๋ชจ๋ž˜์‹œ๊ณ„๋ฅผ ๊ณต๊ฒฉํ•˜์—ฌ ๋ถ€์ˆ  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ถ€์„œ์ง„ ๋ชจ๋ž˜์‹œ๊ณ„๋Š” ์ผ์ •์‹œ๊ฐ„ ํ›„ ์‹œ๊ฐ„์„ ๋˜๋Œ๋ ค ์ž๊ฐ€ ๋ณต๊ตฌํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์‹  ๋””๋ฒ„ํ”„ ์˜์—ญ์ด ์ดˆ๊ธฐํ™”๋˜์–ด ์•„์ฃผ ์ž‘์€ ๋ฒ”์œ„๋กœ ์‹œ์ž‘ํ•ด ์กฐ๊ธˆ์”ฉ ๋„“์–ด์ง‘๋‹ˆ๋‹ค.

โ—ผ ๋ชฌ์Šคํ„ฐ ํŒจํ„ด ์ƒ์„ฑ ๋„๊ตฌ

์ฒซ๋ฒˆ์งธ ๋ณด์Šค์ธ โ€œ์ง€์‹์˜ ๊ณจ๋ ˜โ€์€ ์ฝ”๋“œ๋กœ๋งŒ ํŒจํ„ด์„ ๋งŒ๋“ค์—ˆ๋Š”๋ฐ ์‹œ๊ฐ„์ด ๊ต‰์žฅํžˆ ์˜ค๋ž˜๊ฑธ๋ ธ๊ณ  ํŒจํ„ด ์ˆ˜์ •์ด๋‚˜ ์ถ”๊ฐ€๋„ ์ƒ๋‹นํžˆ ๋ถˆํŽธํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‘๋ฒˆ์งธ ๋ณด์Šค๋ถ€ํ„ฐ๋Š” ๋””์ž์ด๋„ˆ๋„ ์‰ฝ๊ฒŒ ํŒจํ„ด์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ณ , ์ดํ›„ ์ œ์ž‘ํ•  ๋ณด์Šค๋“ค์˜ ๊ฐœ๋ฐœ์†๋„๋ฅผ ๋†’์ด๊ธฐ ์œ„ํ•˜์—ฌ custom inspector๋ฅผ ์ด์šฉํ•˜์—ฌ ํŒจํ„ด ์ œ์ž‘ ๋„๊ตฌ๋ฅผ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค.
๋ชฌ์Šคํ„ฐ ํŒจํ„ด ์ƒ์„ฑ๊ธฐ๋Š” ๋ชฌ์Šคํ„ฐ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ์ „์ฒด ํŒจํ„ด๋“ค์„ ๋งŒ๋“œ๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ๋ฐœ๋™ ํƒ€์ž…์ด๋‚˜ ์กฐ๊ฑด ๋“ฑ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๊ณ  ๊ฐ€์ค‘์น˜ ํ™•๋ฅ ์„ ์ ์šฉํ•œ ๋ฐœ๋™ ํ™•๋ฅ ์„ ์‰ฝ๊ฒŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋น„์Šทํ•˜๋ฉด์„œ๋„ ๋‹ค๋ฅธ ๊ณต๊ฒฉ์„ ํ•˜๋Š” ํŒจํ„ด๋“ค์„ ๋งŒ๋“ค๊ฑฐ๋‚˜, ๊ฐ™์€ ํŒจํ„ด์ž„์—๋„ ๋‚จ์€ ์ฒด๋ ฅ ์ˆ˜์ค€์— ๋”ฐ๋ผ ๊ฐ•ํ™”๋œ ๊ณต๊ฒฉ์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ํ•  ์ˆ˜ ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

first
< ๋‘๋ฒˆ์งธ ๋ณด์Šค์˜ ์‹ค์ œ ํŒจํ„ด ๋ฐ์ดํ„ฐ >

๊ฐ ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ์„ค๋ช…์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ํ•ญ๋ชฉ ์„ค๋ช…
ํƒ€์ž… ๊ทผ์ ‘(MELEE), ์›๊ฑฐ๋ฆฌ(RANGE), ํŠน์ˆ˜(SPECIAL) ํƒ€์ž… ์„ ํƒ
์ด๋ฆ„ ํŒจํ„ด์˜ ์ด๋ฆ„ ์„ค์ •
๊ฐ€์ค‘์น˜ ํŒจํ„ด์˜ ๋ฐœ๋™ ๋น„์œจ์„ ๊ฐ€์ค‘์น˜๋กœ ์ˆ˜์น˜ํ™”
ํ™•๋ฅ  ๊ฐ€์ค‘์น˜๊ฐ€ ์ ์šฉ๋œ ๋ฐœ๋™ ํ™•๋ฅ , ๊ทผ์ ‘(M), ์›๊ฑฐ๋ฆฌ(R) ๊ฐœ๋ณ„ ์ ์šฉ
์ฟจํƒ€์ž„ ํŒจํ„ด ์‚ฌ์šฉ ํ›„ ์žฌ์‚ฌ์šฉ ๋Œ€๊ธฐ์‹œ๊ฐ„ (๋‹จ์œ„:์ดˆ)
์ฒด๋ ฅํŠธ๋ฆฌ๊ฑฐ ํŒจํ„ด์˜ ์‚ฌ์šฉ์กฐ๊ฑด. ๊ธฐ์ž…๋œ ์ฒด๋ ฅ ์ดํ•˜์ผ ๊ฒฝ์šฐ์—๋งŒ ํ™•๋ฅ ๊ณ„์‚ฐ์— ํฌํ•จ
์ฒด๋ ฅ๋น„์œจ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ ์ ์˜ ์ฒด๋ ฅ์ด ์ผ์ • ์ˆ˜์น˜์ผ๋•Œ ๋ฐœ๋™ ํ™•๋ฅ ์„ ํ™•์ธ ๊ฐ€๋Šฅ
์„ธ๋ถ€ํŒจํ„ด ์ด๋ฆ„์„ค์ • ๋ชฌ์Šคํ„ฐ์—๊ฒŒ ํ• ๋‹น๋œ ํ–‰๋™๋“ค์— ์ด๋ฆ„์„ ๋ถ€์—ฌ

๋ชฌ์Šคํ„ฐ ์ž…์žฅ์—์„œ ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ์ž์‹ ์˜ ๊ทผ๊ฑฐ๋ฆฌ ๊ณต๊ฒฉ ๋ฒ”์œ„ ๋‚ด์— ์žˆ๋‹ค๋ฉด MELEEํƒ€์ž… ํŒจํ„ด์„, ๋ฒ”์œ„ ๋ฐ–์— ์žˆ๋‹ค๋ฉด RANGEํƒ€์ž… ํŒจํ„ด์„ ๊ฐ€์ค‘์น˜ํ™•๋ฅ ์— ๋”ฐ๋ผ ์„ ํƒํ•˜์—ฌ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์ผ ์ผ์ • ์ฒด๋ ฅ ์ดํ•˜๋กœ ๋‚ด๋ ค๊ฐ”์„ ๊ฒฝ์šฐ, SPECIALํƒ€์ž… ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ํŒจํ„ด์„ ์ˆ˜ํ–‰ํ•˜๋ฉด ๊ทธ ํŒจํ„ด์€ ์žฌ์‚ฌ์šฉ ๋Œ€๊ธฐ์‹œ๊ฐ„์„ ๊ฐ€์ง€๋ฉฐ, ์ฒด๋ ฅํŠธ๋ฆฌ๊ฑฐ๊ฐ€ ์„ค์ •๋œ ๊ฒฝ์šฐ์—๋Š” ํŠน์ • ์ฒด๋ ฅ ์ดํ•˜์ผ ๋•Œ๋งŒ ๊ฐ€์ค‘์น˜๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ํ™•๋ฅ ์ด 0์œผ๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

๊ฐ€์ค‘์น˜ ํ™•๋ฅ ์„ ์ ์šฉํ•œ ํŒจํ„ด ์„ ํƒ ์ฝ”๋“œ
public Queue<EnemyAttack> SelectPattern(eEnemy_TypeOfAttack attackType, EnemyActor actor)
{
    //์ฒด๋ ฅ์— ๋”ฐ๋ผ ํ™•๋ฅ  ๊ฐฑ์‹  
    CalculatePatternProb(actor);

    //์„ ํƒ๋œ ํŒจํ„ด 
    EnemyPattern selected = null;

    if (patternList.Count == 0)
        patternList = patterns;

    //ํ™•๋ฅ ๊ฐ’์— ๋”ฐ๋ผ์„œ ํŒจํ„ด ๋ฆฌ์ŠคํŠธ๋ฅผ ์ •๋ ฌ
    patternList.Sort((x, y) => float.Parse(x.probability).CompareTo(float.Parse(y.probability)));

    //์ŠคํŽ˜์…œ ํŒจํ„ด ์šฐ์„  ์ฒดํฌ
    for (int i = 0; i < patternList.Count; ++i)
    {
        if (patternList[i].typeOfAttack == eEnemy_TypeOfAttack.SPECIAL)
        {
            float HPratio = ((float)actor.Stat.CurrentHP / (float)actor.Stat.TotalHp) * 100f;
            bool triggerCheck = patternList[i].triggerRatio >= HPratio;

            //์ฒด๋ ฅ์กฐ๊ฑด์ด ์•ˆ๋งž์œผ๋ฉด ํŒจ์Šค
            if (!triggerCheck) continue;

            //์กฐ๊ฑด์— ๋งž๋Š” ํŒจํ„ด์ผ ๊ฒฝ์šฐ
            selected = patternList[i];

            patternList.Remove(patternList[i]);
            return SelctActions(selected, actor);
        }
    }

    float randomValue = UnityEngine.Random.value * 100f;
    float accrueValue = 0; //๋ˆ„์  ๊ฐ€์ค‘์น˜๊ฐ’
    for (int i = 0; i < patternList.Count; ++i)
    {
        //ํƒ€์ž…์ด ๋‹ค๋ฅธ ํŒจํ„ด์€ ์„ ํƒ์—์„œ ์ œ์™ธ
        if (patternList[i].typeOfAttack != attackType) continue;
        
        // ๊ฐ€์ค‘์น˜ ํ™•๋ฅ ์— ๋”ฐ๋ผ์„œ ์กฐ๊ฑด์ด ๋งž๋Š”์ง€ ํ™•์ธ
        float prob = float.Parse(patternList[i].probability);

        //ํ™•๋ฅ ์ด 0์ด๋ฉด ๊ทธ ์•ก์…˜์„ ์ฆ‰์‹œ ํŒจ์Šค
        if (prob == 0) continue;

        if ((prob + accrueValue) > randomValue)
        {
            //* ํŠธ๋ฆฌ๊ฑฐ ์•ก์…˜ ์ฒดํฌ
            if (patternList[i].isTriggerAction == true)
            {
                float HPratio = ((float)actor.Stat.CurrentHP / (float)actor.Stat.TotalHp) * 100f;
                bool triggerCheck = patternList[i].triggerRatio >= HPratio;

                //ํŠธ๋ฆฌ๊ฑฐ์กฐ๊ฑด์ธ๋ฐ ๋งŒ์•ฝ ์ฒด๋ ฅ์กฐ๊ฑด์ด ์•ˆ๋งž์œผ๋ฉด ๊ทธ ์•ก์…˜์„ ํŒจ์Šค
                if (!triggerCheck) continue;
            }

            //*์ฟจํƒ€์ž„ ์ฒดํฌ
            if (patternList[i].isCoolDown == true) //์ฟจํƒ€์ž„์ค‘์ด๋ฉด
            {
                if (selected == patternList[i])
                {
                    accrueValue += prob;
                    continue;
                }

                float tmpProb = 100f - float.Parse(patternList[i].probability);
                randomValue = UnityEngine.Random.Range(0, tmpProb);
                accrueValue = 0;
                selected = patternList[i];
                i = -1;
                continue;

            }

            selected = patternList[i];
            break;
        }
        else
        {
            accrueValue += prob;
        }
        
    }

    //null์ด ๋ฆฌํ„ด๋˜๋ฉด ๋ฌด์–ธ๊ฐ€ ์ž˜๋ชป๋œ ๊ฒƒ์ด๋ฏ€๋กœ ์˜ˆ์™ธ์ฒ˜๋ฆฌ
    if (selected == null)
    {
        Debug.LogError("ํŒจํ„ด ์„ ํƒ ์—๋Ÿฌ! ์žฌ์„ ํƒ์„ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค");
        try
        {
            return SelectPattern(attackType, actor); ;
        }
        catch
        {
            Debug.LogError("์žฌ์„ ํƒ ์‹คํŒจ!");
            return null;
        }
    }

    //์„ ํƒ๋œ ํŒจํ„ด์˜ ์ฟจํƒ€์ž„ ํ™œ์„ฑํ™”
    if (selected.coolTime > 0)
        SetCoolDown(selected);

    //์„ ํƒ๋œ ํŒจํ„ด ์•ˆ์˜ ํ–‰๋™ ์ˆ˜ํ–‰ 
    return SelctActions(selected, actor);
}


ํ•˜๋‚˜์˜ ํŒจํ„ด์€ ๋ชฌ์Šคํ„ฐ๋“ค์—๊ฒŒ ํ• ๋‹น๋œ ํ–‰๋™ํƒ€์ž…๋“ค์˜ ๋ฌถ์Œ์œผ๋กœ, ํ•˜๋‚˜์˜ ํŒจํ„ด์•ˆ์— ํ–‰๋™๋“ค์„ ์—ฐ์ด์–ด ์‚ฌ์šฉํ•˜๋„๋ก ์„ค์ •ํ•˜๋ฉด ๋ณด์Šค์˜ ์—ฐ์†๋™์ž‘์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ํŒจํ„ด์„ ์„ ํƒํ•˜๋ฉด ํ•˜๋‹จ ์„ธ๋ถ€ ํŒจํ„ด ์ •๋ณด ๊ตฌ์—ญ์— ์–ด๋–ค ํ–‰๋™๋“ค์„ ์ˆ˜ํ–‰ํ•  ๊ฒƒ์ธ์ง€ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ ํ–‰๋™์€ ํ•˜๋‚˜์˜ ํ–‰๋™์ด ๋๋‚˜๋ฉด ์ˆœ์„œ๋Œ€๋กœ, ๋˜ ์—ฐ์†์ ์œผ๋กœ ์ˆ˜ํ–‰๋˜๋ฏ€๋กœ ๋ชฌ์Šคํ„ฐ๋Š” ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํ–‰๋™์„ ์ด์–ด๊ฐ‘๋‹ˆ๋‹ค.

ํŒจํ„ด ์ƒ์„ฑ๊ธฐ๋Š” Reorderable List๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜์˜€๊ณ , ๋‚ด๋ถ€๋Š” queue์™€ list๋กœ ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

์˜ˆ) ํ˜„์žฌ ์„ ํƒ๋œ โ€œ๋Œ•๋Œ์ง„๋Œ•โ€์ด๋ผ๋Š” ํŒจํ„ด์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ–‰๋™๋“ค์˜ ์ง‘ํ•ฉ์ž…๋‹ˆ๋‹ค.

  1. ๋‚ ์•„์˜ค๋ฅด๊ธฐ -> 2. 360๋„ ์‹œ๊ณ„์นจ ๋ฐœ์‚ฌ -> 3. ์ „์ง„ ๋Œ€์‰ฌ -> 4. 360๋„ ์‹œ๊ณ„์นจ ๋ฐœ์‚ฌ -> 5. ๋‚ด๋ ค์˜ค๊ธฐ
์„ธ๋ถ€ ํŒจํ„ด ์„ ํƒ ์ฝ”๋“œ
Queue<EnemyAttack> SelctActions(EnemyPattern pattern, EnemyActor actor)
{
    Queue<EnemyAttack> action = new Queue<EnemyAttack>();
    List<EnemyAttack> attackList = pattern.attacks;

    //ํŒจํ„ด์ƒ์„ฑ๊ธฐ์—์„œ ๋น„์–ด์žˆ๋Š” ํŒจํ„ด์ด ๋‚จ์•„์žˆ์„ ๋•Œ ์˜ˆ์™ธ์ฒ˜๋ฆฌ
    if (attackList.Count == 0)
        Debug.LogError("ํ–‰๋™์ด ์„ค์ •๋˜์ง€ ์•Š์€ ๋น„์–ด์žˆ๋Š” ํŒจํ„ด์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค!");

    for (int depth = 0; depth < attackList.Count; depth++)
    {
        //* ํŠธ๋ฆฌ๊ฑฐ ์•ก์…˜ ์ฒดํฌ
        if (attackList[depth].isTriggerAction)
        {
            float ratio = ((float)actor.Stat.CurrentHP / (float)actor.Stat.TotalHp) * 100f;
            bool triggerCheck = attackList[depth].triggerRatio >= ratio;

            //ํŠธ๋ฆฌ๊ฑฐ์•ก์…˜์ธ๋ฐ ๋งŒ์•ฝ ์ฒด๋ ฅ์กฐ๊ฑด์ด ์•ˆ๋งž์œผ๋ฉด ๊ทธ ์•ก์…˜์„ ํŒจ์Šค
            if (!triggerCheck) continue;
        }
        //ํŒจํ„ด ๋ฆฌ์ŠคํŠธ ๋‚ด๋ถ€์˜ ํ–‰๋™์„ action ํ์— ์‚ฝ์ž…
        action.Enqueue(attackList[depth]);
    }
    //์ˆ˜ํ–‰ํ•ด์•ผ ํ•  ํ–‰๋™๋“ค์ด ๋‹ด๊ธด queue๋ฅผ ๋ฆฌํ„ด
    return action;
}


โ—ผ ์‰์ด๋”

์‰์ด๋” ๊ณต๋ถ€๋ฅผ ์œ„ํ•ด HLSL๋กœ ํ•„์š”ํ•œ ํšจ๊ณผ๋“ค์„ ๊ตฌํ˜„ํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•˜์˜€์Šต๋‹ˆ๋‹ค.
๊ฐ„๋‹จํ•œ ํšจ๊ณผ๋“ค์ด์ง€๋งŒ ์‰์ด๋”ํ•จ์ˆ˜๊ฐ€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€๋ฅผ ์•Œ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

  • ๋ Œ๋”๋ง ์ˆœ์„œ ์กฐ์ •์„ ์œ„ํ•œ ์‰์ด๋”

    2D์™€ 3D๋ฅผ ๋™์‹œ์— ์‚ฌ์šฉํ•˜๋‹ค๋ณด๋‹ˆ ๊ธฐ๋ณธ material๋กœ๋Š” ๋ Œ๋”๋ง ์ˆœ์„œ์—์„œ ์˜๋„ํ•˜์ง€ ์•Š์€ ๋ฌธ์ œ๋“ค์ด ๋ฐœ์ƒํ•˜์˜€์Šต๋‹ˆ๋‹ค. 3D ํŒŒํ‹ฐํด๋“ค์ด 2D ์Šคํ”„๋ผ์ดํŠธ์— ๊ฐ€๋ ค์ง„๋‹ค๊ฑฐ๋‚˜ 2D๊ฐ€ 3D ๋ฐฐ๊ฒฝ ๋’ค์—์„œ ๋ Œ๋”๋ง ๋œ๋‹ค๊ฑฐ๋‚˜ ํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ฐ™์€ 2D์˜ค๋ธŒ์ ํŠธ ์‚ฌ์ด์—์„œ๋„ ์บ๋ฆญํ„ฐ์™€ ๋ณด์Šค ์˜ค๋ธŒ์ ํŠธ์˜ z-fight๋ฌธ์ œ ๋“ฑ ๋ Œ๋”๋ง์— ๊ด€ํ•œ ์ด์Šˆ๊ฐ€ ๋งŽ์•˜์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ํŒŒํ‹ฐํด / 3D๋ฐฐ๊ฒฝ์˜ค๋ธŒ์ ํŠธ / ์บ๋ฆญํ„ฐ / ๋ณด์Šค ๋“ฑ ์ข…๋ฅ˜๋ณ„๋กœ Render Queue๋ฅผ ์กฐ์ •ํ•œ ์‰์ด๋”์™€ material์„ ๋งŒ๋“ค์–ด ๋ Œ๋”๋ง ์ˆœ์„œ๋ฅผ ์˜๋„ํ•œ ๋Œ€๋กœ ์ง€์ •ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

  • Outline ์‰์ด๋”
    ์บ๋ฆญํ„ฐ ์„ ํƒํ™”๋ฉด๊ณผ ์ „ํˆฌ ์ค‘ ๋ฌด์ ํšจ๊ณผ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์šฉ๋„๋กœ Outline์„ ์‚ฌ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค.

  • Dissolve ์‰์ด๋”
    ๊ณจ๋ ˜๋ณด์Šค์˜ ์–ผ์Œ๋งˆ๋ฒ•์ด ๋“ฑ์žฅํ•  ๋•Œ Dissolveํšจ๊ณผ๋ฅผ ์‚ฌ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค.

  • Stencil ์‰์ด๋”
    ์„ธ๋ฒˆ์งธ ๋ณด์Šค์˜ ํฌํƒˆ ํšจ๊ณผ๋ฅผ ์œ„ํ•ด ๊ฐ„๋‹จํ•œ Stencil ์‰์ด๋”๋ฅผ ์‚ฌ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๐Ÿ”ธ ๊ฐœ๋ฐœ ์˜๋„

๊ณ ๋“ฑํ•™๊ต๋•Œ ์นœ๊ตฌ๋“ค๊ณผ ํ•จ๊ป˜ ์ œ์ž‘ํ•ด ๋†€์•˜๋˜ ๋ณด๋“œ๊ฒŒ์ž„์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ๊ฒŒ์ž„์—์„œ๋Š” ๋‹น์‹œ ๋งŒ๋“ค์–ด๋‘์—ˆ๋˜ ์„ธ๊ณ„๊ด€๊ณผ ์บ๋ฆญํ„ฐ๋ฅผ ๋ถ€ํ™œ์‹œ์ผœ๋ณด๊ณ ์ž ํ•˜์˜€๊ณ  ๊ทธ ๊ณผ์ •์€ ์ถ”์–ต ์†์˜ ์žฅ๋‚œ๊ฐ์„ ๋‹ค์‹œ ์ ‘ํ•œ ๊ฒƒ ์ฒ˜๋Ÿผ ์ฆ๊ฑฐ์› ์Šต๋‹ˆ๋‹ค. ์•ก์…˜๊ฒŒ์ž„์„ ์ข‹์•„ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์•ก์…˜์ด ์žˆ๋Š” ๊ฒŒ์ž„์„ ๋งŒ๋“ค์–ด๋ณด๋ ค๊ณ  ํ–ˆ์œผ๋‚˜, ๊ตฌํ˜„ ๋ฐฉ์‹ ๋“ฑ์— ๊ณ ๋ฏผ์ด ๋งŽ์•„ ์ƒ๊ฐ๋ณด๋‹ค ์–ด๋ ค์šด ์ž‘์—…์ด์—ˆ๋˜ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด๋ฒˆ ํ”„๋กœ์ ํŠธ๋Š” ๊ธฐํš๋‹จ๊ณ„์—์„œ๋ถ€ํ„ฐ ๋””์ž์ด๋„ˆ ์นœ๊ตฌ์™€ ํ•จ๊ป˜ ์ •ํ•œ ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ฒŒ์ž„์€ ์š•์‹ฌ์„ ๊ฐ€๋“ ๋‹ด์•„์„œ ๋งŒ๋“ค์–ด๋ณด์ž!

๋ง ๊ทธ๋Œ€๋กœ ์„œ๋กœ ํ•˜๊ณ  ์‹ถ์—ˆ๋˜ ์š”์†Œ๋“ค์„ ์ง‘์–ด๋„ฃ์–ด ๊ฒŒ์ž„์„ ๋งŒ๋“ค๊ธฐ๋กœ ์ •ํ–ˆ๋Š”๋ฐ, ์ €๋Š” ๊ธฐ์ˆ ์ ์ธ ์‹œ๋„๋ฅผ ๋งŽ์ด ํ•˜๊ณ ์‹ถ์—ˆ๊ณ  ๋””์ž์ด๋„ˆ๋Š” 3D์— ๋Œ€ํ•œ ์‹œ๋„๋ฅผ ํ•ด๋ณด๊ณ  ์‹ถ์–ดํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ์•„ํŠธ์—์„  ๊ฒŒ์ž„์˜ ๋งต๊ณผ ๋ณด์Šค์˜ ์ผ๋Ÿฌ์ŠคํŠธ๊ฐ€ 3D๋กœ ์ž‘์—…๋˜์—ˆ๊ณ , ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ชฝ์—์„œ๋Š” ์•ก์…˜๊ฒŒ์ž„์˜ ๊ตฌํ˜„๊ณผ ์‰์ด๋”, ๊ฐœ๋ฐœํˆด ์ œ์ž‘ ์˜ ์‹ค์ œ ์ ์šฉ ๋“ฑ ๊ทธ๊ฐ„ ๋ฐฐ์› ๊ฑฐ๋‚˜ ๊ถ๊ธˆํ–ˆ๋˜ ๊ธฐ์ˆ ๋“ค์„ ์ ์šฉํ•ด๋ณด๊ณ ์ž ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๐Ÿ”ธ ๊ธ์ •์ ์ธ ๋ถ€๋ถ„

์‹ค์ œ๋กœ ๊ฒŒ์ž„์— ์›ํ–ˆ๋˜ ๊ฒƒ๋“ค์„ ๊ตฌํ˜„์„ ํ•˜๊ธฐ ์œ„ํ•ด ๊ณต๋ถ€๋„ ๋งŽ์ด ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ๋ชฌ์Šคํ„ฐ ํŒจํ„ด ์ œ์ž‘ ๋„๊ตฌ๋ฅผ ๋งŒ๋“ค์–ด ๋ณธ ๊ฒƒ์ด ํฐ ๊ฒฝํ—˜์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ „์ž‘์ธ The Fins์—์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งŒ๋“ค์—ˆ๋˜ ๋ ˆ๋ฒจ ์ œ์ž‘๋„๊ตฌ๋ณด๋‹ค ๋” ์ฒด๊ณ„์ ์œผ๋กœ ๊ตฌํ˜„ํ–ˆ๊ณ , ๊ทธ ๊ณผ์ •์—์„œ ๊ฐ€์ค‘์น˜ํ™•๋ฅ  ๊ณ„์‚ฐ ๋“ฑ ์ˆ˜ํ•™์ ์ธ ์š”์†Œ๋„ ๊ฒŒ์ž„์— ์ ์šฉํ•ด ๋ณผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ฒซ๋ฒˆ์งธ ๋ณด์Šค๋ฅผ ๋งŒ๋“ค๋ฉฐ ๋‹ต๋‹ตํ–ˆ๋˜ ๋ถ€๋ถ„์„ ์ƒ๋‹น๋ถ€๋ถ„ ๊ฐœ์„ ํ•˜๊ณ  ํ•ด๊ฒฐ๋ฐฉ๋ฒ•์„ ์ฐพ์•„๋ƒˆ๋‹ค๋Š” ๊ฒƒ์— ์กฐ๊ธˆ์˜ ๋ฟŒ๋“ฏํ•จ๊ณผ ์ž์‹ ๊ฐ์„ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค.

๋˜, ์•ก์…˜๊ฒŒ์ž„์„ ๋งŒ๋“œ๋ ค๋Š” ์‹œ๋„์—์„œ ์•ก์…˜์„ ๋งŒ๋“ค์–ด๋‚ด๋Š”๊ฒŒ ์ƒ๋‹นํžˆ ์–ด๋ ต๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ์ฐธ์กฐํ•˜๋ฉด์„œ ๋ช‡๋ฒˆ์ด๋‚˜ ์บ๋ฆญํ„ฐ์˜ ์กฐ์ž‘๊ฐ์„ ๊ฐœ์„ ํ•˜๊ณ , ํ…Œ์ŠคํŠธ๋ฅผ ๊ฑฐ์น˜๋ฉฐ ์Šคํ‚ฌ ๋”œ๋ ˆ์ด๋‚˜ ์†๋„๋ฅผ ๋ฏธ์„ธํ•˜๊ฒŒ ์กฐ์ ˆํ•˜๊ณ , ํƒ€๊ฒฉ๊ฐ์„ ์‚ด๋ฆฌ๋ ค๋ฉด ์–ด๋–ค ๋ฐฉ๋ฒ•์„ ์จ์•ผํ• ์ง€ ๊ณ ๋ฏผํ•˜๋Š” ๋“ฑ ์•ก์…˜์ด ์žˆ๋Š” ๊ฒŒ์ž„์— ๋Œ€ํ•œ ๊ณ ๋ฏผ์„ ๋งŽ์ด ํ•˜๊ฒŒ ๋˜์—ˆ๋˜ ํ”„๋กœ์ ํŠธ ์ž…๋‹ˆ๋‹ค.

์œ ๋‹ˆํ‹ฐ์—์„œ๋Š” ์‰์ด๋”๊ทธ๋ž˜ํ”„๋กœ ๋…ธ๋“œ๋ฐฉ์‹์˜ ์†์‰ฝ๊ฒŒ ์‰์ด๋”๋ฅผ ๊ฑด๋“œ๋ฆด ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ณต๋ถ€๋ฅผ ์œ„ํ•ด ์‰์ด๋”๊ทธ๋ž˜ํ”„๋ฅผ ์ด์šฉํ•˜์ง€ ์•Š๊ณ  HLSL๋ฅผ ์ด์šฉํ•˜์—ฌ ์ง์ ‘ ์‰์ด๋”๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์‰์ด๋”๋ฅผ ๊ฑด๋“œ๋ฆฌ๋Š”๊ฑด ์‰ฝ์ง€ ์•Š์•˜๊ณ  ์—ฌ์ „ํžˆ ์–ด๋ ต์ง€๋งŒ, ํ•˜๋‚˜ํ•˜๋‚˜ ์•Œ์•„๊ฐ€๊ณ  ์ƒˆ๋กœ์šด ๊ฒƒ์— ๋„์ „ํ•˜๋Š” ์ผ์ด๋ผ ์žฌ๋ฏธ์žˆ๊ฒŒ ์ž‘์—…ํ–ˆ๋˜ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๐Ÿ”ธ ์•„์‰ฌ์› ๋˜ ๋ถ€๋ถ„

๊ธฐ์ˆ ์ ์œผ๋กœ ๋งŽ์€ ์‹œ๋„๋ฅผ ํ•œ ํ”„๋กœ์ ํŠธ์˜€๋˜ ๊ฒƒ์€ ์žฅ์ ์ด๊ธฐ๋„ ํ–ˆ์ง€๋งŒ ํ•œํŽธ์œผ๋กœ๋Š” ๋‹จ์ ์œผ๋กœ ์ž‘์šฉํ•˜๊ธฐ๋„ ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ์‹œ๋„๋ฅผ ์œ„ํ•œ ๊ณต๋ถ€์™€ ์‹œํ–‰์ฐฉ์˜ค๋ฅผ ๋ฐ˜๋ณตํ•˜๋ฉด์„œ ์ง„ํ–‰ํ•ด์•ผ ํ–ˆ๊ธฐ์— ๊ฐœ๋ฐœ์— ์†๋„๊ฐ€ ๋ถ™์ง€๋ฅผ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ๊ธฐ๊ฐ„์€ ๊ฑฐ์˜ 1๋…„์ด์—ˆ์œผ๋‚˜ ์ค‘๊ฐ„์— ๋ช‡ ๊ฐœ์›”๊ฐ„ ํœด์‹์„ ํ•˜๊ธฐ๋„ ํ–ˆ๊ณ , ์บ๋ฆญํ„ฐ์˜ ์Šคํ‚ฌ๊ณผ ๋ณด์Šค์˜ ํŒจํ„ด์„ ๋ช‡์ฐจ๋ก€ ๊ฐˆ์•„์—Ž๋Š” ๋“ฑ ์ปจํ…์ธ ์˜ ์ถ”๊ฐ€ ์†๋„ ์—ญ์‹œ ์ƒ๋‹นํžˆ ๋Š๋ฆฐ ํŽธ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐํš์˜ ํฌ๊ธฐ๋„ ์š•์‹ฌ ๊ฐ€๋“ ๋‹ด์•„ ๋„ฃ์€ ์Šค์ผ€์ผ์„ ๊ฐ๋‹นํ•˜๊ธฐ ์–ด๋ ค์›Œ ๊ณ„์† ์ค„์—ฌ๋‚˜๊ฐ”์Šต๋‹ˆ๋‹ค.

์ƒ์ผ์„ ๋ฌผ๋กœ 1์ฐจ ๋นŒ๋“œ๋ฅผ ๋‹ฌ์„ฑํ•œ ์ดํ›„์—๋Š” ์ •ํ•ด์ง„ ๊ฐœ๋ฐœ์ผ์ • ์—†์ด ๊พธ์ค€ํžˆ ์ถ”๊ฐ€ ๊ฐœ๋ฐœ๊ณผ ๊ฐœ์„ ์„ ํ•ด๋‚˜๊ฐ”๋Š”๋ฐ ์ผ์ •์ด ์ •ํ•ด์ ธ์žˆ์ง€ ์•Š๋‹ค๋ณด๋‹ˆ ๊ฒฐ๊ณผ๋ฌผ์„ ๋‚ด๊ธฐ๋ณด๋‹ค๋Š” ๊ธฐ์ˆ ์ ์ธ ์‹œ๋„๋ฅผ ํ•˜๋Š”๋ฐ ์‹œ๊ฐ„์„ ๋” ๋งŽ์ด ํˆฌ์žํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ฐ ์”ฌ์ด ํŒŒํŽธํ™” ๋˜์–ด ๋งŒ๋“ค์–ด์ง€๋‹ค ๋ณด๋‹ˆ ๊ฒŒ์ž„์œผ๋กœ์„œ์˜ ์ „์ฒด์ ์ธ ์™„์„ฑ๋„๊ฐ€ ์กฐ๊ธˆ ์•„์‰ฝ์Šต๋‹ˆ๋‹ค.

(post-code: daydream)

TOP