본문 바로가기

분류 전체보기852

011. 싱글톤 GameManager & 승리 조건 게임 전체 상태를 관리하는 싱글톤 GameManager를 만들고,적을 n명 잡으면 승리하는 조건을 구현한 과정을 기록한다. 1. 싱글톤(Singleton) 패턴이란?"게임에 딱 하나만 존재하는 오브젝트"를 만드는 패턴.이번 작업에서는 GameManager를 싱글톤으로 만들어 보려고 한다.비유하자면학교에 교장선생님은 한 명.누구든 "교장선생님"이라고 하면 같은 사람을 가리킴.GameManager도 마찬가지.어떤 스크립트에서든 GameManager.Instance 라고 하면 같은 객체를 가리킴.코드 구조public class GameManager : MonoBehaviour{ public static GameManager Instance { get; private set; } private v.. 2026. 4. 15.
010. 플레이어 체력 & 게임오버 플레이어에게 체력을 부여하고, 적의 공격에 데미지를 받고,HP가 0이 되면 버드아이뷰 카메라 연출과 함께 게임오버되는 기능을 구현한 과정을 기록한다. 1. PlayerHealth.cs — 새로 만든 스크립트역할플레이어 HP 관리 + 데미지 처리 + 게임오버 연출핵심 변수[SerializeField] private int maxHp = 5;[SerializeField] private float invincibleDuration = 1f;[SerializeField] private Text hpText;[SerializeField] private GameObject gameOverPanel;[SerializeField] private float birdEyeHeight = 30f;[SerializeFie.. 2026. 4. 13.
009. 적 체력(HP) 시스템 한 발에 죽던 적에게 체력을 부여해서 n발 맞아야 죽도록 변경하고,죽을 때 이펙트와 함께 사라지는 연출을 추가한 과정을 기록한다. 1. 변경 전 vs 변경 후변경 전총알 맞음 → OnHit() → 무조건 Die() = 그냥 멈춰있음변경 후총알 맞음 → OnHit() → HP 감소 → HP > 0: 넉백 + 0.5초 후 행동 재개 → HP 2. HP 시스템 구현추가된 변수[SerializeField][Tooltip("최대 체력")]private int maxHp = 3;[SerializeField][Tooltip("넉백 후 다시 행동을 재개하기까지의 시간 (초)")]private float stunDuration = 0.5f;private int _hp;maxHp: Inspector에서 조절 .. 2026. 4. 13.
008. 넉백 코드 리팩토링 멘토 피드백을 반영하여 Bullet이 Enemy 내부를 직접 조작하던 구조를Enemy.OnHit()으로 역할을 분리한 과정을 기록한다. 1. 멘토 피드백 요약Bullet이 넉백을 직접 처리하기보다 Enemy에 넉백을 요청하는 등 역할을 분리하는 것이이후에 상태 추가나 유지보수 측면에서 더 유연한 구조가 될 수 있습니다. 2. 문제: 높은 결합도기존 Bullet.cs가 Enemy의 내부를 너무 많이 알고 있었다:// Bullet.cs가 Enemy의 내부를 직접 조작 (나쁜 예)agent.enabled = false; // NavMeshAgent 끄기enemyRb.isKinematic = false; // Rigidbody 설정enemyRb.constraints = ...; .. 2026. 4. 13.
007. 넉백(Knockback) 구현 총알이 적에 맞았을 때 뒤로 밀려나는 넉백 효과를 구현한 과정을 기록한다.삽질이 많았던 파트! 1. 넉백이란?적이 공격을 받았을 때 뒤로 밀려나는 효과. 게임에서 타격감을 주는 핵심 요소다.총알 → → → 💥 적 적 → → (뒤로 밀려남)구현에 필요한 것Enemy에 Rigidbody - 물리 힘을 받을 수 있어야 함AddForce() - Rigidbody에 힘을 가하는 함수NavMeshAgent 비활성화 - Agent가 위치를 잡으면 밀리지 않음 2. Enemy에 Rigidbody 추가 설정은 다음과 같다.Is Kinematic: 체크 ✅ - 평소에는 물리 영향 안 받음 (NavMeshAgent가 이동 담당)Use Gravity: 해제 - NavMeshAgent가 바닥에 붙.. 2026. 4. 6.
006. 총알에 오브젝트 풀링 적용하기 Instantiate/Destroy 방식을 오브젝트 풀링으로 교체하여총알이 재사용되도록 구현한 과정을 기록한다. 1. 왜 오브젝트 풀링이 필요한가?Instantiate/Destroy의 문제발사! → Instantiate(총알 생성) → 날아감 → Destroy(총알 파괴)발사! → Instantiate(총알 생성) → 날아감 → Destroy(총알 파괴)발사! → Instantiate(총알 생성) → 날아감 → Destroy(총알 파괴)... 수백 번 반복 이 방식의 문제점은매번 메모리를 할당하고 해제 → CPU에 부하가비지 컬렉션(GC) 발생 → 게임이 순간적으로 멈칫(버벅임)빠르게 연사하면 프레임 드랍 비유하자면Instantiate/Destroy = 일회용 종이컵 매번 새 컵 만들기 → 쓰고 버리.. 2026. 4. 6.