๊ตฌ์ฑ ํจํด์ ์ฌ์ฉ ํ ์ Enemy ๊ฐ์ฒด์
- CharacterMovementm.cs
- Health.cs
- CharacterRotate.cs
๋ฑ๋ฑ๋ง ์์ผ๋ฉด ๋ ๊ฒ ๊ฐ์๋ฐ Enemy ์คํฌ๋ฆฝํธ๋ฅผ ๋ง๋ค์ด์ผ ํ๋ ์ด์ ๊ฐ ์์๊น์ ?
์ ๋ ๋ง๋ค์ง ์์๋ ๋๋ค๊ณ ์๊ฐํ๋๋ฐ ์ ํ๋ธ ๊ฐ์ ์์์ด๋ ์ ๋ฐ๋ฏธ ์์์ ๋ณด๋ฉด Enemy ์คํฌ๋ฆฝํธ๋ฅผ ๋ง๋๋ ์์์ด ๋ง๋๋ผ๊ตฌ์ ์ดํด๊ฐ ์๊ฐ๋๋ฐ ์ฌ๊ธฐ์ ๋ ๊ถ๊ธํ ๊ฒ์
๋ง์ฝ Health ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฌ์ฉํ๊ธฐ ์ํด Health ์คํฌ๋ฆฝํธ์์ ํน์ ์ํฉ ๋ฐ์์ ํน์ ์ด๋ฒคํธ๋ฅผ Invoke ํด์ฃผ๋๋ฐ, ์ด์ ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ ์ด๋ค ์คํฌ๋ฆฝํธ๋ฅผ ๋ง๋ค์ด ์ฒด์ธ์ ์ฐ๊ฒฐํด์ค์ผ ํ๋์ง ์๋ฌธ์ ๋๋ค.
์ฆ ๊ณต๊ฒฉ์ ๋ฐ์์์ ํน์ ํ๋์ ํ๋ค๋ผ๊ณ ๊ฐ์ ํ ์
Health.cs ์์์ Invoke ํ ํน์ ํ๋์ ํ๋ ์ด๋ฒคํธ ๋ฆฌ์ค๋ ์คํฌ๋ฆฝํธ๋ฅผ ๋ง๋ค์ด์ ์ฒด์ธ์ ์ฐ๊ฒฐํด์ฃผ๋ฉด ๋๋๊ฑธ๊น์ ?
์๊ฐ ํ๋ฆฌ๋ค๋ฉด ์ด๋์ Enemy ์คํฌ๋ฆฝํธ๊ฐ ํ์ํ๊ฐ ? ๋ผ๋ ์๊ฐ์ด ๋ญ๋๋ค ๋์ ์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.
- CharacterMovementm.cs
- Health.cs
- CharacterRotate.cs
๋ฑ๋ฑ๋ง ์์ผ๋ฉด ๋ ๊ฒ ๊ฐ์๋ฐ Enemy ์คํฌ๋ฆฝํธ๋ฅผ ๋ง๋ค์ด์ผ ํ๋ ์ด์ ๊ฐ ์์๊น์ ?
์ ๋ ๋ง๋ค์ง ์์๋ ๋๋ค๊ณ ์๊ฐํ๋๋ฐ ์ ํ๋ธ ๊ฐ์ ์์์ด๋ ์ ๋ฐ๋ฏธ ์์์ ๋ณด๋ฉด Enemy ์คํฌ๋ฆฝํธ๋ฅผ ๋ง๋๋ ์์์ด ๋ง๋๋ผ๊ตฌ์ ์ดํด๊ฐ ์๊ฐ๋๋ฐ ์ฌ๊ธฐ์ ๋ ๊ถ๊ธํ ๊ฒ์
๋ง์ฝ Health ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฌ์ฉํ๊ธฐ ์ํด Health ์คํฌ๋ฆฝํธ์์ ํน์ ์ํฉ ๋ฐ์์ ํน์ ์ด๋ฒคํธ๋ฅผ Invoke ํด์ฃผ๋๋ฐ, ์ด์ ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ ์ด๋ค ์คํฌ๋ฆฝํธ๋ฅผ ๋ง๋ค์ด ์ฒด์ธ์ ์ฐ๊ฒฐํด์ค์ผ ํ๋์ง ์๋ฌธ์ ๋๋ค.
์ฆ ๊ณต๊ฒฉ์ ๋ฐ์์์ ํน์ ํ๋์ ํ๋ค๋ผ๊ณ ๊ฐ์ ํ ์
Health.cs ์์์ Invoke ํ ํน์ ํ๋์ ํ๋ ์ด๋ฒคํธ ๋ฆฌ์ค๋ ์คํฌ๋ฆฝํธ๋ฅผ ๋ง๋ค์ด์ ์ฒด์ธ์ ์ฐ๊ฒฐํด์ฃผ๋ฉด ๋๋๊ฑธ๊น์ ?
์๊ฐ ํ๋ฆฌ๋ค๋ฉด ์ด๋์ Enemy ์คํฌ๋ฆฝํธ๊ฐ ํ์ํ๊ฐ ? ๋ผ๋ ์๊ฐ์ด ๋ญ๋๋ค ๋์ ์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.
Enemy์ Health๊ฐ ๋ ๋ฆฝ์ ์ด์ด์ผ ์ฌ์ฌ์ฉ๋์ง. Health๋ Enemy๋ฅผ ๋ชฐ๋ผ๋ ๋จ - dc App
Enemy์ Health ์๋ก ์ดํด ๊ด๊ณ๋ฅผ ๋ถ๋ฆฌ ์์ผฐ์ต๋๋ค. ๊ทธ๋๋ Enemy ์คํฌ๋ฆฝํธ๊ฐ ํ์ํ ๊ฒฝ์ฐ๊ฐ ์๋๊ฒ ํ๋นํ ๊น์ ?
์ค๋ณต ๋๋ ์ฝ๋๋ ์บก์ํ ํ์ฌ ์ฝ๋๋ฅผ ๋ถ๋ฆฌํ๊ณ SOLID๋ฅผ ์งํค๋ฉด์ ์ฝ๋ฉ์ ํ๊ณ ์๋๋ฐ ์ ํ๋ธ๋ฅผ ๋ณด๋ฉด ๊ตณ์ด Enemy ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๊ฐ ๊ถ๊ธํด์ ์ด๋ ๊ฒ ์ง๋ฌธ๊ธ์ ๋จ๊น๋๋ค ใ ใ
Enemy๋ฅผ ์์ฐ๋ฉด Health ์์ ์ผ์ด๋๋ ์ด๋ฒคํธ๋ฅผ ์ด๋์ ์ฒ๋ฆฌํ ๊ฑฐ์? Healthํ์ผ์์ ์ด๋ฒคํธ invoke๋ง ํด๋ผ - dc App
๋ง์ฝ ์ ์ด ๊ณต๊ฒฉ์ ๋ฐ์์ ํ์ ํ๋ผ๋ ์ด๋ฒคํธ๊ฐ ํ์ํ๋ค๊ณ ๊ฐ์ ํ์๋ Health.cs ์ DealDamage ํจ์ ์์ ์ด๋ฒคํธOnDeal?.Invoke ํด์ฃผ๊ณ ํ์ ํ๋ผ๋ ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ Enemy ์คํฌ๋ฆฝํธ๊ฐ ์๋ CharacterRotate.cs ์คํฌ๋ฆฝํธ๋ฅผ ๋ง๋ ํ ํ์ ํ๋ผ๋ ํน์ ๋ก์ง์ ์์ฑํ๊ณ Health.cs ์ ์ด๋ฒคํธ OnDeal์ ์ฒด์ธ์ ์ฐ๊ฒฐํด์ฃผ๋ฉด ๋์ง ์์๊น์ ?
๋ง์ฝ ๊ทธ๋ ๊ฒ ํ์ง ์๊ณ Enemy ์คํฌ๋ฆฝํธ ๋ง๋ค๊ณ ํน์ ์ฝ๋ ๋ก์ง(ํ์ ํ๋ผ)์ ์์ฑํ๋ฉด ์ฌ๋ฌ๊ฐ์ง ํน์ํ ์ํก์ด ํ์ํ๊ฑฐ๋ ๋ฐ์ํ ์ Enemy ์คํด๋นํธ ์์ ์ ์ด์ผ ํ๋ค๋ ๋จ์ ์ด ์๊ธฐ๋๊ฑฐ ๊ฐ์๋ฐ ์๋ฅผ ๋ค์ด ์ด๋ฒคํธ๋ฅผ ๋ฐ๋ ์ด๋ฒคํธ ๋ฆฌ์ค๋ ๋ผ๋์ง ๋๋ ํจ์ ๋งค๊ฐ๋ณ์์ In/Out ํ๋ ์ฝ๋๋ฅผ Enemy ์คํฌ๋ฆฝํธ์ ์์ฑํจ์ผ๋ก์จ ์ค์ ์ง์คํ ํ์์ด ๋ฐ์ํ์ฌ SRP์ ์ด๊ธ๋๊ณ ์คํ๊ฒํฐ ์ฝ๋๊ฐ ๋ฐ์ํ๋ ๊ฒ ๊ฐ์ ์ด๋ ๊ฒ ๋ ๋๊ธ์ ๋จ๊น๋๋ค
Controller๊ฐ๋ ์ด ํ์ํ๋ฉด ์ค๊ฐ์ ๋ง๋ค์ด๋๋จ. ๊ฑฐ๊ธฐ์ ์ด๋ฒคํธ ์ฒ๋ฆฌํ๊ณ Controller๋ Enemy, Health๋ ๋ค ์๊ฒ ํ๊ณ - dc App
์ฐ๋ฌ์์ ์ข์ ๋ต๊ธ ๊ฐ์ฌํฉ๋๋ค. ํน์ Player์์๋ Controller์ ์ฌ์ฌ์ฉ ํ ์ ์๋ค๊ณ ๊ฐ์ ํ์๋ ๋ง์ํ์ ๊ฒ์ฒ๋ผ Controller ์คํฌ๋ฆฝํธ ์์์ Enemy ์ข ์์ฑ ๋ถ์ฌ ๋์ด ์์๋ ํน์ ์ ์์กดํ๊ณ ์์ด ์บก์ํ ๋์ง ์๊ณ PlayerController ์คํฌ๋ฆฝํธ๋ ๋ง๋ค์ด์ผ ํด์ Dry ๋์ง ์์์ผ๋ก์จ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ ๊ฒ ๊ฐ์๋ฐ
์ด๋ด๋๋ ์ด๋ป๊ฒ ํด๊ฒฐํ๋๊ฒ ์ข์๊น์
๊ทธ๋ด๋ Enemy๋ Player๋ฅผ ๊ฐ์ ์ธํฐํ์ด์ค๋ก ๋ฌถ๊ณ Controller์์์๋ ์ธํฐํ์ด์ค๋ก ๋ฐ์ผ๋ฉด ๋จ
public class Player : IUnit {} public class Enemy : IUnit {} public class Controller { private IUnit _unit; }
์ด๋ ๊ฒ ํ๋ฉด _unit ํ๋์ Player๋ Enemy๋ค ๋ด์ ์ ์์.
์ ๋ง์ ํน์ํ ๊ธฐ๋ฅ์ด ์์๋๋ Enemy ์คํฌ๋ฆฝํธ์ ์์ฑํด๋ ๋ฌด๋ฐฉํ๊ณ ๋ง์ฝ ์์ฑํ ๊ฒ์ค ์ด๊ฒ ๋ค๋ฅธ ๊ณณ์(ex Player) ์ฌ์ฌ์ฉ๋ ํ์๊ฐ ์๋ค๋ฉด ์ปดํฌ๋ํธ๋ก ๋ถ๋ฆฌํด์ ์ฌ์ฉํด๋ ๋๋ค๋ ๋ง์์ผ๋ก ์ดํดํ์ต๋๋ค ! ๋ํ ํ์ํ ๊ฒฝ์ฐ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ์ฌ ํน์ ์ ์์กดํ์ง ๋ชปํ๊ฒ ํ๋์ ์ธํฐํ์ด์ค๋ก ๋ฌถ์ด ์ฌ์ฉํ๋ฉด ๋๋ค๋ผ๋ ๊ฒ์ ๋ฐฐ์ ์ต๋๋ค
์๊ฐ ๋ด์ ์ข์ ๋ต๊ธ ๋จ๊ฒจ์ฃผ์์ ๊ฐ์ฌํฉ๋๋ค ๋๋ถ์ ๋ ๋ง์ด ๋ฐฐ์ ์ต๋๋ค. ์ค๋๋ ์ข์ ํ๋ฃจ ๋์ธ์ !!!
์์
์ ๊ณผ ์๊ตฐ์ด ์๊ณ ๊ฐ๊ฐ ํ์ํ ์ฝ๋๊ฐ ๋ฐ๋ก ์์ผ๋ฉด ๋ง๋๋๊ฒ ์ข์ง
๋ง์ฝ ํน์ ํ๋์ด ๋ฐ์ํ์์ ํ์ ํ๋ผ๊ฐ ํ์ํ ์ ์ CharacterRotate ์คํฌ๋ฆฝํธ๋ก ๋ง๋ค์ง ์๊ณ ์ Enemy ์คํฌ๋ฆฝํฌ๋ฅผ ๋ง๋ ํ ์คํฌ๋ฆฝํธ ์์์ ํน์ ํ๋์ ํ๋ ๋ก์ง์ ์์ฑํ๋ ์ด์ ๊ฐ ๋ญ๊น์
์ ์บ๋ฆญํฐ๊ฐ ํ์ ํ ๋๋ ๋ค๋ฅธ ์ถ๊ฐ์ ์ฒ๋ฆฌ๊ฐ ํ์ํ ์ ์์ผ๋ ๋ฏธ๋ฆฌ ๋๋ ๋๋๊ฑฐ์์ด
CharacterRotate๋ ๋ค๋ฅธ ๊ฒ์ ์ ๊ฒฝ์ฐ์ง ์๊ณ ๊ทธ์ ํ์ ๋งํ๋ค. Enemy ์์๋ ์ ์บ๋ฆญํฐ๊ฐ ํ์ ํ ๋ ์ ๋ง์ ์ถ๊ฐ ์ฒ๋ฆฌ ๋ก์ง์ ์์ฑํ ํ CharactetRotate ์ฐธ์กฐ๋ฅผ ์ป์ด Enemy์์ ์ฌ์ฉํ๋ฉด ๋๋ค๋ ๋ป์ธ๊ฐ์ ?
์๊ตฐ๊ณผ ์ ๊ตฐ์ ํ๋์ ํ์ผ๋ก ๋ง๋ค๋ฉด ๋ญ๊ฐ ๋ค๋ฅธ ์ฒ๋ฆฌ๊ฐ ํ์ํ ๋๋ง๋ค. ์ด๊ฒ ์ ๊ตฐ์บ๋ฆญ์ธ์ง ์๊ตฐ์บ๋ฆญ์ธ์ง ํ์ธํ๋ ์ฝ๋๊ฐ ํ์ํ๊ณ ๋ถ๊ธฐ ์ฒ๋ฆฌ๋ฅผ ํด์ผํ๊ณ ๊ทธ๋ฐ๋ถ๋ถ์ด ๋ง์ด ๋ฐ์ํ ๊ป ์๋๊น ๋ฏธ๋ฆฌ ๋๋ ๋ ๊ฑฐ๋ผ๊ณ ๋ณด๋ฉด๋ ๋ฏ?
์ค ๊ทธ๋ ๊ฒ๋ ์๊ฐํ ์ ์๊ฒ ๋ค์ ๋ ํ๋ ๋ฐฐ์๊ฐ๋๋ค !! ์ข์ ๋๊ธ ๊ฐ์ฌํฉ๋๋ค !!
๊ฑ ์ํฉ์ ๋ง์ถฐ์ ๋ง๋๋ ๊ฑฐ์ง ์ ํํ ํ๋ฒ๋ง ์ฐ์ผ ์ฝ๋๋ค ๊ตณ์ด ์บก์ํ ํด์ ๋ถ๋ฆฌํด์ผํ๋ ๋ค๊ฐ ์ง๋ฌธํ๋๊ฒ "์ ๊ฒ์ผ๋ฅด ๊ฒ ์ฝ๋ฉํ์ธ์?" ์ธ๋ฐ ๊ฒ์ผ๋ฅธ๋ฐ ์ด์ ๊ฐ ์๋? ๋ค ์๋๋ ๋ค๋ฅธ ๋ป์ด ๊ทธ๋ ๋ค๋ ๊ฒ ์๋๊ณ ๊ฑ ์ง๋ฌธ ์์ฒด๊ฐ ํ๊ณ ๋ค๋ฉด ์ ๋ผ ์์ ํ๋ก์ ํธ ์งํํ ๋ ์์ฐ์ฑ ๋ฌธ์ ๋ง ์์ผ๋ฉด ๊ทธ๋ฅ ๋ง์๋๋ก ํ์
์ฌ๊ธฐ์ ์๋ฌด๋ฆฌ ๋ ์ง๋ฌธํด๋ดค์ ๋ค๊ฐ ์ํ๋ ๋ต๋ ์๋์ฌ ๊ฒ์ด๊ณ ๋์๋ดค์ ์๋ฌด ์๋ฏธ ์์ ๊ฑฐ์