๐Ÿ‘พ AICharacter ํ”ผํ•˜๊ธฐ

๊น€์—ฌ์šธยท2025๋…„ 5์›” 12์ผ

์‚ฌ์ „์บ ํ”„

๋ชฉ๋ก ๋ณด๊ธฐ
18/24

๐ŸŽฎ AICharacter ํ”ผํ•˜๊ธฐ: ๋žœ๋ค ์†Œํ™˜ & ๋‚œ์ด๋„ ์ฆ๊ฐ€ ์‹œ์Šคํ…œ

โœ… ๋ชฉํ‘œ

  • AI ๋ฅดํƒ„์ด๋ฅผ ๋žœ๋คํ•œ ์‹œ๊ฐ„ & ์œ„์น˜์— ์†Œํ™˜
  • ์‹œ๊ฐ„์ด ์ง€๋‚ ์ˆ˜๋ก ๋‚œ์ด๋„ (์ƒ์„ฑ ์†๋„) ์ฆ๊ฐ€

1๏ธโƒฃ๐Ÿ“Œ ๊ธฐ๋ณธ ์„ค์ •: ๋žœ๋ค ํƒ€์ด๋จธ

  • ๋ ˆ๋ฒจ ๋ธ”๋ฃจํ”„๋ฆฐํŠธ ์—ด๊ธฐ
  • Timer ๋ณ€์ˆ˜ (float) ์ƒ์„ฑ

Event BeginPlay โ†’ Random Float in Range (6~10์ดˆ) โ†’ Timer ๋ณ€์ˆ˜์— ์ €์žฅ
  • Random Float in Range๋Š” ์ง€์ •ํ•œ ๋ฒ”์œ„ ๋‚ด์—์„œ ๋žœ๋คํ•œ ์‹œ๊ฐ„ ๊ฐ’ ์ƒ์„ฑ
  • ์ดˆ๊ธฐ ํƒ€์ด๋จธ ๊ฐ’ ์„ค์ •์šฉ


2๏ธโƒฃ๐Ÿ” ํƒ€์ด๋จธ ๊ฐ์†Œ ๋กœ์ง (Tick ์‚ฌ์šฉ)

Event Tick  
โ†’ Timer -= DeltaSeconds  
โ†’ Timer ๊ฐ’์ด 0 ์ดํ•˜์ธ์ง€ ๋ธŒ๋žœ์น˜๋กœ ์ฒดํฌ  
โ†’ 0๋ณด๋‹ค ์ž‘์•„์ง€๋ฉด ์ƒˆ๋กœ์šด ๋žœ๋ค ํƒ€์ด๋จธ๋กœ ๋ฆฌ์…‹
  • ๋งค ํ”„๋ ˆ์ž„๋งˆ๋‹ค ํƒ€์ด๋จธ ๊ฐ์†Œ โ†’ 0์ด ๋˜๋ฉด AI ์†Œํ™˜ ๋กœ์ง ์‹คํ–‰ ์ค€๋น„



3๏ธโƒฃ๐ŸŽฏ ๋žœ๋ค ์œ„์น˜์— AI ๋ฅดํƒ„์ด ์ƒ์„ฑ

- Get Navigation System  
- Get Random Location in Navigable Radius  
- Spawn Actor (AI ๋ฅดํƒ„์ด)
  • Get Navigation System
    ๋„ค๋น„๊ฒŒ์ด์…˜ ๊ฐ€๋Šฅํ•œ ์ง€์—ญ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•œ ์‹œ์Šคํ…œ ์ ‘๊ทผ

  • Get Random Location in Navigable Radius
    ํŠน์ • ๋ฐ˜๊ฒฝ ๋‚ด์—์„œ AI๊ฐ€ ์ด๋™ ๊ฐ€๋Šฅํ•œ ์œ„์น˜๋ฅผ ๋žœ๋ค์œผ๋กœ ๋ฐ˜ํ™˜
    ์ถฉ๋Œ ์œ„ํ—˜์ด ์ ๊ณ , ์ด๋™ ๊ฐ€๋Šฅํ•œ ์œ„์น˜๋งŒ ๋ฐ˜ํ™˜๋จ

  • Spawn Actor

    • Class AI ๋ฅดํƒ„์ด ์ง€์ •
    • Collision Handling Override ์•กํ„ฐ๋ฅผ ์Šคํฐํ•  ๋•Œ ๊ฒน์นจ(์ถฉ๋Œ)์ด ๋ฐœ์ƒํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ• ์ง€ ์ •ํ•˜๋Š” ์„ค์ •

      ์˜ต์…˜ํ–‰๋™
      Always Spawn๊ฒน์ณ๋„ ๋ฌด์กฐ๊ฑด ์ƒ์„ฑ
      Adjust if Possible But Don't Spawn if Colliding๋น„์ผœ์„œ ์†Œํ™˜ ๊ฐ€๋Šฅํ•˜๋ฉด ํ•˜๊ณ , ์•ˆ ๋˜๋ฉด ์ƒ๋žต
      Don't Spawn if Colliding๊ฒน์น˜๋ฉด ์ ˆ๋Œ€ ์†Œํ™˜ ์•ˆ ํ•จ
      Try to Adjust Location, But Always Spawn๋น„ํ‚ค๋ ค ๋…ธ๋ ฅํ•˜๊ณ , ์•ˆ ๋˜๋ฉด ๊ทธ๋ƒฅ ๊ฐ•์ œ ์ƒ์„ฑ โ† ์ง€๊ธˆ ์„ ํƒ๋œ ๊ฒƒ



4๏ธโƒฃ๐Ÿง  AI ์ปจํŠธ๋กค๋Ÿฌ ์ž๋™ ์„ค์ •

  • ๋ฌธ์ œ
    • ์Šคํฐ๋œ ๋ฅดํƒ„์ด๊ฐ€ ์›€์ง์ด์ง€ ์•Š์Œ
  • ์›์ธ
    • AI Controller๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ
    • ๋ ˆ๋ฒจ์— ๋ฏธ๋ฆฌ ๋ฐฐ์น˜๋œ AI์—๊ฒŒ๋Š” ์ž๋™์œผ๋กœ AIController๋ฅผ ๋ถ™์—ฌ์ฃผ์ง€๋งŒ
    • ๋Ÿฐํƒ€์ž„์— ์Šคํฐ๋œ AI๋Š” AIController๊ฐ€ ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜์ง€ ์•Š์Œ

Spawn Default Controller โ†’ Run Behavior Tree
  • AI๊ฐ€ ์ปจํŠธ๋กค๋Ÿฌ ์—†์ด ์†Œํ™˜๋˜๋ฉด ํ–‰๋™ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—
    Spawn Default Controller๋กœ AIController ํ• ๋‹น + Behavior Tree ์‹คํ–‰



5๏ธโƒฃ๐Ÿš€ ๋‚œ์ด๋„ ์‹œ์Šคํ…œ (Stage ๊ณ„์‚ฐ)

  • ์ผ์ • ์‹œ๊ฐ„๋งˆ๋‹ค Stage ๊ฐ’ 1์”ฉ ์ฆ๊ฐ€ (Get Time Seconds / 20)
  • ์Šคํ…Œ์ด์ง€์— ๋”ฐ๋ผ ์ƒ์„ฑ ๊ฐ„๊ฒฉ ์ ์  ๊ฐ์†Œ

- Get Time Seconds โ†’ ํ˜„์žฌ ๊ฒŒ์ž„ ์‹คํ–‰ ์‹œ๊ฐ„ (Float)
- Divide 20 โ†’ 20์ดˆ๋‹น 1 ์Šคํ…Œ์ด์ง€
- To Integer64 (Float) โ†’ ์ •์ˆ˜๋กœ ๋ณ€ํ™˜ (์†Œ์ˆ˜์  ๋‚ด๋ฆผ)

๐Ÿ“Š Stage ๊ณ„์‚ฐ์‹ ์˜ˆ์‹œ

๊ฒฝ๊ณผ ์‹œ๊ฐ„ (์ดˆ)๋‚˜๋ˆ„๊ธฐ 20์ •์ˆ˜ ๋ณ€ํ™˜ ๊ฒฐ๊ณผ (Stage)
000
190.950
201.01
402.02
653.253
  • To Integer ๋ณ€ํ™˜ ์‹œ ์†Œ์ˆ˜์  ์ดํ•˜ ๋‚ด๋ฆผ๋จ (1.9 โ†’ 1)

  • EventTick์— ๋„ฃ๋Š” ์ด์œ 

    • Get Time Seconds๋Š” ๊ณ„์† ์ฆ๊ฐ€ํ•˜๋Š” ๊ฐ’์ด๋ฏ€๋กœ
    • EventTick ์•ˆ์— ๋„ฃ์–ด์•ผ ์‹œ๊ฐ„์ด ํ๋ฅผ ๋•Œ๋งˆ๋‹ค ์‹ค์‹œ๊ฐ„ ๊ณ„์‚ฐ ๊ฐ€๋Šฅ
  • ์š”์•ฝ

    • ๊ฒŒ์ž„ ์‹œ๊ฐ„ / 20์ดˆ๋ฅผ ๋‚ด๋ฆผํ•ด์„œ ์Šคํ…Œ์ด์ง€ ๊ฐ’์„ ๋งŒ๋“ค๊ณ ,
    • Tick์—์„œ ์ง€์†์ ์œผ๋กœ ๊ณ„์‚ฐํ•˜๋ฉด ์‹œ๊ฐ„์ด ์ง€๋‚ ์ˆ˜๋ก ๋‚œ์ด๋„๊ฐ€ ์˜ฌ๋ผ๊ฐ„๋‹ค

Random Float in Range (6~10)
- (Stage * 0.5)
โ†’ Clamp(์ตœ์†Œ 1์ดˆ)๋กœ ์ œํ•œ
โ†’ Timer ์„ธํŒ…
  • Stage๊ฐ€ ์˜ฌ๋ผ๊ฐˆ์ˆ˜๋ก 0.5์ดˆ์”ฉ ์†Œํ™˜ ๊ฐ„๊ฒฉ์ด ์ค„์–ด๋“ฌ

    ๐Ÿ“Š ๋‚œ์ด๋„ ๋ณ€ํ™” ์˜ˆ์‹œ

    ์Šคํ…Œ์ด์ง€ํƒ€์ด๋จธ ๊ฐ์†Œ๋Ÿ‰์ƒ์„ฑ ์†๋„
    00์ดˆ ๊ฐ์†Œ๋А๋ฆผ
    42์ดˆ ๊ฐ์†Œ๋ณดํ†ต
    105์ดˆ ๊ฐ์†Œ (์ตœ๋Œ€)๋งค์šฐ ๋น ๋ฆ„



6๏ธโƒฃโ›” ์ตœ์†Œ ๊ฐ„๊ฒฉ ์ œํ•œ (Clamp ์ฒ˜๋ฆฌ)

  • ํƒ€์ด๋จธ๊ฐ€ ๋„ˆ๋ฌด ์ž‘์•„์ง€๋Š” ๊ฑธ ๋ฐฉ์ง€ํ•˜๋Š” ์•ˆ์ „์žฅ์น˜
  • ์Šคํ…Œ์ด์ง€๊ฐ€ ์˜ฌ๋ผ๊ฐ€๋ฉด ํƒ€์ด๋จธ ๊ฐ„๊ฒฉ์ด 0 ์ดํ•˜๊ฐ€ ๋  ์ˆ˜ ์žˆ์Œ
  • ์ด ๊ฒฝ์šฐ AI๊ฐ€ ๊ณ„์† ์ƒ์„ฑ๋˜๋Š” ๋ฌดํ•œ ๋ฃจํ”„ ๋ฐœ์ƒ
  • Clamp ๋…ธ๋“œ๋กœ ์ตœ์†Œ๊ฐ’ 1์ดˆ, ์ตœ๋Œ€๊ฐ’ 10์ดˆ๋กœ ์ œํ•œ
    โžก ์ตœ๋Œ€ ๋‚œ์ด๋„๋Š” Stage 10๋ถ€ํ„ฐ ๊ณ ์ •

๐Ÿ“Š ์†Œํ™˜ ๊ฐ„๊ฒฉ ๊ณ„์‚ฐ

์†Œํ™˜ ์‹œ๊ฐ„ = Random Float (6~10) - (Stage ร— 0.5)
โ†’ ๋‹จ, ์ตœ์†Œ 1์ดˆ๋กœ Clamp
์Šคํ…Œ์ด์ง€์†Œํ™˜ ์‹œ๊ฐ„ ๋ฒ”์œ„ํƒ€์ด๋จธ ๊ฐ์†Œ๋Ÿ‰์ƒ์„ฑ ์†๋„
06~10์ดˆ0์ดˆ ๊ฐ์†Œ๋А๋ฆผ
448์ดˆ (= 610 - 2)2์ดˆ ๊ฐ์†Œ๋ณดํ†ต
1015์ดˆ (= 610 - 5)5์ดˆ ๊ฐ์†Œ๋งค์šฐ ๋น ๋ฆ„
1204์ดˆ โ†’ Clamp โ†’ 14์ดˆ6์ดˆ ๊ฐ์†Œ โ†’ Clamp์ตœ๋Œ€ ๋‚œ์ด๋„

  • ์š”์•ฝ
    • Stage๊ฐ€ ์˜ฌ๋ผ๊ฐ โ†’ (Stage ร— 0.5)๋งŒํผ ์‹œ๊ฐ„ ๊ฐ์†Œ
    • ๊ฐ์†Œ๋Ÿ‰์ด ๋งŽ์„์ˆ˜๋ก ์†Œํ™˜ ํ…€ ์งง์•„์ง โ†’ ๋‚œ์ด๋„ ์ƒ์Šน
    • ๋„ˆ๋ฌด ์งง์•„์ ธ์„œ 0์ดˆ๊ฐ€ ๋  ์ˆ˜ ์žˆ์œผ๋‹ˆ Clamp๋กœ ์ตœ์†Œ 1์ดˆ ๋ณด์žฅ



7๏ธโƒฃ๐Ÿ”ง Stage ์ฆ๊ฐ€ ์†๋„๋ฅผ ์กฐ์ ˆ (์ˆ˜์ •)


โœ” ์ฒ˜์Œ: Game Time / 20

  • 20์ดˆ๋งˆ๋‹ค Stage๊ฐ€ 1์”ฉ ์ฆ๊ฐ€
  • ๋ณ€ํ™”๊ฐ€ ๋А๋ฆผ โžก ๊ฒŒ์ž„ ํ…œํฌ๊ฐ€ ์ฒœ์ฒœํžˆ ์˜ฌ๋ผ๊ฐ
  • 1๋ถ„์ด ์ง€๋‚˜๋„ Stage 3๋ฐ–์— ์•ˆ ๋จ

โœ” ์ˆ˜์ • ํ›„: Game Time / 2

  • 2์ดˆ๋งˆ๋‹ค Stage๊ฐ€ 1์”ฉ ์ฆ๊ฐ€
  • ๋ณ€ํ™”๊ฐ€ ๋น ๋ฆ„ โžก ๊ฒŒ์ž„ ํ…œํฌ๊ฐ€ ๊ธˆ๋ฐฉ ๋นจ๋ผ์ง
  • 1๋ถ„์ด ์ง€๋‚˜๋ฉด Stage 30

๐Ÿ“Š Stage ๊ณ„์‚ฐ์‹ ๋ณ€๊ฒฝ ์ „ํ›„ ๋น„๊ต

๊ฒฝ๊ณผ ์‹œ๊ฐ„ (์ดˆ)Game Time รท 20 (์ˆ˜์ • ์ „)Game Time รท 2 (์ˆ˜์ • ํ›„)Stage ์ฆ๊ฐ€ ์†๋„
000๋™์ผ
1005๋น ๋ฆ„
20110๋งค์šฐ ๋น ๋ฆ„
40220
60330



๐Ÿง  ์š”์•ฝ

  • BeginPlay โžก ํƒ€์ด๋จธ ๋žœ๋ค ์„ค์ •
  • Tick์—์„œ ํƒ€์ด๋จธ ๊ฐ์†Œ
  • 0 ๋˜๋ฉด โžก ๋žœ๋ค ์œ„์น˜ ๊ณ„์‚ฐ โžก AI ์†Œํ™˜
  • ์†Œํ™˜๋งˆ๋‹ค ๋‚œ์ด๋„(์Šคํ…Œ์ด์ง€) ๋ฐ˜์˜ํ•ด ์ ์  ๋น ๋ฅด๊ฒŒ

0๊ฐœ์˜ ๋Œ“๊ธ€