전체 글 225

멀티플레이 게임전환 과정 정리(3)

캐릭터가 다른 레벨로 이동하는 것을 서버와 동기화하도록 목표 ServerTravel 을 이용해 캐릭터 다른 레벨로 이동하는 것을 서버로 보내고 이를 동기화하려했지만다른 클라이언트의 캐릭터도 같이 다른 레벨로 이동을 하는 것을 확인. 동시 이동 멀티 플레이어 게임이라면 다른 플레이어가 다른 레벨로 이동을 해도 본인은 당연히 그 마을에 있어야 한다.(설령 파티라도)보스전 같은 건 제외일순 있다. 그래서 캐릭터들이 개별적으로 레벨을 이동하는 것을 목표로 해서 방법을 찾아보았다. 1. 존 서버 분리 방식 마스터 서버를 하나 만들고, 레벨마다 별도의 서버 프로세스가 실행되도록 서버를 분리하는 방식,플레이어가 포탈을 타서 레벨을 이동하면 현재 서버와 연결을 끊고 목적지 서버에 재접속마스터 서버가 캐릭터 데이터(..

카테고리 없음 2026.05.26

디자인패턴) MVC(Model-View-Controller) 패턴

MVC 패턴데이터, 화면, 로직을 세 역할로 분리하는 패턴 Model데이터 그 자체, 화면이 어떻게 보이는지 전혀 모름 View화면 출력만 담당, 데이터를 직접 건드리지 않는다. ControllerModel과 View를 연결합니다. 입력을 받아 Model을 수정하고, 결과를 View에 반영 사용자가 입력을 했다 -> Controller (입력 처리) -> Model (데이터 변경) -> Controller (변경 감지) -> View (화면 갱신) 장점1. 역할 분리로 유지보수 용이2. 재사용성 -> 같은 Model을 다른 view로 표현 가능3. 테스트 용이 -> Model은 UI 없이 독립적으로 테스트 가능 단점1. Controller가 비대해짐 -> Model과 View를 연결하는 로직이 ..

디자인패턴 2026.05.08

디자인패턴) 템플릿 메서드 패턴(Template Method Pattern)

템플릿 메서드 패턴전체 알고리즘의 골격은 부모 클래스가 정의하고, 세부 구현은 자식이 채우는 패턴 C++ 템플릿 메서드 패턴 구현// AEnemy (부모) - 골격 정의void AEnemy::BaseAttack(){ // 1. 쿨다운 확인 (공통 - 자식이 바꿀 수 없음) if (!bCanAttack) return; // 2. 몽타주 선택 후 재생 (자식마다 다름) UAnimMontage* Montage = SelectAttackMontage(); // ← 훅 메서드 // 3. 쿨다운 시작 (공통 - 자식이 바꿀 수 없음) bCanAttack = false; GetWorld()->GetTimerManager().SetTimer( AttackTimerH..

디자인패턴 2026.05.08

디자인패턴) 컴포지트 패턴(Composite Pattern)

컴포지트 패턴개별 객체와 객체들의 묶음(그룹)을 동일하게 다루는 패턴 컴포지트 패턴은 트리 구조로 표현된다. 그룹 A를 실행하면 트리를 따라 내려가 D, E, C 전부 실행된다. C++ 컴포넌트 패턴 구현// 공통 인터페이스 (단일 & 그룹 모두 이걸 구현)class ISkillComponent{public: virtual void Execute() = 0; virtual float GetCost() = 0;};// 단일 객체 (Leaf)class USingleSkill : public ISkillComponent{ FString Name; float ManaCost; void Execute() override { UE_LOG(LogTemp, Log,..

디자인패턴 2026.05.08

디자인패턴) 데코레이터 패턴(Decorator Pattern)

데코레이터 패턴기존 객체를 수정하지 않고,감싸서 기능을 동적으로 추가하는 패턴 캐릭터에 버프를 추가한다고 가정ACharacter├── ACharacter_SpeedBuff (속도 버프)├── ACharacter_AttackBuff (공격력 버프)├── ACharacter_SpeedAttackBuff (속도 + 공격력 버프)├── ACharacter_ShieldBuff (방어 버프)├── ACharacter_SpeedShieldBuff (속도 + 방어 버프)├── ACharacter_AttackShieldBuff...└── ... 조합이 늘어날수록 클래스 폭발 C++ 데코레이터 패턴 적용// 공통 인터페이스class ICharacterStats{public: virtua..

디자인패턴 2026.05.08

디자인패턴) 옵저버 패턴(Observer Pattern)

옵저버 패턴어떤 객체의 상태가 변하면, 그것을 구독하고 있는 객체들에게 자동으로 알려주는 패턴 캐릭터의 HP가 바뀔때 관련된 모든 시스템을 직접 호출해야 한다.void AEnemy::TakeDamage(float Damage){ CurrentHP -= Damage; // HP가 바뀔 때마다 관련된 걸 전부 직접 호출 HPBarWidget->UpdateHP(CurrentHP, MaxHP); // UI 갱신 MinimapSystem->UpdateEnemyState(this); // 미니맵 갱신 QuestSystem->CheckKillCondition(this); // 퀘스트 확인 AchievementSystem->Check(this); /..

디자인패턴 2026.05.08

디자인패턴) 팩토리 메서드, 추상 팩토리 패턴

팩토리 메서드객체를 만드는 메서드를 서브클래스에서 결정하도록 하는 패턴부모 클래스는 "뭔가를 만들어라"라고 정의만 하고, 실제로 뭘 만들지는 자식 클래스가 결정하는 것 // 부모: "적을 만들어라" 라고 선언만 함class ASpawner{public: // 팩토리 메서드 (서브클래스가 구현) virtual AEnemy* CreateEnemy() = 0; // 공통 로직은 여기서 처리 void SpawnEnemy() { AEnemy* Enemy = CreateEnemy(); // 뭘 만들지는 자식이 결정 Enemy->SetActorLocation(SpawnPoint); Enemy->InitializeAI(); }};// 자식: 실제로..

디자인패턴 2026.05.08

디자인패턴) 싱글톤(Singleton)

싱글톤 프로그램 전체에서 인스턴스가 딱 하나만 존재하도록 보장하는 것 게임에서 보통- 게임 상태 관리(일시정지, 게임오버 등)하는 게임 매니저- BGM 등을 재생하는 사운드 매니저- 세이브 파일을 관리하는 저장 시스템등등은 전역에서 하나만 있어야 한다. 두개가 있다면 충돌이 일어날 수도 있어서 위험.이러한 충돌을 막기 위해, 클래스는 무조건 하나만 만들어지도록 강제하는 것이 싱글톤 패턴이다. C++기본 구현class SoundManager{public: // 유일한 인스턴스를 반환하는 정적 함수 static SoundManager& Get() { static SoundManager Instance; // 최초 호출 시 딱 한 번만 생성 return Insta..

디자인패턴 2026.05.08

그래픽스) 쿼터니언

3D에서 회전을 표현하는 방식은 여러가지가 있다. 오일러 각 : X,Y, Z 축 회전값 3개로 표현(Roll, Pitch, Yaw)회전 행렬 : 3X3 행렬로 표현쿼터니언 : 4개의 숫자로 표현 오일러 각이 가장 직관적이지만 짐벌락 문제가 존재 짐벌 : 3개의 링이 각각 X, Y, Z축으로 회전하는 구조 오일러 각은 X -> Y -> Z 순서로 순차적으로 회전을 적용여기서 중간 축 Y를 90도 회전시키면, Z축이랑 같은 평면에 겹쳐버림. 사실상 회전 개수가 2개로 줄어드는 셈이러한 현상을 짐벌락이하고 한다. 게임에서는 캐릭터가 고개를 90도 젖혔을 때 좌우 회전이 이상하게 되는 현상과 비슷 이러한 문제를 해결하기 위해 쿼터니언을 사용 q = w+xi + yj+ zk(w : 실수, 회전량)(x, y, z ..

그래픽스 2026.05.08

그래픽스) 월드, 뷰, 프로젝션 변환

1단계 월드 변환 오브젝트의 로컬 좌표 -> 월드 좌표고 변환 모든 오브젝트는 처음엔 자기 자신을 원점(0,0,0)으로 삼는 로컬 공간에 존재이걸 실제 게임 세계의 좌표계로 배치하는 과정 언리얼에서는 SetActorLocation, SetActorRotation 이 곧 월드 행렬 조작 2단계 뷰 변환월드 공간 전체를 카메라를 원점으로 삼는 좌표계로 변환카메라를 움직이는 게 아닌, 카메라가 원점,정면을 보는 것처럼 월드 전체를 반대로 이동/회전시키는 개념 카메라 위치, 방향, 위쪽 방향 세가지로 뷰 행렬이 구성 3단계 프로젝션 변환 뷰 공간의 3D 좌표 -> 클립 공간으로 변환 멀리 있는 건 작게, 가까이 있는 건 크게 보이는 것이 이 단계에서 결정 1. 원근 투영 : 멀리 있을 수록 작아 보임. 2. ..

그래픽스 2026.05.07