๐Ÿค– ์ƒํƒœ ๋จธ์‹ ์œผ๋กœ ์  AI ๊ตฌํ˜„ – ๊ฒŒ์ž„ ์บ๋ฆญํ„ฐ ๋˜‘๋˜‘ํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ

 ๊ฒŒ์ž„์—์„œ ์  ์บ๋ฆญํ„ฐ๊ฐ€ ๋‹จ์ˆœํžˆ ์™”๋‹ค ๊ฐ”๋‹ค๋งŒ ํ•˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ, ํ”Œ๋ ˆ์ด์–ด๋ฅผ ์ซ“๊ฑฐ๋‚˜ ๊ณต๊ฒฉํ•˜๊ณ  ๋„๋ง์น˜๋Š” ํ–‰๋™์„ ๋ณด์—ฌ์ฃผ๋ฉด ํ›จ์”ฌ ์ž์—ฐ์Šค๋Ÿฝ๋‹ค.

์ด๋Ÿฐ ํ–‰๋™ ํŒจํ„ด์„ ๊ตฌํ˜„ํ•  ๋•Œ **์ƒํƒœ ๋จธ์‹ (State Machine)**์ด ํ•ต์‹ฌ์ด๋‹ค.


1. ์ƒํƒœ ๋จธ์‹ (State Machine) ๊ฐœ๋…

  • ๊ฐ์ฒด๊ฐ€ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ(State)์™€ ์ „ํ™˜(Transition) ๊ตฌ์กฐ

  • ์ƒํƒœ๋งˆ๋‹ค ํ–‰๋™์„ ์ •์˜ํ•˜๊ณ , ์กฐ๊ฑด์ด ๋˜๋ฉด ๋‹ค๋ฅธ ์ƒํƒœ๋กœ ์ด๋™

  • ์˜ˆ์‹œ: ์  ์บ๋ฆญํ„ฐ

    • Idle (๋Œ€๊ธฐ)

    • Patrol (์ˆœ์ฐฐ)

    • Chase (์ถ”๊ฒฉ)

    • Attack (๊ณต๊ฒฉ)


2. ์ƒํƒœ ๋จธ์‹  ๊ทธ๋ฆผ

Idle → Patrol → Chase → Attack ↑ ↓ ← ← ← ← ← ← ← ← ← ← ← ← ←
  • Idle → Patrol: ์ผ์ • ์‹œ๊ฐ„ ํ›„

  • Patrol → Chase: ํ”Œ๋ ˆ์ด์–ด ๋ฐœ๊ฒฌ ์‹œ

  • Chase → Attack: ๊ณต๊ฒฉ ๋ฒ”์œ„ ์ง„์ž… ์‹œ

  • Attack → Idle/Patrol: ํ”Œ๋ ˆ์ด์–ด ๋ฉ€์–ด์ง€๋ฉด


3. Unity C# ์˜ˆ์ œ

public enum EnemyState { Idle, Patrol, Chase, Attack } public EnemyState currentState = EnemyState.Idle; void Update() { switch(currentState) { case EnemyState.Idle: Idle(); break; case EnemyState.Patrol: Patrol(); break; case EnemyState.Chase: Chase(); break; case EnemyState.Attack: Attack(); break; } } void Idle() { // ๋Œ€๊ธฐ ํ–‰๋™ if(playerInSight) currentState = EnemyState.Chase; } void Patrol() { // ์ˆœ์ฐฐ ํ–‰๋™ if(playerInSight) currentState = EnemyState.Chase; } void Chase() { // ํ”Œ๋ ˆ์ด์–ด ์ถ”๊ฒฉ if(inAttackRange) currentState = EnemyState.Attack; } void Attack() { // ๊ณต๊ฒฉ ํ–‰๋™ if(!inAttackRange) currentState = EnemyState.Patrol; }

4. ์ƒํƒœ ๋จธ์‹  ํ™œ์šฉ ํŒ

  • ํ–‰๋™๋งˆ๋‹ค ์ฝ”๋“œ๋ฅผ ๋‚˜๋ˆ„๋ฉด ๊ฐ€๋…์„ฑ↑ ์œ ์ง€๋ณด์ˆ˜↑

  • ์ „ํ™˜ ์กฐ๊ฑด(Trigger)์„ ๋ช…ํ™•ํžˆ → AI ํ–‰๋™ ์˜ˆ์ธก ๊ฐ€๋Šฅ

  • ๋ณต์žกํ•œ AI๋Š” ๊ณ„์ธต์  ์ƒํƒœ ๋จธ์‹ (Hierarchical State Machine) ์ ์šฉ ๊ฐ€๋Šฅ


5. ๋งˆ๋ฌด๋ฆฌ

์ƒํƒœ ๋จธ์‹ ์„ ํ™œ์šฉํ•˜๋ฉด,

  • ๋‹จ์ˆœ ์ด๋™ AI → ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ํ–‰๋™

  • ํ”Œ๋ ˆ์ด์–ด ๊ฒฝํ—˜ ํ–ฅ์ƒ

  • ๊ฒŒ์ž„ ๋‚œ์ด๋„ ์กฐ์ ˆ ์šฉ์ด

๋‹ค์Œ ๊ธ€์—์„œ๋Š” Object Pooling์œผ๋กœ ๊ฒŒ์ž„ ์ตœ์ ํ™”๋ฅผ ๋‹ค๋ค„, ๋‹ค์ˆ˜ ์ ๊ณผ ํˆฌ์‚ฌ์ฒด๊ฐ€ ์žˆ์„ ๋•Œ ์„ฑ๋Šฅ์„ ์•ˆ์ •์ ์œผ๋กœ ์œ ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด๊ฒ ๋‹ค.

๋Œ“๊ธ€

์ด ๋ธ”๋กœ๊ทธ์˜ ์ธ๊ธฐ ๊ฒŒ์‹œ๋ฌผ

๐Ÿ—„️ ๊ฒŒ์ž„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค๊ณ„ – ์ธ๋ฒคํ† ๋ฆฌ, ๋žญํ‚น, ์„ธ์ด๋ธŒ ์‹œ์Šคํ…œ

๐Ÿ”’ ๋ฉ€ํ‹ฐํ”Œ๋ ˆ์ด์–ด ๋ณด์•ˆ ๊ฐ•ํ™” – ์น˜ํŠธ ๋ฐฉ์ง€์™€ ๋ฐ์ดํ„ฐ ๋ณดํ˜ธ

๐Ÿš€ ๋ฉ€ํ‹ฐํ”Œ๋ ˆ์ด์–ด ๊ฒŒ์ž„ ์ตœ์ ํ™”์™€ ์„ฑ๋Šฅ ํŠœ๋‹ – ๋ถ€๋“œ๋Ÿฌ์šด ๊ฒŒ์ž„ ํ”Œ๋ ˆ์ด ๊ตฌํ˜„