전체 글 68

10.13 GAS 주요 클래스 - GameplayEffect

2025.07.14 - [공부/SeSac 캠프 언리얼 과정] - 07.14 GAS 주요 클래스 - Ability2025.07.08 - [공부/SeSac 캠프 언리얼 과정] - 07.08 GAS 세팅, Attribute Class GameplayEffect : 실제 피격 효과를 구현. : 이를 조합해서 하나의 공격(Ability)가 완성된다. DurationPolicy - Instant : 즉시 적용 ex) 단발성 데미지 - HasDuration : 일정 시간동안 지속 ex) 버프, 디버프 : 이 경우 DurationMagnitude 속성값을 통해 지속 시간을 설정한다. - Infinite : 무한 지속. ex) 패시브 FGameplayModifierInfo : Attribute에 어떤..

두 가지의 오버라이드 (C++ 11 이상)

오버라이딩과 함수 숨기기 : C++ 11 문법에서 새롭게 등장한 개념으로, virtual 함수의 재정의와 일반 함수의 재정의를 구분 짓기 위해 도입된 것으로 생각된다. : virtual 함수를 재정의하는 것은 Overriding(오버라이딩)이라고 하며, virtual 키워드와 override 키워드를 사용한다. : 일반 함수를 재정의하는 것은 Function Hiding(함수 숨기기)라고 하며, 별도의 키워드를 사용하지 않는다. 오버라이드 : 가상 함수를 자식 클래스에서 재정의하여, 객체의 실제 함수 포인터를 호출하도록 한다. : 선언 시 virtual 키워드 사용 (필수), 재정의 시 override 키워드 사용 (선택) 함수 숨기기 : 일반 함수를 자식 클래스에서 재정의하여, 포인터..

공부/c++ 2025.09.30

09.17 Final Project: GAS를 이용한 저격총 무기 구현

기획 및 구조 설계 기획 : GAS를 활용한 전투를 설계하도록 변경 : 저격 총에서는 항상 붉은 레이저가 나와 래이캐스트 대상 지점을 확인할 수 있다. : 플레이어가 공격 버튼을 누르는 즉시 대상이 피격당한다. 구조 : 기존 UObject를 상속 받는 무기에서 AActor를 상속 받도록 변경 >> GAS Ability를 이용한 공격 메커니즘 구현을 위함 : 플레이어 Weapon 소켓에 메쉬만 부착하는 방식에서 액터 컴포넌트로 무기를 부착하도록 변경 >> Tick() 메소드와 GAS에 따른 액터 자체의 기능을 이용하기 위함. : 플레이어와 무기 액터의 책임 분리 >> 플레이어는 AttrivuteSet 관리 및 피격 대상, 실제 스킬을 구현한 Abiltiy는 무기..

09.15 Final Project : 댕글링 포인터 오류

기존 방식 - ToolManager에서 인스턴스 객체를 만들어 포인터로 DropWeapon에 전달void UToolManager::SpawnPointSpawn(){ UE_LOG(SacGame, Display, TEXT("UToolManager::SpawnPointSpawn")); // DropWeapon 생성 -> 인스턴스만 넣어주기 for (int i = 0; i (EWeapon::End); i++) // 타입별 스폰 포인트 배열 순회 { // 대상 아이템 데이터 불러오기 FName type = mWeaponName[static_cast(i)]; const FWeapon* Data = mItemData->FindRow(type, TEXT("")); UE_LOG(Minsun, Log, TEXT(..

09.08 Final Project : 무기 생성 및 스폰

무기 생성 및 스폰 : ASpawnPoint를 월드에 배치한 하여 ToolManager에게 위치 정보를 제공한다. : 종류별 무기의 클래스와 메시, Enum 등의 정보를 담은 DataTable을 ToolManager에서 로드하여 데이터를 제공한다. : Player가 BaseWeapon을 멤버로 가지며, BaseWeapon의 상세 구현체를 통해 다양한 무기를 구현한다. : DropWeapon은 잔여 총알 같은 인스턴스 정보와 데이터 무기 종류의 값만 지닌다. Player가 이를 획득할 시 BaseWeapon의 구현체 인스턴스를 생성하여 넘겨준다. ToolManager UCLASS()class MUNCHKING_API UToolManager : public UTickableWorldSubsyst..

09.05 Final Project: 전투형 러너게임

팀빌딩 및 역할 분담 후 전투 시스템 관련 부분을 맡게 되었다. 가장 고민한 부분은 무기 액터와 플레이어, 스폰 포인트 사이의 구조였는데, 초안 - 전투 컴포넌트 활용, 무기는 struct로 구성되어 데이터 테이블에 안치. : 무기 스포너에서 액터를 스폰하면 액터는 데이터 테이블의 행 이름을 갖도록 하고, 이를 캐릭터가 pickup할 시 행 이름을 통해 데이터를 조회해서 무기 장착 관련 구현을 한다. : 이후 공격 시 전투 컴포넌트에 무기 Enum값을 인자로 넘겨주어 무기 종류에 맞는 공격 메소드를 수행한다. - 문제점 : 무기 확장 시 전투 컴포넌트 매번 수정 필요, Enum 값에도 추가해야 함. : 전투 컴포넌트가 너무 많은 조건문을 포함하게 됨. 변경안 ..

형변환 연산자

C++에서의 형변환 연산자 : 명시적 형변환을 지시하는 연산자 static_cast : 컴파일 타임에 T타입으로의 형변환을 수행 -> 내부적으로 치환된 값을 가진다. : 타입 검사를 거치지 않는다. for (int i = 0; i (EWeapon::End); i++) { ... } >> 위 for문을 수행할 경우 첫 수행 시 상수로 값을 변환하여 가지고 있기 때문에 조건문 검사마다 오버헤드가 발생하지는 않는다. dynamic_cast : 런타임에 T타입으로의 형변환을 수행 -> 타입 검증으로 인한 오버헤드가 있다. : 가상 함수 테이블에 저장된 타입 정보를 확인하여 검사를 수행한다. (안전) const_cast : const 속성 변수를 일반 변수로 변환한다. 즉, const 속성을 ..

공부/c++ 2025.09.03

C#과 C++

라이브러리 참조 및 컴파일 방식 C++ : include를 통해 구현된 코드를 통째로 복붙해온다. 모두 디버그 한 뒤 링크 단계에서 사용되지 않는 부분은 제거된다. : using을 통해 namespace를 이용한다. C# : IL(중간 언어)로 컴파일하여 CLR(Common Language Runtime)에서 실행 중 필요한 DLL만 로드해온다. 이후 실제 호출된 메소드만 JIT(Just In Time Compilation)방식으로 기계어 변환한다. : CLR은 CLI 기반 설계 / 네이티브 연결 지원(DLL과의 표준 통신 메커니즘) 같은 특성을 지녀 여러 언어에 대응하기 위해 만들어졌다. 따라서 C++과의 통합, 연결이 쉽다. ++이러한 특성 덕분에 Unity엔진에서는 C++로 성능에 핵심..

공부/c++ 2025.08.22

언리얼: 게임 일시정지

APlayerController::SetPause bool APlayerController::SetPause( bool bPause, FCanUnpause CanUnpauseDelegate){ bool bResult = false; if (GetNetMode() != NM_Client) // 클라이언트가 아닌 경우: 서버 모드의 플레이어 컨트롤러만 수행 { AGameModeBase* const GameMode = GetWorld()->GetAuthGameMode(); if (GameMode != nullptr) // 게임 모드가 있을 경우에만 수행 : 예외 처리 { bool bCurrentPauseState = IsPaused(); if (bPause && !bCurrentPauseState..

07.27 도감 컴포넌트

관련 클래스 : 도감 기능을 CreatureBook으로 명명했기에, 클래스 이름 모두 이름 참고하여 지음. Class 목록 Creature Widget : TileView를 통해 도감 목록 구성 : 4가지 카테고리 버튼 -> 클릭 시 해당하는 아이템 배열로 TileView 재구성. : Creature 컴포넌트를 멤버로 가지고 일방향으로 참조한다. Creature Slot : Creature Widget의 TileView를 구성하는 엔트리 위젯. : void NativeOnListItemObjectSet(UObject* Data) override : void SetSlot(UObject* Data) Creature Slot Data : TileView에서 엔트리 생성 시 전달하는 정보 ..