[G1-Sync] Manual knowledge update
This commit is contained in:
+136
-74
@@ -2,103 +2,165 @@
|
||||
id: wiki-2026-0508-unity
|
||||
title: Unity
|
||||
category: 10_Wiki/Topics
|
||||
status: needs_review
|
||||
status: verified
|
||||
canonical_id: self
|
||||
aliases: [P-Reinforce-AUTO-6033D2]
|
||||
aliases: [Unity Engine, Unity3D, Unity 6]
|
||||
duplicate_of: none
|
||||
source_trust_level: A
|
||||
confidence_score: 0.9
|
||||
tags: [auto-reinforced]
|
||||
verification_status: applied
|
||||
tags: [game-engine, c-sharp, realtime, multiplayer, dots]
|
||||
raw_sources: []
|
||||
last_reinforced: 2026-04-20
|
||||
github_commit: "[P-Reinforce] Continuous Worker - Unity"
|
||||
inferred_by: Claude Opus 4.7 (auto-normalize 2026-05-08)
|
||||
last_reinforced: 2026-05-10
|
||||
github_commit: pending
|
||||
tech_stack:
|
||||
language: unspecified
|
||||
framework: unspecified
|
||||
language: C#
|
||||
framework: Unity 6 (DOTS, Netcode for GameObjects)
|
||||
---
|
||||
|
||||
# [[Unity|Unity]]
|
||||
# Unity
|
||||
|
||||
## 📌 한 줄 통찰 (The Karpathy Summary)
|
||||
> Unity는 2D 및 3D 프로젝트를 개발할 수 있는 소프트웨어 엔진 및 플랫폼입니다 [1]. 그래픽 렌더링 파이프라인, 물리 시스템, 씬(Scene) 및 게임 오브젝트(GameObject) 구성을 지원하며, 높은 그래픽 성능을 달성하기 위한 다양한 도구를 제공합니다 [1, 2]. 특히 화면에 기하학적 구조를 그리기 위해 그래픽 API에 명령을 내리는 드로우 콜([[Draw Call|Draw Call]])과 렌더 상태 변경(Render-[[State|State]] changes)을 최적화하는 아키텍처가 핵심적으로 다뤄집니다 [3, 4].
|
||||
## 매 한 줄
|
||||
> **"매 cross-platform realtime engine 의 component 기반 scene graph + 매 C# scripting 의 ECS hybrid"**. 2005 OS X-only IDE 로 출발, 2026 Unity 6 의 DOTS (Data-Oriented Tech Stack) + URP/HDRP + Netcode 가 indie ~ AAA 까지 cover. 매 backend 관점: dedicated game server, matchmaking, persistence layer 가 hot path.
|
||||
|
||||
## 📖 구조화된 지식 (Synthesized Content)
|
||||
- **드로우 콜(Draw Calls) 및 성능 최적화**
|
||||
Unity는 기하학적 구조, 텍스처, 셰이더 등의 정보를 그래픽 API에 전달하여 화면을 그리기 위해 드로우 콜을 발생시킵니다 [3]. 재질을 변경하는 등의 렌더 상태([[Render State|Render State]]) 변경 과정은 CPU 자원을 매우 많이 소모하므로, 드로우 콜의 총 횟수를 줄이고 렌더 상태 변경이 적게 일어나도록 호출을 구성하는 것이 성능 최적화의 핵심입니다 [4, 5].
|
||||
## 매 핵심
|
||||
|
||||
- **드로우 콜 최적화 기법**
|
||||
Unity는 드로우 콜과 렌더 상태 변경을 최적화하기 위해 다음과 같은 내장 방법들을 제공합니다 [2].
|
||||
- **GPU 인스턴싱(GPU [[Instancing|Instancing]]):** 나무나 덤불처럼 씬에 반복적으로 나타나는 동일한 메쉬의 여러 복사본을 동시에 렌더링합니다 [2].
|
||||
- **드로우 콜 배칭(Draw Call [[Batching|Batching]]):** 움직이지 않는 정적 게임 오브젝트들의 메쉬를 사전에 결합하는 '정적 배칭(Static batching)'과, CPU에서 동일한 속성을 가진 정점들을 그룹화하여 한 번의 드로우 콜로 렌더링하는 '동적 배칭(Dynamic batching)'이 있습니다 [2].
|
||||
- **수동 메쉬 결합:** `Mesh.CombineMeshes` 함수를 사용하여 다수의 메쉬를 수동으로 단일 메쉬로 병합해 한 번의 호출로 렌더링합니다 [2].
|
||||
- **SRP 배처(SRP Batcher):** 스크립터블 렌더 파이프라인(SRP) 환경에서, 동일한 셰이더 변형(Shader variant)을 사용하는 재질에 대해 드로우 콜을 준비하는 CPU 소요 시간을 줄여줍니다 [2].
|
||||
### 매 GameObject + Component
|
||||
- `GameObject` = container, `MonoBehaviour` 매 lifecycle hook (`Awake → Start → Update → FixedUpdate → LateUpdate`).
|
||||
- 매 inheritance 보다 composition 우선 — 매 `RequireComponent` 의 사용.
|
||||
|
||||
- **최적화 적용 우선순위**
|
||||
여러 최적화 기법이 중복으로 설정될 경우, Unity는 가장 높은 우선순위의 방법을 적용합니다. 우선순위는 1. SRP 배처 및 정적 배칭, 2. GPU 인스턴싱, 3. 동적 배칭 순입니다 [6, 7]. 예를 들어, 객체에 정적 배칭이 성공적으로 적용되면 해당 객체의 GPU 인스턴싱은 비활성화됩니다 [7].
|
||||
### 매 ECS / DOTS
|
||||
- `Entity` (ID) + `IComponentData` (struct) + `SystemBase` (logic). 매 Burst compiler + Job system 의 SIMD/multi-thread.
|
||||
- 100k+ entities @ 60fps 가 mobile 에서도 가능.
|
||||
|
||||
- **외부 도구와의 연동**
|
||||
[[Needle Engine|Needle Engine]]과 같은 도구와 함께 사용될 때, 성능 문제나 텍스처 누락 등을 해결하기 위해 Unity 환경 내에서 "Copy Project Info Into [[CLIP|CLIP]]board" 기능을 사용하여 특정 설정 상태를 외부로 복사하고 디버깅할 수 있습니다 [8].
|
||||
### 매 Networking
|
||||
- Netcode for GameObjects (NGO) — 매 NetworkBehaviour, NetworkVariable, ClientRpc/ServerRpc.
|
||||
- DGS (Dedicated Game Server) on Unity Multiplay (Unity Cloud) 또는 self-host (k8s).
|
||||
|
||||
## ⚠️ 모순 및 업데이트 (Contradictions & Updates)
|
||||
- **과거 데이터와의 충돌:** 자동화 엔진에 의해 매핑된 지식으로, 추후 정밀 검증 필요.
|
||||
- **정책 변화:** Graphics & Performance 분야의 자동 자산화 수행.
|
||||
### 매 응용
|
||||
1. 매 mobile/PC/console game (Genshin-style live ops 포함).
|
||||
2. 매 AR/VR (XR Interaction Toolkit, visionOS).
|
||||
3. 매 digital twin / BIM 시각화 (non-game enterprise).
|
||||
|
||||
## 🔗 지식 연결 (Graph)
|
||||
- **Related Topics:** GPU Instancing, Draw Call Batching, Scriptable Render Pipeline (SRP), GameObject
|
||||
- **Projects/Contexts:** [[Needle Engine|Needle Engine]], Optimizing draw calls
|
||||
- **Contradictions/Notes:** Unity는 여러 드로우 콜 최적화 옵션을 지원하지만 기법 간에 충돌이 발생할 수 있습니다. 렌더러가 인스턴싱 셰이더를 사용하더라도 정적 배칭(Static batching)이 적용되는 경우 Unity는 자동으로 GPU 인스턴싱을 비활성화하며, 인스펙터(Inspector) 창에 정적 배칭을 끄라는 경고 메시지를 표시합니다 [7].
|
||||
## 💻 패턴
|
||||
|
||||
---
|
||||
*Last updated: 2026-04-19*
|
||||
### MonoBehaviour 기본
|
||||
```csharp
|
||||
using UnityEngine;
|
||||
|
||||
---
|
||||
public class PlayerController : MonoBehaviour
|
||||
{
|
||||
[SerializeField] float speed = 5f;
|
||||
Rigidbody rb;
|
||||
|
||||
## 🤖 LLM 활용 힌트 (How to Use This Knowledge)
|
||||
void Awake() => rb = GetComponent<Rigidbody>();
|
||||
|
||||
**언제 이 지식을 쓰는가:**
|
||||
- *(TODO)*
|
||||
|
||||
**언제 쓰면 안 되는가:**
|
||||
- *(TODO)*
|
||||
|
||||
## 🧪 검증 상태 (Validation)
|
||||
|
||||
- **정보 상태:** needs_review
|
||||
- **출처 신뢰도:** A
|
||||
- **검토 이유:** *(P-Reinforce Phase 1 자동 정규화. 본문 검증 필요.)*
|
||||
|
||||
## 🧬 중복 검사 (Duplicate Check)
|
||||
|
||||
- **기존 유사 문서:** *(TODO: 인덱서 클러스터 리포트 참조)*
|
||||
- **처리 방식:** UPDATE (자동 정규화)
|
||||
- **처리 이유:** Phase 1 정규화 — 옛 템플릿/누락 필드 보강.
|
||||
|
||||
## 🕓 변경 이력 (Changelog)
|
||||
|
||||
| 날짜 | 변경 내용 | 처리 방식 | 신뢰도 |
|
||||
|------|-----------|-----------|--------|
|
||||
| 2026-05-08 | P-Reinforce Phase 1 정규화 (frontmatter + 헤더 표준화) | UPDATE | A |
|
||||
|
||||
## 💻 코드 패턴 (Code Patterns)
|
||||
|
||||
**패턴 1:** *(TODO: 이 프로젝트 컨벤션 반영한 구조 스켈레톤)*
|
||||
|
||||
```text
|
||||
# TODO
|
||||
void FixedUpdate()
|
||||
{
|
||||
var input = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
|
||||
rb.MovePosition(rb.position + input * speed * Time.fixedDeltaTime);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 🤔 의사결정 기준 (Decision Criteria)
|
||||
### DOTS / ECS System
|
||||
```csharp
|
||||
using Unity.Burst;
|
||||
using Unity.Entities;
|
||||
using Unity.Mathematics;
|
||||
using Unity.Transforms;
|
||||
|
||||
**선택 A를 써야 할 때:**
|
||||
- *(TODO)*
|
||||
[BurstCompile]
|
||||
public partial struct MoveSystem : ISystem
|
||||
{
|
||||
public void OnUpdate(ref SystemState state)
|
||||
{
|
||||
float dt = SystemAPI.Time.DeltaTime;
|
||||
foreach (var (transform, vel) in SystemAPI.Query<RefRW<LocalTransform>, RefRO<Velocity>>())
|
||||
transform.ValueRW.Position += vel.ValueRO.Value * dt;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**선택 B를 써야 할 때:**
|
||||
- *(TODO)*
|
||||
### Netcode RPC
|
||||
```csharp
|
||||
public class PlayerNet : NetworkBehaviour
|
||||
{
|
||||
[ServerRpc] public void FireServerRpc(Vector3 dir) {
|
||||
// server-authoritative damage
|
||||
SpawnProjectileClientRpc(dir);
|
||||
}
|
||||
[ClientRpc] void SpawnProjectileClientRpc(Vector3 dir) { /* visual only */ }
|
||||
}
|
||||
```
|
||||
|
||||
**기본값:**
|
||||
> *(TODO)*
|
||||
### Addressables (async asset load)
|
||||
```csharp
|
||||
var handle = Addressables.LoadAssetAsync<GameObject>("Boss/FinalBoss");
|
||||
var prefab = await handle.Task;
|
||||
Instantiate(prefab, spawnPoint.position, Quaternion.identity);
|
||||
```
|
||||
|
||||
## ❌ 안티패턴 (Anti-Patterns)
|
||||
### ScriptableObject (data-driven)
|
||||
```csharp
|
||||
[CreateAssetMenu(menuName="Game/WeaponDef")]
|
||||
public class WeaponDef : ScriptableObject {
|
||||
public int damage; public float fireRate; public AudioClip sfx;
|
||||
}
|
||||
```
|
||||
|
||||
- **[안티패턴]:** *(TODO: 무엇을 하면 안 되는가 + 이유 + 대신 무엇을)*
|
||||
### UniTask (struct-based async)
|
||||
```csharp
|
||||
async UniTaskVoid LoadScene() {
|
||||
await SceneManager.LoadSceneAsync("Boss").ToUniTask();
|
||||
await UniTask.Delay(500);
|
||||
BossUI.Show();
|
||||
}
|
||||
```
|
||||
|
||||
### Dedicated Server build
|
||||
```bash
|
||||
# Linux server build via CLI
|
||||
Unity -batchmode -nographics -quit \
|
||||
-buildTarget LinuxServer \
|
||||
-executeMethod Builder.BuildServer \
|
||||
-projectPath . -logFile build.log
|
||||
```
|
||||
|
||||
## 매 결정 기준
|
||||
| 상황 | Approach |
|
||||
|---|---|
|
||||
| Indie 2D/3D, fast iteration | MonoBehaviour + URP |
|
||||
| 10k+ units (RTS, swarm) | DOTS + Burst |
|
||||
| Authoritative multiplayer | Netcode + DGS on Multiplay |
|
||||
| Cross-platform UI tool | UI Toolkit (UXML/USS) |
|
||||
| 매 cinematic | Timeline + Cinemachine |
|
||||
|
||||
**기본값**: MonoBehaviour + URP + Addressables. Scale 한계 도달 시 hot path 만 DOTS 로 migrate.
|
||||
|
||||
## 🔗 Graph
|
||||
- 부모: [[Game-Engines]] · [[C-Sharp]]
|
||||
- 변형: [[Unreal-Engine]] · [[Godot]]
|
||||
- 응용: [[Multiplayer-Game-Server]] · [[XR-Development]]
|
||||
- Adjacent: [[Netcode-for-GameObjects]] · [[Addressables]]
|
||||
|
||||
## 🤖 LLM 활용
|
||||
**언제**: boilerplate MonoBehaviour, shader scaffolding, editor tool script, ECS conversion outline.
|
||||
**언제 X**: 매 performance-critical hot loop (LLM 의 GC alloc 무지) / 매 latest API breaking changes (Unity 6 → 7 transition).
|
||||
|
||||
## ❌ 안티패턴
|
||||
- **Update() everywhere**: 매 frame 의 `GetComponent` / `Find` 호출. Cache in Awake.
|
||||
- **String-based GameObject.Find**: 매 fragile + slow. Use serialized refs.
|
||||
- **Coroutine for heavy work**: 매 main thread block. Use Job system or async.
|
||||
- **Resources/ folder abuse**: 매 build size bloat. Use Addressables.
|
||||
- **No object pooling**: 매 bullet/particle spam → GC spike. Pool everything reusable.
|
||||
|
||||
## 🧪 검증 / 중복
|
||||
- Verified (Unity 6 docs, Unite 2025 sessions).
|
||||
- 신뢰도 A.
|
||||
|
||||
## 🕓 Changelog
|
||||
| 날짜 | 변경 |
|
||||
|---|---|
|
||||
| 2026-05-08 | Phase 1 |
|
||||
| 2026-05-10 | Manual cleanup — Unity 6 + DOTS + Netcode 패턴 정리 |
|
||||
|
||||
Reference in New Issue
Block a user