게임 개발 공부/Unreal Engine 28

AI - Navigation Invoker 와 RVO

✅ Navigation Invoker (내비게이션 인보커)Project Settings - Engine - Generate Navigation Only Around Navigation Invokers ✅ 목적:동적으로 내비게이션 메쉬(NavMesh)를 생성하기 위한 시스템입니다. 기본 배경:언리얼 엔진에서 AI가 이동하려면 NavMesh가 필요합니다. 하지만 월드 전체에 NavMesh를 미리 생성해 놓으면 퍼포먼스에 큰 영향을 미치고, 메모리도 많이 사용됩니다. 이를 해결하기 위해 필요한 위치에서만 NavMesh를 실시간으로 생성해주는 게 Navigation Invoker입니다. 작동 방식:Actor에 Navigation Invoker 컴포넌트를 추가하면, 해당 Actor 주변의 일정 범위 내에서만 Na..

UObject 클래스

언리얼 엔진에서 UObject 클래스는 엔진의 모든 객체 시스템의 기반이 되는 최상위 클래스입니다.✅ UObject 클래스의 역할언리얼의 모든 클래스의 기반: AActor, UActorComponent, UUserWidget 등 다양한 클래스가 UObject에서 파생됩니다.가비지 컬렉션(GC) 지원: UObject를 상속하면 자동으로 가비지 컬렉션 대상이 되어 메모리 관리가 쉬워집니다.리플렉션(Reflection) 지원: UCLASS() 매크로를 사용하면 언리얼의 리플렉션 시스템을 통해 에디터, 블루프린트, 네트워크 복제 등에 활용할 수 있습니다.✅ UObject vs. AActor구분UObjectAActor 구분UObjectAAActor상속최상위 클래스UObject를 상속월드에 배치 가능 여부❌ 불가능..

Blueprint Function Library

Blueprint Function Library를 사용하는 경우는 언제인가?일반 C++ 클래스에서도 UPROPERTY와 UFUNCTION을 사용하면 블루프린트에서 변수와 함수를 호출할 수 있습니다. 하지만 Blueprint Function Library(UBlueprintFunctionLibrary)를 사용해야 하는 경우는 다음과 같습니다.📌 일반 C++ 클래스(UObject, AActor) vs Blueprint Function Library(UBlueprintFunctionLibrary) 비교 기준일반 C++ 클래스 (UObject, AActor 등)Blueprint Function Library (UBlueprintFunctionLibrary)객체 생성 여부인스턴스가 필요함 (NewObject, ..

AI Perception 사용 시 같은 AI 공격 문제 해결 확실한 방법

이전 글에서 AI Perception 사용 시 같은 AI를 공격하는 문제를 해결하기 위해플레이어에게 tag를 달아주고 센서가 감지에 성공하면 그 감지한 대상이 tag가 있는 Pawn인지 확인했습니다. https://vetenir.tistory.com/47 AI Perception 사용 시 같은 AI 공격 문제 해결 방법AI가 플레이어를 감지하기 위해 AI Perception의 AISense_Sight을 사용하다가같은 AI끼리 만나도 서로 공격을 하는 문제가 있어 해결 방법을 작성하려고 합니다. 해결 방법우선 AI Controller에서 Detection byvetenir.tistory.com 하지만 해당 해결 방법에는 문제가 있었는데적 AI의 시야에 플레이어와와 적이 동시에 감지되면플레이어를 감지하지 않..

GameInstance

GameInstance는 게임의 전체 생명주기 동안 유지되는 데이터와 로직을 관리하는 클래스입니다.아래에서 GameInstance의 역할, 특징, 그리고 사용 사례를 자세히 설명드리겠습니다.1. GameInstance의 역할게임 전반의 데이터 관리:게임이 시작되고 종료될 때까지 유지되는 데이터를 저장합니다.예: 플레이어의 계정 정보, 설정, 진행 상태, 세션 데이터 등.레벨 전환 시 데이터 유지:레벨이 변경되더라도 데이터가 유지됩니다. 따라서 레벨 간에 공유해야 하는 정보를 저장하는 데 적합합니다.글로벌 로직 관리:게임 전체에 걸쳐 적용되는 로직을 처리합니다.예: 네트워크 연결 관리, 게임 설정 적용, 세션 관리 등.2. GameInstance의 특징싱글톤(Singleton) 구조:게임이 실행되는 동안 ..

메타사운드

언리얼 엔진 5에서 도입된 메타사운드(MetaSounds) 는 오디오 디자이너가 사운드 소스를 생성하기 위한 디지털 신호 처리(DSP) 그래프를 완벽하게 제어할 수 있는 하이 퍼포먼스 오디오 시스템입니다.  쉽게말해서 외부에서 가져온 사운드를 언리얼에서 조정할 수 있는 사운드로 만들 수 있습니다.  메타사운드를 이용해서 랜덤 피치 사운드 만들기메타사운드를 이용해서 재생할 때마다 소리의 높낮이를 랜덤으로 변경해서 재생하는 사운드를 만들어보겠습니다.  미리 사운드 에셋을 가져와줍니다.콘텐츠 브라우저에서 우클릭 Audio -> MetaSound Source를 클릭. 만들어진 메타사운드에 들어가서 우클릭 -> Wave Player (1.0, Mono), Random (Float)를 생성하고 아래와 같이 연결해줍..

블루프린트에서 Damage 처리

Unreal Engine에서 코드로 Damage처리를 하고 싶다면Apply Damage를 사용하여 Damage를 주는 처리를 하고Damage를 받는 대상은 TakeDamage 함수로 받아줄 수 있습니다. 해당 글에서는 블루프린트에서 Damage 처리를 하는 방법을 정리하겠습니다.  Apply Damage는 무기에서 구현을 하고 캐릭터에서는 TakeDamage 대신 AnyDamage로 로직을 구현해주면 됩니다. 만약 작성해놓은 캐릭터의 코드를 베이스로 블루프린트를 생성한다면AnyDamage노드를 생성만 해놓아도 TakeDamage처리가 됩니다.   감사합니다.

AI Perception 사용 시 같은 AI 공격 문제 해결 방법

AI가 플레이어를 감지하기 위해 AI Perception의 AISense_Sight을 사용하다가같은 AI끼리 만나도 서로 공격을 하는 문제가 있어 해결 방법을 작성하려고 합니다. 해결 방법우선 AI Controller에서 Detection by Affiliation을 모두 켜줘야 시야 범위의 플레이어를 인식합니다.하지만 같은 AI도 인식하는 문제가 있습니다.이를 해결하려면 Tag로 플레이어를 구분해야합니다.우선 플레이어 캐릭터의 디테일 창에서 tag를 검색.Tags에서 +를 눌러 플레이어의 태그를 만들어줍니다. 그리고 AIController로 가서 센서의 결과를 처리하는 곳에서 만들어준 플레이어 태그를 사용해서 플레이어만을 감지할 수 있게 해주면 됩니다.   감사합니다.

플레이어를 추적하고 공격하는 AI 적

이번에 구현할 것은 적이 플레이어를 쫒아오고플레이어에게 접근하면 공격하는 모션을 취하는 적을 만드는 것이 목표입니다. BluePrintBP_EnemyBase공격 애니메이션으로 몽타주를 생성해서 공격하면 재생할 수 있게 해줍니다.Spawn Actor from class 로 가져올 무기를 선택하고 소켓에 붙여줍니다. BP_EnemyAIConrollerAIConroller가 Behavior Tree를 사용할 수 있게 On Possess를 해줍니다. AssetsAnimationABP, AM은 직접 생성해줍니다.Mesh  Behavior TreeTask로 각 행동을 블루프린트로 제작하여 원하는 위치에 배치. 참고 Selector vs Sequence 비교  SelectorSequence실행 방식실패하면 다음 노드..

Cast<T>와 GetWorldTimerManager().SetTimer

언리얼에서 형변환을 위해 자주 사용하는 Cast와 GetWorldTimerManager().SetTimer를 찾아봤습니다. CastCast는 언리얼 엔진에서 객체를 특정 클래스 타입으로 변환하는 함수입니다.T는 변환하려는 클래스의 타입입니다.Cast는 안전한 다운캐스팅을 수행합니다.변환이 실패하면 nullptr을 반환합니다. if (UGameInstance* GameInstance = GetGameInstance()) { UCppGameInstance* CppGameInstance = Cast(GameInstance); if (CppGameInstance) { CurrentLevelIndex = CppGameInstance->CurrentLevelIndex; } }해당 코드를 예로 들면 UGa..