Post

2026-06-18 TIL (79일차)

2026-06-18 TIL (79일차)

🌐 언리얼 μ—”μ§„ λ©€ν‹°ν”Œλ ˆμ΄μ–΄ λ„€νŠΈμ›Œν¬ 핡심 κ°œλ… 총정리

언리얼 μ—”μ§„μ˜ λ©€ν‹°ν”Œλ ˆμ΄μ–΄ ν™˜κ²½μ€ μ² μ €ν•œ ν΄λΌμ΄μ–ΈνŠΈ-μ„œλ²„(Client-Server) μ•„ν‚€ν…μ²˜λ₯Ό 기반으둜 μž‘λ™ν•©λ‹ˆλ‹€. 성곡적인 λ©€ν‹°ν”Œλ ˆμ΄ κ²Œμž„μ„ κ°œλ°œν•˜κΈ° μœ„ν•΄ λ°˜λ“œμ‹œ μ•Œμ•„μ•Ό ν•  λ„€νŠΈμ›Œν¬μ˜ 핡심 κ°œλ…κ³Ό μ£Όμš” ν΄λž˜μŠ€λ“€μ˜ 역할을 μ •λ¦¬ν–ˆμŠ΅λ‹ˆλ‹€.


1. μ„œλ²„μ˜ μ ˆλŒ€μ  κΆŒν•œ (Server Authority)κ³Ό ν—€λ“œλ¦¬μŠ€(Headless)

βš–οΈ μ„œλ²„λŠ” κ²Œμž„μ˜ β€˜μ ˆλŒ€μ μΈ μ‹¬νŒβ€™

μ„œλ²„λŠ” κ²Œμž„ λ‚΄μ—μ„œ μΌμ–΄λ‚˜λŠ” λͺ¨λ“  일의 μ΅œμ’… κ²°μ •κΆŒμž(Authority)μž…λ‹ˆλ‹€. ν΄λΌμ΄μ–ΈνŠΈ(ν”Œλ ˆμ΄μ–΄μ˜ 컴퓨터)κ°€ β€œλ‚΄κ°€ 적을 λ§žμ·„λ‹€!”라고 λ³΄λ‚΄λŠ” νŒ¨ν‚·μ„ 무쑰건 μ‹ λ’°ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. ν΄λΌμ΄μ–ΈνŠΈμ˜ 데이터λ₯Ό κ·ΈλŒ€λ‘œ 믿으면 νŒ¨ν‚· λ³€μ‘°λ₯Ό ν†΅ν•œ ν•΄ν‚Ή(예: 무쑰건 ν—€λ“œμƒ· 적쀑)에 λ¬΄λ°©λΉ„λ‘œ λ…ΈμΆœλ˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. λ”°λΌμ„œ μ„œλ²„λŠ” 직접 보이지 μ•ŠλŠ” 맡에 μ΄μ•Œμ„ λ°œμ‚¬ν•΄ 보고, μž₯애물에 λ§‰νžˆμ§€ μ•Šκ³  μ μ€‘ν–ˆλŠ”μ§€λ₯Ό 물리적으둜 κ³„μ‚°ν•˜μ—¬ νŒμ •ν•©λ‹ˆλ‹€.

πŸ™ˆ β€˜λˆˆμ„ κ°€λ¦° λ³΄λ“œκ²Œμž„ λ§ˆμŠ€ν„°β€™ (Headless Server)

λ°λ””μΌ€μ΄ν‹°λ“œ μ„œλ²„(Dedicated Server)λŠ” κ·Έλž˜ν”½(λ Œλ”λ§)κ³Ό μ†Œλ¦¬(μ˜€λ””μ˜€) κΈ°λŠ₯을 μ™„μ „νžˆ 꺼버린 ν—€λ“œλ¦¬μŠ€(Headless) μƒνƒœλ‘œ κ΅¬λ™λ©λ‹ˆλ‹€.

  • ν΄λΌμ΄μ–ΈνŠΈμ˜ λ§΅: λΉ›, 그림자, 캐릭터 μ™Έν˜•, ν™˜κ²½μŒ λ“± λˆˆμ— 보이고 λ“€λ¦¬λŠ” λͺ¨λ“  것을 λ Œλ”λ§ν•©λ‹ˆλ‹€.
  • μ„œλ²„μ˜ λ§΅: ν™”λ €ν•œ κ·Έλž˜ν”½μ€ μ—†μ§€λ§Œ, 투λͺ…ν•œ 물리 좩돌체(Collision), AI 이동 경둜(NavMesh), 보이지 μ•ŠλŠ” 트리거 λ“± κ²Œμž„ νŒμ •μ— ν•„μš”ν•œ λΌˆλŒ€λ§Œμ„ λ©”λͺ¨λ¦¬μ— λ„μ›Œ ν†΅μ œν•©λ‹ˆλ‹€.

2. 데이터 동기화와 λ¦¬ν”Œλ¦¬μΌ€μ΄μ…˜ (Replication)

πŸ“‘ μ„œλ²„ μ˜€ν”ˆκ³Ό λŒ€κΈ° (Listen)

μ„œλ²„κ°€ Open {Level이름}?Listen λͺ…λ Ήμ–΄λ₯Ό μ‹€ν–‰ν•˜λ©΄, μ„œλ²„ 컴퓨터가 맡을 μ—΄κ³  μ†ŒμΌ“(Socket, 톡신 ꡬ멍)을 κ°œλ°©ν•˜μ—¬ λ‹€λ₯Έ ν”Œλ ˆμ΄μ–΄λ“€μ˜ 접속을 κΈ°λ‹€λ¦½λ‹ˆλ‹€. μ΄λ•Œ μ„œλ²„κ°€ ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ 3D λ§΅ μ—μ…‹μ΄λ‚˜ κ·Έλž˜ν”½ νŒŒμΌμ„ λ‹€μš΄λ‘œλ“œν•΄ μ£ΌλŠ” 것이 μ•„λ‹™λ‹ˆλ‹€(에셋은 이미 각자의 ν•˜λ“œλ””μŠ€ν¬μ— μ„€μΉ˜λ˜μ–΄ 있음). μ„œλ²„κ°€ λΏœμ–΄λ‚΄λŠ” 것은 β€˜μ’Œν‘œ, 체λ ₯, μƒνƒœ λ³€ν™” λ“±μ˜ 순수 λ°μ΄ν„°β€™μž…λ‹ˆλ‹€.

πŸ‘― 원본과 λ³΅μ‚¬λ³Έμ˜ 관계

  • 원본 (Authority): κ²Œμž„ μ„Έκ³„μ˜ β€˜μ§„μ§œβ€™ λͺ¬μŠ€ν„°, μ•„μ΄ν…œ, μΊλ¦­ν„°λŠ” 였직 μ„œλ²„μ—λ§Œ μ‘΄μž¬ν•©λ‹ˆλ‹€.
  • 볡사본 (Proxy): ν΄λΌμ΄μ–ΈνŠΈ 화면에 λ³΄μ΄λŠ” λͺ¨λ“  것듀은 μ„œλ²„κ°€ 보내쀀 정보λ₯Ό λ°”νƒ•μœΌλ‘œ 흉내 λ‚΄κ³  μžˆλŠ” β€˜κ»λ°κΈ°(볡사본)β€™μž…λ‹ˆλ‹€. μ΄λ ‡κ²Œ μ„œλ²„μ˜ μƒνƒœλ₯Ό ν΄λΌμ΄μ–ΈνŠΈμ— λ™κΈ°ν™”ν•˜λŠ” 과정을 λ¦¬ν”Œλ¦¬μΌ€μ΄μ…˜(Replication)이라고 ν•©λ‹ˆλ‹€.

3. πŸ—ΊοΈ μ£Όμš” 클래슀의 생쑴 ꡬ역 (어디에 μ‘΄μž¬ν•˜λŠ”κ°€?)

언리얼 μ—”μ§„ λ©€ν‹°ν”Œλ ˆμ΄μ˜ 핡심은 β€œμ΄ ν΄λž˜μŠ€κ°€ λˆ„κ΅¬μ˜ 컴퓨터에 μ‘΄μž¬ν•˜λŠ”κ°€?”λ₯Ό νŒŒμ•…ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

클래슀 (Class)μ„œλ²„ (Server)λ‚΄ 컴퓨터 (λ‚˜)λ‚¨μ˜ 컴퓨터 (타인)μ—­ν•  및 λΉ„μœ 
GameModeπŸ”΅ (원본)βŒβŒμ‹¬νŒλ§Œ μ•„λŠ” λΉ„λ°€ 룰뢁. 점수 계산, 승리 쑰건 등을 관리. (ν΄λΌμ΄μ–ΈνŠΈμ— 있으면 ν•΄ν‚Ή μœ„ν—˜)
PlayerControllerπŸ”΅ (원본)πŸ”΅ (볡사본)βŒλ‚˜λ§Œ μ₯κ³  μžˆλŠ” 리λͺ¨μ»¨. λ‚˜μ˜ ν‚€λ³΄λ“œ/마우슀 μž…λ ₯을 처리. λ‚¨μ˜ μ»¨νŠΈλ‘€λŸ¬λŠ” λ‚΄ 컴퓨터에 μ‘΄μž¬ν•˜μ§€ μ•ŠμŒ (Null).
Character / PawnπŸ”΅ (원본)πŸ”΅ (볡사본)πŸ”΅ (볡사본)κ²½κΈ°μž₯을 λ›°λŠ” 윑체. λ‚΄κ°€ 움직이면 남듀 ν™”λ©΄μ—μ„œλ„ 움직여야 ν•˜λ―€λ‘œ λͺ¨λ‘μ—κ²Œ 동기화됨.
PlayerStateπŸ”΅ (원본)πŸ”΅ (볡사본)πŸ”΅ (볡사본)μ„ μˆ˜ λ“±λ²ˆν˜Έμ™€ 점수판. λ‚¨μ˜ 컨트둀러λ₯Ό λ³Ό 수 μ—†μœΌλ―€λ‘œ, λ‹‰λ„€μž„, ν•‘(Ping), K/D 점수 λ“± 곡개 정보λ₯Ό λ‹΄μ•„ λͺ¨λ‘μ—κ²Œ λΏŒλ €μ£ΌλŠ” κ°€λ°©.

(πŸ’‘ μ°Έκ³ : ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ GetGameMode()λ₯Ό ν˜ΈμΆœν•˜λ©΄ 항상 nullptr을 λ°˜ν™˜ν•©λ‹ˆλ‹€. κ²Œμž„λͺ¨λ“œλŠ” μ„œλ²„μ—λ§Œ 있기 λ•Œλ¬Έμž…λ‹ˆλ‹€. κ²Œμž„λͺ¨λ“œμ— μ ‘κ·Όν•˜λ €λ©΄ HasAuthority()λ₯Ό 톡해 ν˜„μž¬ μ½”λ“œκ°€ μ„œλ²„μ—μ„œ μ‹€ν–‰ 쀑인지 확인해야 ν•©λ‹ˆλ‹€.)


4. λ„€νŠΈμ›Œν¬ ν•˜λΆ€ ꡬ쑰 (NetDriver, NetConnection, NetMode)

언리얼 엔진이 이 λ³΅μž‘ν•œ 톡신을 μ–΄λ–»κ²Œ κ΄€λ¦¬ν•˜λŠ”μ§€ 둜우레벨(Low-level) ꡬ쑰λ₯Ό μ΄ν•΄ν•˜λŠ” 것도 μ€‘μš”ν•©λ‹ˆλ‹€.

πŸ”Œ NetDriver 와 NetConnection (인터넷 κ³΅μœ κΈ°μ™€ λžœμ„ )

  • NetDriver (인터넷 곡유기): μ»΄ν“¨ν„°μ˜ λ„€νŠΈμ›Œν¬ 포트(Socket)λ₯Ό 직접 μ—΄κ³  λ‹«μœΌλ©°, μ™ΈλΆ€μ—μ„œ λ“€μ–΄μ˜€λŠ” λͺ¨λ“  데이터λ₯Ό κ°€μž₯ λ¨Όμ € λ°›μ•„λ‚΄λŠ” λ„€νŠΈμ›Œν¬ 총괄 κ΄€λ¦¬μž(Hub)μž…λ‹ˆλ‹€. μ‹±κΈ€ν”Œλ ˆμ΄μ—μ„œλŠ” μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ©° λ©€ν‹°ν”Œλ ˆμ΄ μ‹œμ—λ§Œ μƒμ„±λ©λ‹ˆλ‹€.
  • NetConnection (κ°œλ³„ λžœμ„ ): κ³΅μœ κΈ°μ— 1번, 2번 μ»΄ν“¨ν„°λ‘œ κ°€λŠ” λžœμ„ μ΄ κ½‚ν˜€ μžˆλ“―μ΄, νŠΉμ • 컴퓨터 1λŒ€μ™€ ν†΅μ‹ ν•˜κΈ° μœ„ν•΄ λ§Œλ“€μ–΄μ§„ μ „μš© 톡신 νŒŒμ΄ν”„(객체)μž…λ‹ˆλ‹€.

이 ꡬ쑰λ₯Ό μ‹€μ œ 언리얼 μ—”μ§„μ˜ C++ μ½”λ“œ λŠλ‚ŒμœΌλ‘œ λ‹¨μˆœν™”ν•΄μ„œ 보면 μ΄λ ‡μŠ΅λ‹ˆλ‹€.

1
2
3
4
5
6
7
8
9
10
class UNetDriver 
{
    // [μ„œλ²„μš©] λ‚˜μ—κ²Œ μ ‘μ†ν•œ μ—¬λŸ¬ ν”Œλ ˆμ΄μ–΄λ“€μ˜ λžœμ„  λ‹€λ°œ (λ°°μ—΄)
    TArray<UNetConnection*> ClientConnections; 

    // [ν΄λΌμ΄μ–ΈνŠΈμš©] λ‚΄κ°€ μ„œλ²„μ™€ μ—°κ²°ν•˜κΈ° μœ„ν•΄ 꽂은 단 ν•˜λ‚˜μ˜ λžœμ„ 
    UNetConnection* ServerConnection;
    
    // ... 기타 λ„€νŠΈμ›Œν¬ 처리 ν•¨μˆ˜λ“€ ...
}

❓ ꢁ금증 ν•΄κ²°: UNetDriverλŠ” λ„λŒ€μ²΄ 어디에 μžˆλŠ” 걸까?

UNetDriverλŠ” 언리얼 μ—”μ§„ μ†ŒμŠ€ μ½”λ“œμ— λ‚΄μž₯된 핡심 C++ ν΄λž˜μŠ€μž…λ‹ˆλ‹€. μ™ΈλΆ€μ˜ 제3자 μ„œλ²„ ν”„λ‘œκ·Έλž¨μ΄ μ•„λ‹ˆλΌ, μ„œλ²„ 컴퓨터와 ν΄λΌμ΄μ–ΈνŠΈ 컴퓨터가 각각 μžμ‹ μ˜ λ©”λͺ¨λ¦¬(RAM)에 직접 μƒμ„±ν•΄μ„œ λ“€κ³  μžˆλŠ” κ°μ²΄μž…λ‹ˆλ‹€.

  • μ„œλ²„ 컴퓨터: λ©€ν‹°ν”Œλ ˆμ΄ 방을 μ—΄λ©΄ μ—”μ§„ λ‚΄λΆ€μ—μ„œ 자기만의 UNetDriverλ₯Ό ν•˜λ‚˜ μΌ­λ‹ˆλ‹€. (κ±°λŒ€ν•œ 우체ꡭ 본점)
  • ν΄λΌμ΄μ–ΈνŠΈ 컴퓨터: μ„œλ²„μ— μ ‘μ†ν•˜λ €κ³  ν•˜λ©΄ μ—”μ§„ λ‚΄λΆ€μ—μ„œ 자기만의 UNetDriverλ₯Ό ν•˜λ‚˜ μΌ­λ‹ˆλ‹€. (동넀 우체ꡭ 지점)

즉, λ©€ν‹°ν”Œλ ˆμ΄κ°€ μΌœμ§€λŠ” μˆœκ°„ 각자의 컴퓨터 μ•ˆμ—μ„œ 언리얼 엔진이 슀슀둜 UNetDriverλ₯Ό κΉ¨μ›Œ μ„œλ‘œ 톡신을 μ‹œμž‘ν•˜λŠ” κ΅¬μ‘°μž…λ‹ˆλ‹€.


πŸ’‘ 심화 1: μ—­ν•  λΆ„λ‹΄ (우체ꡭ과 μš°μ²΄λΆ€)

각 컴퓨터가 λ“€κ³  μžˆλŠ” λ„·λ“œλΌμ΄λ²„λŠ” 이 컀λ„₯μ…˜ 객체듀을 κ΄€λ¦¬ν•˜λ©° λ‹€μŒκ³Ό 같이 역할을 λΆ„λ‹΄ν•©λ‹ˆλ‹€.

  • UNetDriver (우체ꡭ 집쀑ꡭ): 인터넷 λ§μ—μ„œ λ‚ μ•„μ˜€λŠ” λͺ¨λ“  데이터(νŒ¨ν‚·)λ₯Ό λ¬΄μž‘μ • λ°›μ•„ 겉면을 보고 β€œμ•„, 이건 1번 λžœμ„ μ—μ„œ 온 데이터넀?” ν•˜κ³  λΆ„λ₯˜ν•˜μ—¬ ν•΄λ‹Ή UNetConnectionμ—κ²Œ ν† μŠ€ν•©λ‹ˆλ‹€.
  • UNetConnection (개인 μ „λ‹΄ μš°μ²΄λΆ€): μžκΈ°κ°€ λ‹΄λ‹Ήν•˜λŠ” ν”Œλ ˆμ΄μ–΄μ˜ λ°μ΄ν„°λ§Œ μ „λ¬Έμ μœΌλ‘œ μ²˜λ¦¬ν•©λ‹ˆλ‹€. μƒλŒ€λ°©μ˜ ν•‘(Ping) 계산, νŒ¨ν‚· μœ μ‹€ μ‹œ μž¬μ „μ†‘ μš”μ²­μ„ μˆ˜ν–‰ν•˜λ©°, κ°€μž₯ μ€‘μš”ν•˜κ²ŒλŠ” 이 λžœμ„ μ˜ 끝에 μ–΄λ–€ PlayerControllerκ°€ μ—°κ²°λ˜μ–΄ μžˆλŠ”μ§€ κΈ°μ–΅ν•˜κ³  κ΄€λ¦¬ν•©λ‹ˆλ‹€.

πŸ’‘ 심화 2: NetConnection의 정체와 생성 μ‹œμ 

μ΄ˆλ³΄μžλ“€μ΄ κ°€μž₯ 많이 ν•˜λŠ” μ˜€ν•΄ 쀑 ν•˜λ‚˜λŠ” β€œClientConnection, ServerConnection, UNetConnection이 λͺ¨λ‘ λ‹€λ₯Έ 객체인가?” ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

κ²°λ‘ λΆ€ν„° λ§ν•˜μžλ©΄, ClientConnectionκ³Ό ServerConnection의 정체(데이터 νƒ€μž…)κ°€ λ°”λ‘œ UNetConnectionμž…λ‹ˆλ‹€. 즉, UNetConnection은 β€˜ν†΅μ‹  케이블(λžœμ„ )’ κ·Έ 자체λ₯Ό μ˜λ―Έν•˜λŠ” 섀계도(클래슀)μž…λ‹ˆλ‹€. μ„œλ²„ μž…μž₯μ—μ„œλŠ” λ‚΄κ²Œ κ½‚νžŒ λžœμ„ μ„ β€˜ν΄λΌμ΄μ–ΈνŠΈ 컀λ„₯μ…˜β€™μ΄λΌ λΆ€λ₯΄κ³ , ν΄λΌμ΄μ–ΈνŠΈ μž…μž₯μ—μ„œλŠ” λ‚΄ 컴퓨터에 κ½‚νžŒ λžœμ„ μ„ β€˜μ„œλ²„ 컀λ„₯μ…˜β€™μ΄λΌκ³  λΆ€λ₯Ό 뿐, μ‹€μ œλ‘œλŠ” λ™μΌν•œ νƒ€μž…μ˜ μ–‘λ°©ν–₯ νŒŒμ΄ν”„μž…λ‹ˆλ‹€.

이 λžœμ„ (UNetConnection)은 μ–Έμ œ μƒμ„±λ κΉŒμš”? 톡신이 λ°œμƒν•  λ•Œλ§ˆλ‹€ μƒκΈ°λŠ” 것이 μ•„λ‹ˆλΌ, β€˜ν”Œλ ˆμ΄μ–΄κ°€ μ„œλ²„μ— 처음 접속을 μ‹œλ„ν•˜λŠ” λ°”λ‘œ κ·Έ μˆœκ°„(Handshake)’에 λ”± ν•œ 번 μƒμ„±λ©λ‹ˆλ‹€.

  1. ν΄λΌμ΄μ–ΈνŠΈμ˜ 접속 μ‹œλ„: ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„œλ²„μ— 접속을 μ‹œλ„ν•˜λ©΄, ν΄λΌμ΄μ–ΈνŠΈ μ»΄ν“¨ν„°μ˜ UNetDriverκ°€ μ¦‰μ‹œ UNetConnection 객체λ₯Ό 생성(ServerConnection에 μ €μž₯)ν•˜κ³  μ„œλ²„μ— 노크(μš”μ²­)ν•©λ‹ˆλ‹€.
  2. μ„œλ²„μ˜ 수락: μ„œλ²„κ°€ μš”μ²­μ„ λ°›μœΌλ©΄, μ„œλ²„μ˜ UNetDriver μ—­μ‹œ μƒˆλ‘œμš΄ UNetConnection 객체λ₯Ό μƒμ„±ν•˜μ—¬ μžμ‹ μ˜ ClientConnections 배열에 μΆ”κ°€ν•©λ‹ˆλ‹€.
  3. μ—°κ²° μ™„λ£Œ: μ–‘μͺ½ 컴퓨터에 각각 UNetConnection이 μƒμ„±λ˜μ–΄ λ…Όλ¦¬μ μœΌλ‘œ 연결이 μ™„λ£Œλ˜λ©΄, μ•žμ„œ 배운 PlayerControllerκ°€ 이 λžœμ„ μ„ 타고 ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ λ°œκΈ‰λ©λ‹ˆλ‹€.

πŸ”— μ†Œμœ κΆŒ (Ownership)

λ©€ν‹°ν”Œλ ˆμ΄μ—μ„œλŠ” β€˜λˆ„κ°€ 이 μ•‘ν„°μ˜ μ§„μ§œ 주인인가?’λ₯Ό λ”°μ§€λŠ” μ†Œμœ κΆŒ(Ownership)이 맀우 μ€‘μš”ν•©λ‹ˆλ‹€. RPC(원격 ν”„λ‘œμ‹œμ € 호좜)의 μ‹€ν–‰ κΆŒν•œμ„ κ²°μ •ν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

  • μ†Œμœ κΆŒ 트리: ClientConnection ➑️ PlayerController ➑️ Pawn(Character) ➑️ Weapon(무기 μ•‘ν„°)
  • 이 μ†Œμœ  관계(Family)에 속해 μžˆλ‹€λ©΄, μ•‘ν„°μ—μ„œ GetNetConnection()을 ν˜ΈμΆœν–ˆμ„ λ•Œ 본인을 μ‘°μ’…ν•˜λŠ” 톡신 객체λ₯Ό μ •μƒμ μœΌλ‘œ λ°›μ•„μ˜¬ 수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ–₯️ λ„· λͺ¨λ“œ (NetMode)

ν˜„μž¬ μ½”λ“œκ°€ μ‹€ν–‰λ˜κ³  μžˆλŠ” μ»΄ν“¨ν„°μ˜ 정체(μ—­ν• )λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€. (GetNetMode() ν•¨μˆ˜λ‘œ 확인 κ°€λŠ₯)

  1. NM_Standalone: μ‹±κΈ€ν”Œλ ˆμ΄ λͺ¨λ“œ. (λ„€νŠΈμ›Œν¬ μ—°κ²° μ—†μŒ)
  2. NM_DedicatedServer: ν”Œλ ˆμ΄μ–΄(κ·Έλž˜ν”½/μ‚¬μš΄λ“œ) 없이 였직 κ²Œμž„ 둜직만 λŒμ•„κ°€λŠ” 순수 μ„œλ²„.
  3. NM_ListenServer: λˆ„κ΅°κ°€κ°€ λ°©μž₯(호슀트)이 λ˜μ–΄ μ„œλ²„ μ—­ν• κ³Ό ν΄λΌμ΄μ–ΈνŠΈ(ν”Œλ ˆμ΄) 역할을 λ™μ‹œμ— μˆ˜ν–‰ν•˜λŠ” μ„œλ²„.
  4. NM_Client: μ„œλ²„μ— μ ‘μ†ν•˜μ—¬ 화면을 λ Œλ”λ§ν•˜κ³  μž…λ ₯을 λ³΄λ‚΄λŠ” 일반 μ ‘μ†μž.

5. 핡심 μš”μ•½: 둜직 μ²˜λ¦¬μ™€ λ³΄μ•ˆ

데미지 계산, μ•„μ΄ν…œ νšλ“, μŠ€νƒ― λ³€ν™” λ“± κ²Œμž„μ— μ€‘λŒ€ν•œ 영ν–₯을 λ―ΈμΉ˜λŠ” λͺ¨λ“  핡심 λ‘œμ§μ€ λ°˜λ“œμ‹œ μ„œλ²„(Authority)μ—μ„œλ§Œ μ²˜λ¦¬ν•΄μ•Ό ν•©λ‹ˆλ‹€.

ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ 데미지λ₯Ό κΉŽλ„λ‘ κ΅¬ν˜„ν•˜λ©΄, 해컀가 νŒ¨ν‚· μŠ€λ‹ˆν•‘/λ³€μ‘°λ₯Ό 톡해 μ‘°μž‘λœ 데이터λ₯Ό μ„œλ²„λ‘œ 보내 κ²Œμž„ μƒνƒœκ³„λ₯Ό νŒŒκ΄΄ν•  수 μžˆμŠ΅λ‹ˆλ‹€. ν΄λΌμ΄μ–ΈνŠΈλŠ” 였직 β€œλ§ˆμš°μŠ€λ₯Ό ν΄λ¦­ν–ˆλ‹€(곡격 μ‹œλ„)β€λΌλŠ” μž…λ ₯(Input)λ§Œμ„ μ„œλ²„μ— μ „λ‹¬ν•˜κ³ , 깎인 체λ ₯의 κ²°κ³Όκ°’(Replication)을 λ°›μ•„ ν™”λ©΄μ˜ UIλ₯Ό κ°±μ‹ ν•˜λŠ” μ—­ν• λ§Œ μˆ˜ν–‰ν•΄μ•Ό ν•©λ‹ˆλ‹€.

This post is licensed under CC BY 4.0 by the author.