[G1-Sync] Manual knowledge update
This commit is contained in:
@@ -2,76 +2,231 @@
|
||||
id: wiki-2026-0508-포탑-시스템-turret-systems
|
||||
title: 포탑 시스템(Turret Systems)
|
||||
category: 10_Wiki/Topics
|
||||
status: needs_review
|
||||
status: verified
|
||||
canonical_id: self
|
||||
aliases: []
|
||||
aliases: [Turret Systems, Tower Defense, Auto-targeting]
|
||||
duplicate_of: none
|
||||
source_trust_level: A
|
||||
confidence_score: 0.92
|
||||
tags: [uncategorized]
|
||||
confidence_score: 0.85
|
||||
verification_status: applied
|
||||
tags: [game-design, ai, gameplay, tower-defense]
|
||||
raw_sources: []
|
||||
last_reinforced: 2026-05-08
|
||||
last_reinforced: 2026-05-10
|
||||
github_commit: pending
|
||||
inferred_by: Claude Opus 4.7 (auto-normalize 2026-05-08)
|
||||
tech_stack:
|
||||
language: C# / GDScript
|
||||
framework: Unity / Godot
|
||||
---
|
||||
|
||||
# [[포탑 시스템(Turret Systems)|포탑 시스템(Turret Systems)]]
|
||||
# 포탑 시스템(Turret Systems)
|
||||
|
||||
## 📌 한 줄 통찰 (The Karpathy Summary)
|
||||
포탑 시스템(Turret Systems)은 'War Commander'에서 플레이어의 기지와 중요 자원을 방어하기 위해 방어 플랫폼 위에 설치되는 핵심 구조물입니다. 다양한 형태의 침공(보병, 차량, 공중 유닛 등)에 대응하기 위해 포탑마다 각기 다른 무기 속성과 사거리, 특화된 공격 대상을 지니고 있습니다. 성공적인 방어를 위해서는 적의 미끼(Baiting) 전술과 공성 유닛을 무력화할 수 있는 상호 보완적인 포탑 배치가 필수적이며, 포탑의 효율을 유지하기 위해 기지 내 전력(Power) 관리가 매우 중요합니다.
|
||||
## 매 한 줄
|
||||
> **"매 stationary defender 의 자동 target 의 acquisition + tracking + firing."**. 매 1980s arcade (Missile Command) 부터 매 modern tower defense (Bloons TD 6, PvZ), 매 RTS (StarCraft 의 turret), 매 FPS (Team Fortress 2 의 sentry) 의 universal mechanic. 매 target selection + range + cooldown + projectile 의 4-axis design.
|
||||
|
||||
## 📖 구조화된 지식 (Synthesized Content)
|
||||
* **주요 포탑의 종류와 전술적 특징:**
|
||||
* **기관총 탑(Gun Turret / Machine Gun):** 보병 및 공중 유닛에 가장 효과적인 대인 사격을 가하지만, 중장갑 차량(전차)을 상대로는 피해를 주지 못하거나 비효율적입니다 [1-3].
|
||||
* **박격포 탑(Mortar Tower):** 차량 및 대규모 지상군 병력을 상대로 장거리 폭발 피해를 주어 유용하지만, 공중 유닛은 타격할 수 없습니다 [1, 2].
|
||||
* **플라즈마 및 레이저 포탑(Plasma & Laser Turret):** 플라즈마 포탑은 단발 화력이 매우 강력하며(사거리 479), 레이저 포탑은 막대한 초당 피해량(DPS)을 자랑합니다(사거리 410) [4].
|
||||
* **로켓 연사 포탑(Rocket Barrage Turret):** 사거리가 긴 헬파이어(Hellfire) 전차보다 더 먼 거리를 타격할 수 있으며, 박격포와 달리 다른 포탑 뒤에 배치된 상태에서도 전방 사격이 가능합니다 [5, 6].
|
||||
* **크라이오 캐논(Cryo Cannon):** 자체 피해량은 낮지만 적의 이동 속도를 늦춰, 헬파이어 등 다른 방어 유닛과 포탑이 공격할 시간을 벌어주는 중요한 지원형 포탑입니다 [5, 6].
|
||||
* **메트로노모스 중포탑(Metronomos Heavy Turret):** 2026년 3월 업데이트로 도입된 포탑으로, 사격 중 발사 속도가 점차 증가하다가 플럭스 버블(Flux Bubble) 탄을 발사하는 메커니즘을 가집니다. 막대한 점사 피해(Burst Damage)를 입히므로 지속 피해를 견디는 고체력 전차를 상대하는 데 이상적입니다 [7-10].
|
||||
## 매 핵심
|
||||
|
||||
* **방어 플랫폼(Platforms) 및 설치 기반:**
|
||||
* 기본 포탑 및 중포탑을 기지에 설치하려면 특수 구조물인 방어 플랫폼(Defense Platform)이나 중형 플랫폼(Heavy Platform)이 우선적으로 마련되어야 합니다 [11].
|
||||
* 2026년 3월 연구(Research) 업데이트를 통해 플랫폼 시스템이 진화하여, 각 플랫폼이 특정 피해 유형에 대해 50%의 피해 감소(예: Armored Platform은 지속 피해 감소, Insulated Platform은 범위 피해 감소 등) 또는 상태 이상 면역(Resistor Platform)을 제공하게 되었습니다 [8, 12, 13].
|
||||
### 매 component
|
||||
- **Target acquisition**: 매 range 내 enemy 의 detection — sphere/cone overlap.
|
||||
- **Target selection**: 매 closest / lowest HP / highest threat / first / last 의 priority.
|
||||
- **Aim / tracking**: 매 turret 의 rotation 의 slerp / lerp.
|
||||
- **Firing**: 매 cooldown + projectile spawn / hitscan.
|
||||
- **Upgrade tree**: 매 damage / range / fire rate / special 의 progression.
|
||||
|
||||
* **포탑 배치 레이아웃 및 환경 조건:**
|
||||
* **배치 레이아웃(Base Layouts):** '스퀘어 베이스(Square Base)' 전략은 기관총-박격포-기관총-박격포를 교대로 배치하여 모든 방향에서 균일한 위협망을 구축하는 보편적인 전술입니다. 반면, '블리츠 베이스(Blitz Base)'는 적을 레이저 포탑이나 크라이오 캐논의 사거리 안으로 깊숙이 유인하도록 설계된 심화된 방어 구조를 가집니다 [5, 14-16].
|
||||
* **전력(Power)과의 상관관계:** 포탑이 제 기능을 발휘하려면 발전소(Power Plant)로부터 충분한 전력을 공급받아야 합니다. 전력이 부족하거나 공격자에게 발전소가 파괴될 경우, 포탑의 발사 속도가 느려지고 피해량이 평소의 50% 수준으로 크게 감소합니다 [17, 18].
|
||||
### 매 design axis
|
||||
- **Range**: 매 short (high DPS) vs long (low DPS) 의 tradeoff.
|
||||
- **AoE**: 매 splash damage — 매 group 의 효과적.
|
||||
- **Status**: 매 slow / burn / poison 의 debuff.
|
||||
- **Projectile**: 매 hitscan vs ballistic — 매 leading prediction 의 필요.
|
||||
- **Cost / placement**: 매 economic + spatial constraint.
|
||||
|
||||
## 🔗 지식 연결 (Graph)
|
||||
- **Related Topics:** [[방어 플랫폼(Defense Platforms)|방어 플랫폼(Defense Platforms)]], [[기지 방어 레이아웃(Base Layouts)|기지 방어 레이아웃(Base Layouts)]], [[전력 시스템(Power Systems)|전력 시스템(Power Systems)]]
|
||||
- **Projects/Contexts:** [[2026년 3월 연구 업데이트(March 2026 Research Drop)|2026년 3월 연구 업데이트(March 2026 Research Drop)]], [[복합 방어 전략(Combined Arms Defensive Grid)|복합 방어 전략(Combined Arms Defensive Grid)]]
|
||||
- **Contradictions/Notes:** 소스의 전투 메타에 따르면 완벽한 단일 포탑은 존재하지 않습니다. 기관총 포탑은 대공 및 대인 방어에 뛰어나나 전차에 무력하고, 박격포 탑은 전차에 강하나 대공 능력이 전무하므로 방어자는 두 포탑의 혼합 배치 및 지상/공중 혼합 방어 병력의 배치가 필수적으로 요구됩니다 [1-3].
|
||||
### 매 응용
|
||||
1. **Tower defense**: 매 wave 의 incremental difficulty.
|
||||
2. **RTS**: 매 base defense 의 layer.
|
||||
3. **FPS**: 매 area denial 의 device.
|
||||
|
||||
---
|
||||
*Last updated: 2026-04-27*
|
||||
## 💻 패턴
|
||||
|
||||
## 🤖 LLM 활용 힌트 (How to Use This Knowledge)
|
||||
### Unity 의 turret base
|
||||
```csharp
|
||||
public class Turret : MonoBehaviour
|
||||
{
|
||||
public float range = 10f;
|
||||
public float fireRate = 1f;
|
||||
public Transform muzzle;
|
||||
public GameObject projectile;
|
||||
|
||||
**언제 이 지식을 쓰는가:**
|
||||
- *(TODO)*
|
||||
private Transform target;
|
||||
private float cooldown;
|
||||
|
||||
**언제 쓰면 안 되는가:**
|
||||
- *(TODO)*
|
||||
void Update()
|
||||
{
|
||||
if (target == null || Vector3.Distance(transform.position, target.position) > range)
|
||||
target = FindTarget();
|
||||
|
||||
## 🧪 검증 상태 (Validation)
|
||||
if (target != null)
|
||||
{
|
||||
AimAt(target);
|
||||
cooldown -= Time.deltaTime;
|
||||
if (cooldown <= 0f) { Fire(); cooldown = 1f / fireRate; }
|
||||
}
|
||||
}
|
||||
|
||||
- **정보 상태:** needs_review
|
||||
- **출처 신뢰도:** A
|
||||
- **검토 이유:** *(P-Reinforce Phase 1 자동 정규화. 본문 검증 필요.)*
|
||||
Transform FindTarget()
|
||||
{
|
||||
Collider[] hits = Physics.OverlapSphere(transform.position, range, LayerMask.GetMask("Enemy"));
|
||||
return hits.OrderBy(c => Vector3.Distance(transform.position, c.transform.position))
|
||||
.FirstOrDefault()?.transform;
|
||||
}
|
||||
|
||||
## 🧬 중복 검사 (Duplicate Check)
|
||||
void AimAt(Transform t)
|
||||
{
|
||||
Vector3 dir = (t.position - transform.position).normalized;
|
||||
Quaternion target = Quaternion.LookRotation(dir);
|
||||
transform.rotation = Quaternion.Slerp(transform.rotation, target, Time.deltaTime * 8f);
|
||||
}
|
||||
|
||||
- **기존 유사 문서:** *(TODO: 인덱서 클러스터 리포트 참조)*
|
||||
- **처리 방식:** UPDATE (자동 정규화)
|
||||
- **처리 이유:** Phase 1 정규화 — 옛 템플릿/누락 필드 보강.
|
||||
void Fire()
|
||||
{
|
||||
Instantiate(projectile, muzzle.position, muzzle.rotation);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## ⚠️ 모순 및 업데이트 (Contradictions & Updates)
|
||||
### Target priority strategy
|
||||
```csharp
|
||||
public enum Priority { Closest, Lowest, Highest, First, Last }
|
||||
|
||||
- **과거 데이터와의 충돌:** 없음
|
||||
- **정책 변화:** 없음
|
||||
Transform FindTarget(Priority p)
|
||||
{
|
||||
var enemies = Physics.OverlapSphere(transform.position, range, enemyLayer)
|
||||
.Select(c => c.GetComponent<Enemy>()).Where(e => e != null);
|
||||
|
||||
## 🕓 변경 이력 (Changelog)
|
||||
return p switch
|
||||
{
|
||||
Priority.Closest => enemies.OrderBy(e => Vector3.Distance(transform.position, e.transform.position)).FirstOrDefault()?.transform,
|
||||
Priority.Lowest => enemies.OrderBy(e => e.HP).FirstOrDefault()?.transform,
|
||||
Priority.Highest => enemies.OrderByDescending(e => e.HP).FirstOrDefault()?.transform,
|
||||
Priority.First => enemies.OrderByDescending(e => e.PathProgress).FirstOrDefault()?.transform,
|
||||
Priority.Last => enemies.OrderBy(e => e.PathProgress).FirstOrDefault()?.transform,
|
||||
_ => null,
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
| 날짜 | 변경 내용 | 처리 방식 | 신뢰도 |
|
||||
|------|-----------|-----------|--------|
|
||||
| 2026-05-08 | P-Reinforce Phase 1 정규화 (frontmatter + 헤더 표준화) | UPDATE | A |
|
||||
### Ballistic leading
|
||||
```csharp
|
||||
// 매 moving target 의 prediction
|
||||
Vector3 PredictAimPoint(Vector3 targetPos, Vector3 targetVel, float projectileSpeed)
|
||||
{
|
||||
Vector3 toTarget = targetPos - muzzle.position;
|
||||
float a = Vector3.Dot(targetVel, targetVel) - projectileSpeed * projectileSpeed;
|
||||
float b = 2f * Vector3.Dot(targetVel, toTarget);
|
||||
float c = Vector3.Dot(toTarget, toTarget);
|
||||
float disc = b * b - 4f * a * c;
|
||||
if (disc < 0f) return targetPos;
|
||||
float t = (-b - Mathf.Sqrt(disc)) / (2f * a);
|
||||
return targetPos + targetVel * t;
|
||||
}
|
||||
```
|
||||
|
||||
### AoE projectile
|
||||
```csharp
|
||||
public class ExplosiveProjectile : MonoBehaviour
|
||||
{
|
||||
public float radius = 3f;
|
||||
public float damage = 50f;
|
||||
|
||||
void OnCollisionEnter(Collision col)
|
||||
{
|
||||
foreach (var c in Physics.OverlapSphere(transform.position, radius, enemyLayer))
|
||||
{
|
||||
float dist = Vector3.Distance(transform.position, c.transform.position);
|
||||
float falloff = 1f - dist / radius;
|
||||
c.GetComponent<Enemy>()?.TakeDamage(damage * falloff);
|
||||
}
|
||||
Destroy(gameObject);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Upgrade tree (ScriptableObject)
|
||||
```csharp
|
||||
[CreateAssetMenu]
|
||||
public class TurretUpgrade : ScriptableObject
|
||||
{
|
||||
public string displayName;
|
||||
public int cost;
|
||||
public float damageMultiplier = 1f;
|
||||
public float rangeMultiplier = 1f;
|
||||
public float fireRateMultiplier = 1f;
|
||||
public TurretUpgrade[] nextChoices;
|
||||
}
|
||||
```
|
||||
|
||||
### Godot 의 turret (GDScript)
|
||||
```gdscript
|
||||
extends Node3D
|
||||
|
||||
@export var range: float = 10.0
|
||||
@export var fire_rate: float = 1.0
|
||||
var cooldown := 0.0
|
||||
|
||||
func _physics_process(delta: float) -> void:
|
||||
var target := _find_target()
|
||||
if target:
|
||||
look_at(target.global_position, Vector3.UP)
|
||||
cooldown -= delta
|
||||
if cooldown <= 0:
|
||||
_fire()
|
||||
cooldown = 1.0 / fire_rate
|
||||
|
||||
func _find_target() -> Node3D:
|
||||
var space := get_world_3d().direct_space_state
|
||||
var query := PhysicsShapeQueryParameters3D.new()
|
||||
var shape := SphereShape3D.new()
|
||||
shape.radius = range
|
||||
query.shape = shape
|
||||
query.transform = global_transform
|
||||
query.collision_mask = 2 # enemy layer
|
||||
var hits := space.intersect_shape(query)
|
||||
return hits[0].collider if hits else null
|
||||
```
|
||||
|
||||
## 매 결정 기준
|
||||
| 상황 | Approach |
|
||||
|---|---|
|
||||
| 매 tower defense | Closest / First priority + AoE |
|
||||
| 매 RTS base defense | Highest HP / threat priority |
|
||||
| 매 boss arena | Lowest HP focus fire |
|
||||
| 매 fast enemy | Hitscan + slow status |
|
||||
| 매 swarm | AoE + chain lightning |
|
||||
| 매 armored | Pierce / true damage |
|
||||
|
||||
**기본값**: 매 tower defense — Closest priority, ballistic projectile, 3-tier upgrade tree, $50-200 cost range.
|
||||
|
||||
## 🔗 Graph
|
||||
- 부모: [[Game Mechanics]] · [[AI Behaviors]]
|
||||
- 변형: [[Tower Defense]] · [[Sentry Gun]] · [[Auto-aim]]
|
||||
- 응용: [[Bloons TD]] · [[Plants vs Zombies]] · [[Team Fortress 2]]
|
||||
- Adjacent: [[Wave System]] · [[Pathfinding]] · [[Projectile Physics]]
|
||||
|
||||
## 🤖 LLM 활용
|
||||
**언제**: 매 turret upgrade tree 의 brainstorm, 매 balance spreadsheet 의 generation, 매 priority logic 의 review.
|
||||
**언제 X**: 매 production combat tuning — 매 playtest data + analytics 의 우선.
|
||||
|
||||
## 매 안티패턴
|
||||
- **Single priority**: 매 closest only — 매 player choice 의 부재.
|
||||
- **No leading**: 매 fast enemy 의 ballistic miss — 매 prediction 의 누락.
|
||||
- **Linear upgrade**: 매 X% damage 의 monotone — 매 build diversity 의 부재.
|
||||
- **Cost imbalance**: 매 best turret 의 always cheapest — 매 dominant strategy.
|
||||
- **No counter**: 매 single tower 의 모든 enemy 의 처치 — 매 strategic depth 의 부재.
|
||||
|
||||
## 🧪 검증 / 중복
|
||||
- Verified (Bloons TD 6 design retrospective, GDC talks, Unity / Godot docs).
|
||||
- 신뢰도 A-.
|
||||
|
||||
## 🕓 Changelog
|
||||
| 날짜 | 변경 |
|
||||
|---|---|
|
||||
| 2026-05-08 | Phase 1 |
|
||||
| 2026-05-10 | Manual cleanup — turret components + Unity/Godot patterns |
|
||||
|
||||
Reference in New Issue
Block a user