묻고 답해요
160만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해
콤보 어택
수업시간에 배운걸 토대로 콤보 어택마다 데미지를 다르게 구현하고 싶어서 코드를 작성하고 있습니다.float AOLCharacterBase::TakeDamage(float DamageAmount, struct FDamageEvent const& DamageEvent, AController* EventInstigator, AActor* DamageCauser) { if (CurrentComboAttack == 1) { Hp = FMath::Clamp(Hp - DamageAmount, 0.0f, MaxHp); // 체력 업데이트 UE_LOG(LogTemp, Warning, TEXT("Damage1 = %f"), DamageAmount); } else if (CurrentComboAttack == 2) { Hp = FMath::Clamp(Hp - DamageAmount*2, 0.0f, MaxHp); // 체력 업데이트 UE_LOG(LogTemp, Warning, TEXT("Damage2 = %f"), DamageAmount*2); } else if (CurrentComboAttack == 3) { Hp = FMath::Clamp(Hp - DamageAmount * 3, 0.0f, MaxHp); // 체력 업데이트 UE_LOG(LogTemp, Warning, TEXT("Damage3 = %f"), DamageAmount * 3); } UE_LOG(LogTemp, Warning, TEXT("Hp = %f"), Hp); // 체력이 0 이하인 경우 if (Hp <= 0.0f) { Dead(); // 죽었으니 함수 호출 UE_LOG(LogTemp, Error, TEXT("Dead!")); } return DamageAmount; }TakeDamage에서 CurrentComboAttack 값에 따라 데미지를 다르게 하려고 위 코드와 같이 작성을 했는데 로그도 전혀 나오지 않습니다. 콤보 어택 데이터에 데미지 값을 추가하여 값을 가져오면 콤보마다 데미지가 다른게 잘 되는데, 위 코드와 같이 작성하면 왜 안되는지 궁금합니다.. CurrentComboAttack은 전역변수로 선언되어있습니다.
-
미해결[입문자를 위한 UE5] Part4. 언리얼 엔진 C++
언리얼 시스템의 에러? 에 대해서 질문 드립니다.
#include "UObject/UObjectGlobals.h"위의 include 문을 R1PlayerController.h 에 입력하고 나니 문제가 모두 해결되었고, 이후로는 이 include문 없이도 오류가 발생하지 않습니다. 다시 확인해보니 아래의 문제들은UnrealHeaderTool command completed.가 되기 전에 발생하던 문제였습니다. 컴파일러 설정은Development EditorWin64시작 프로젝트 -> R1 프로젝트 입니다. 환경은언리얼 엔진은 5.5.1vs는 17.13.1윈도우 11 입니다. R1.Build.cs 파일에 { "Core", "CoreUObject", "Engine", "InputCore", "EnhancedInput" } 모듈들을 의존하도록 설정했습니다. APlayerController를 상속받은 AR1PlayerController를 작성할 때 문제가 발생했었습니다.우선 헤더에선 GENERATED_BODY() 가 작성된 줄에서 오류가 발생했었습니다.(E0077 : 이 선언은 스토리지 클래스나 타입 지정자가 없습니다.) 그리고 cpp 파일에서 여러 오류가 존재했었습니다.AR1PlayerController의 생성자를 작성할 때생성자 초기자 에서 자신의 자신의 부모 클래스의 생성자를 호출하는 부분에서 오류가 발생했었습니다.: Super(ObjectInitializer)(E0293 : 직접적이지 않은 논버추얼 클래스는 허용되지 않습니다.) AR1PlayerController::SetupInputComponent()함수의 구현부에서Super::SetupInputComponent() 에서 오류가 발생했었습니다.(오류의 내용은 Super에 SetupInputComponent()라는 멤버가 존재하지 않는다는 오류였습니다.)그리고EnhancedInputComponent->BindAction()를 호출할 때&ThisClass::(연동할 함수 이름) 에서 오류가 발생했었습니다.(오류의 내용은 ThisClass에 (연동할 함수 이름)가 존재하지 않다는 내용이었습니다.) 코드를 한 줄씩 시험해보니 FObjectInitializer를 매개변수로 받는 R1PlayerController의 생성자가 있으니 오류가 발생한다는 것을 알았고, 생성자를 지우니 정상적으로 빌드가 되었습니다.이어서 매개변수를 받지 않는 생성자만 작성한 경우에도 오류가 발생하지 않았습니다.FObjectInitializer 가 존재하는 헤더 파일인 "UObject/UObjectGlobals.h"를 include 하니FObjectInitializer를 매개변수로 받는 생성자를 작성해도 빌드가 통과되었고이후론 해당 include문을 지워도 빌드가 통과됩니다. .vs, Binaries, DerivedDataCache, Intermediate, Saved폴더들을 삭제하고.uproject 의 Generate~를 실행한 뒤 빌드 해도 문제가 발생하지 않았습니다. 제가 느끼기에는 뭔가 컴퓨터한테 "UObject/UObjectGlobals.h" 도 있으니 이것도 사용해보라고 알려주니 컴퓨터도 다음부턴 알아서 잘 이용한다는 느낌이 듭니다.
-
해결됨이득우의 언리얼 프로그래밍 Part4 - 게임플레이 어빌리티 시스템
SetWaitingOnAvatar함수의 호출 위치에 따라 영향을 주는지 궁금합니다.
50:24쯤에 Ability Task의 Activate 함수 작성 구간에서void UABAT_Trace::Activate() { Super::Activate(); SpawnAndInitializeTargetActor(); FinalizeTargetActor(); SetWaitingOnAvatar(); }로 하셨는데void UABAT_Trace::Activate() { Super::Activate(); SetWaitingOnAvatar(); SpawnAndInitializeTargetActor(); FinalizeTargetActor(); }이렇게 SetWaitingOnAvatar함수를 먼저 Task수행전에 호출해도 괜찮은지 궁금합니다.SetWaitingOnAvatar 함수를 호출이유가 해당 작업이 아직 안끝났다는걸 ASC에게 알려주기 위해 Waiting상태로 만든다고 들어서 이게 가능하다 생각되고 실제로도 돌려보니 별 다른점이 없어서 물어봅니다.
-
해결됨이득우의 언리얼 프로그래밍 Part3 - 네트웍 멀티플레이 프레임웍의 이해
OnRep_PlayerState 함수 질문입니다.
현재 15강 까지의 로직에서 볼 때, 게임 시작 후 캐릭터가 생성되거나 죽어서 다시 새로 생성될 때,OnRep_PlayerState 함수가 호출되는데요. 그 이유가 PlayerState의 내부 값인 PlayerID가 초기화 되기 때문인 걸까요?
-
해결됨이득우의 언리얼 프로그래밍 Part4 - 게임플레이 어빌리티 시스템
2강 보고 요약 정리해봤는데 검토 부탁드립니다.
ASC_Actor : ASC 부착된 액터.GA : ASC_Actor 가 아닌 이곳에서 기능을 구현. Tag : ASC_Actor 와 GA의 연결다리 (의존성 약화) [ Tag 사용법 ]<1> 공용 Tag 헤더파일 선언. (ASC_Actor , GA 모두 보유) ㄴ 두 태그를 정의함 ( 1.기본태그 2.활성화 유무확인 태그)<2> " FGameplayTagContainer 생성자(기본태그) " 로 태그객체를 만듬.<3> TryActivateAbilitiyByTag(태그객체) 다음과 같이 호출해 2번 태그가 부착되는 동시에 기능이 돌아감.
-
해결됨2025 언리얼 공인강사 – UE5 스파르타 클래스: 심화편
본 별로 레이어로 블렌딩할 때
본 별로 레이어로 블렌딩 합니다 노드에Base Pose에는 Main States 포즈를 넣어주는 것을 알겠는데Default Slot 슬롯에는 왜 소스 포즈로 Main States가 연결되어야 하나요?
-
미해결이득우의 언리얼 프로그래밍 Part3 - 네트웍 멀티플레이 프레임웍의 이해
21분 30초쯤에 SetIsReplicated(true);를 생성자에서 InitializeComponent함수로 옮긴 이유를 잘 모르겠습니다
단순히 생성자에 선언하면 언리얼 엔진이 빼먹을 가능성이 있어서 그런건가요?
-
미해결이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해
지역변수와 관련해서 궁금한점이 있습니다
// 예시 1 : 지역변수를 함수 내에서 선언하고 사용 void ASample::Tick(float DeltaTime) { Super::Tick(DeltaTime); FVector Direction = GetActorLocation(); } ------------------------------------- // 예시 2 : 헤더파일에서 FVector Direction 선언 void ASample::Tick(float DeltaTime) { Direction = GetActorLocation(); } ```프로그래밍에 익숙하지 않아 궁금한 내용을 질문드립니다.반복해서 호출되는 경우, 이렇게 지역변수 안에 선언하는 것과, 헤더파일에서 선언하고 함수 내에서는 값만 대입하는것. 두 방법간에 비용(성능) 차이가 나나요? 두 방식이 섞여서 사용되는것 같아서 질문드립니다 (해당 변수의 사용은 지역변수 안에서만 사용한다고 가정)
-
미해결[입문자를 위한 UE5] Part3. 언리얼 엔진 3D 게임 개발 입문
Root 컴포넌트와 기즈모
안녕하세요2-3강 '게임플레이 프레임워크' 에 7분15초 부분에서 Body를 DefaultSceneRoot 로 끌어다 놓는 부분이 있는데요, 이렇게 해보니 Body에서 보이던 기즈모가 안보이게 되고 우측 상단에서 마우스로 직접 기즈모를 클릭해도 적용이 안되더라구요.혹시 이유가 무엇인지 알 수 있을까요? 메쉬 그 자체는 Root컴포넌트가 되면 기즈모로 조절이 불가능해지니 앞으로는 피해야 하나요? * 강의 후반부에 다시 DefaultSceneRoot 생성하는거 뒤늦게 확인했습니다!
-
미해결이득우의 언리얼 프로그래밍 Part4 - 게임플레이 어빌리티 시스템
Gameplayability vs Gameplaycue
여러 계산식(방향 , 상태 체크 )이 들어간 hitreaction을 구현하려고 합니다. Gameplayability 과 Gameplaycue 중 어느 구현방식이 최적화와 서버 비용 절감에 도움이 될까요? GameplayAbility로 계산식을 구현하고 ability안에서 cue를 사용해 애니메이션을 실행시키는게 좋을까요? 궁금합니다.
-
미해결이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해
27분에서 헤더 파일에서 #include 이유
헤더에서 상호 참조 또는 컴파일이 오래걸리는 것을 방지하려고 class로 전방선언하여 작업하는 것으로 이해하고 따라하고있는데, 여기서는 헤더에서 클래스를 include하여 작업하는 이유는 무엇일까요?
-
미해결이득우의 언리얼 프로그래밍 Part1 - 언리얼 C++의 이해
생성자에서 로딩과, Init함수에서 로딩의 차이점이 궁금합니다.
안녕하세요.애셋을 로딩할 때 생성자와 Init함수의 차이 때문에 사용 API가 달라져야하는 이유가 궁금합니다. 생성자 단계에서 단순히 LoadObject<UStudent>(nullptr, *TopSoftObjectPath); 를 통해 로딩할 순 없는 정확한 이유를 모르곘습니다...! 또한 Init()의 LoadStudentObject()에서 LoadObject<>()로 TopStudent를 리턴 받은 후에, 포인터에 대한 nullptr 체크를 따로 하지 않는 이유는 LoadObject또한 해당 애셋이 무조건 있어야 올바르게 동작하기 때문인가요?
-
미해결이득우의 언리얼 프로그래밍 Part1 - 언리얼 C++의 이해
FArchive 포인터의 해제 질문, 직렬화 BufferArray 질문
안녕하세요.파일을 읽고 쓸 때 FArchive* 객체를 CreateFileWriter나 Reader함수를 통해 생성한 후, 해제를 꼭 해주시는데요.저 Create함수 내부적으로 동적 할당을 진행하는 것이기 때문인가요?또한, UObject클래스의 객체 정보를 직렬화 할 때 Buffer가 따로 필요한 이유가 궁금합니다.마지막으로, 직렬화 된 UObject 객체를 Read할 때만 FMemoryReader가 필요한지 궁금합니다.
-
미해결이득우의 언리얼 프로그래밍 Part3 - 네트웍 멀티플레이 프레임웍의 이해
ServerRPCAttack_Implementation함수가 이해가 안갑니다.
제가 이해한 되로 정리해봤습니다. 다음 사진처럼서버 상에서 모든 캐릭터는 Authority / Autonomous 역할을 갖는다고 이해했는데요. 하지만 코드를 보면 for (APlayerController* PlayerController : TActorRange<APlayerController>(GetWorld())) { if (PlayerController && GetController() != PlayerController) //공격 명령을 내린 클라이언트와 대응되는 서버상의 액터를 제외시킴. { if (!PlayerController->IsLocalController()) { AABCharacterPlayer* OtherPlayer = Cast<AABCharacterPlayer>(PlayerController->GetPawn()); if (OtherPlayer) { OtherPlayer->ClientRPCPlayAnimation(this); } } } } 2번째 if문에서 Simulated Proxy 역할을 서버상에서 찾아서 ClientRPCPlayAnimation를 호출시킨다는게 이해가 안 갑니다. 서버에 Simulated Proxy가 없지 않나요?
-
미해결이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해
캐릭터가 갑자기 안 움직입니다ㅜ
#include "InputMappingContext.h" #include "EnhancedInputComponent.h" #include "EnhancedInputSubsystems.h" void ACharacterPlayer::BeginPlay() { Super::BeginPlay(); APlayerController* PlayerController = CastChecked<APlayerController>(GetController()); if (PlayerController) { if (UEnhancedInputLocalPlayerSubsystem* Subsystem = ULocalPlayer::GetSubsystem<UEnhancedInputLocalPlayerSubsystem>(PlayerController->GetLocalPlayer())) { Subsystem->AddMappingContext(DefaultMappingContext, 0); } } } // Called to bind functionality to input void ACharacterPlayer::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent) { Super::SetupPlayerInputComponent(PlayerInputComponent); UEnhancedInputComponent* EnhancedInputComponent = CastChecked<UEnhancedInputComponent>(PlayerInputComponent); EnhancedInputComponent->BindAction(JumpAction, ETriggerEvent::Triggered, this, &ACharacter::Jump); EnhancedInputComponent->BindAction(JumpAction, ETriggerEvent::Completed, this, &ACharacter::StopJumping); EnhancedInputComponent->BindAction(MoveAction, ETriggerEvent::Triggered, this, &ALCharacterPlayer::Move); EnhancedInputComponent->BindAction(LookAction, ETriggerEvent::Triggered, this, &ACharacterPlayer::Look); EnhancedInputComponent->BindAction(AttackAction, ETriggerEvent::Triggered, this, &ACharacterPlayer::Attack); } void ACharacterPlayer::Move(const FInputActionValue& Value) { FVector2D MovementVector = Value.Get<FVector2D>(); const FRotator Rotation = Controller->GetControlRotation(); const FRotator YawRotation(0, Rotation.Yaw, 0); const FVector ForwardDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::X); const FVector RightDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::Y); AddMovementInput(ForwardDirection, MovementVector.X); AddMovementInput(RightDirection, MovementVector.Y); } void ACharacterPlayer::Look(const FInputActionValue& Value) { FVector2D LookVector = Value.Get<FVector2D>(); AddControllerYawInput(LookVector.X); AddControllerPitchInput(LookVector.Y); }코드는 위와 같이 작성을 했습니다. 화요일까지 움직였는데 갑자기 안 움직입니다. 플러그인도 있고, IMC에도 다 설정을 했는데 갑자기 안 움직입니다... 구글에서 찾아봐도 해결이 안됩니다ㅜㅜ...ThirdPersonCharacter 를 추가해서 이 캐릭터를 사용하니 움직입니다. 그래서 ThirdPersonCharacter 의 부모 클래스를 제가 만든 클래스로 설정을 하니 다시 안 움직입니다. 코드 문제인 거 같은데 뭐가 문제인걸까요..
-
해결됨[언리얼 공인 강사 직강] 하루만에 언리얼 엔진5 입문하기
게임 승리해도 시간 지나면 패배하는 문구가 떠요
게임에 승리해도 대기 해서 시간이 지나면 패배했다는 문구가 프린트 되더라고요. 그래서 시간이 끝나면 cast to BP_캐릭터 이거 써서 Is There A coin을 불러 오고 Branch를 통해 false일 경우에 실행시킬려고 해보고 컴파일 해 봤지만 Objet가 지정되어 있지 않다고 에러가 나더라고요.오브젝트를 지정해서 연결할수 있는 노드가 있을까요?
-
미해결이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해
패키징에 관한 질문입니다
UATHelper: Packaging (Windows): Running AutomationTool...UATHelper: Packaging (Windows): Using bundled DotNet SDK version: 6.0.302UATHelper: Packaging (Windows): Starting AutomationTool...UATHelper: Packaging (Windows): Parsing command line: -ScriptsForProject=D:/UnrealGame/Test/Test.uproject Turnkey -command=VerifySdk -platform=Win64 -UpdateIfNeeded -EditorIO -EditorIOPort=64148 -project=D:/UnrealGame/Test/Test.uproject BuildCookRun -nop4 -utf8output -nocompileeditor -skipbuildeditor -cook -project=D:/UnrealGame/Test/Test.uproject -target=Test -unrealexe="C:\Program Files\Epic Games\UE_5.4\Engine\Binaries\Win64\UnrealEditor-Cmd.exe" -platform=Win64 -installed -stage -archive -package -build -clean -pak -iostore -compressed -prereqs -archivedirectory=D:/UnrealGame/Test/package -clientconfig=Shipping -nodebuginfo -nocompile -nocompileuatUATHelper: Packaging (Windows): Initializing script modules...UATHelper: Packaging (Windows): Total script module initialization time: 0.30 s.UATHelper: Packaging (Windows): Using C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Current\Bin\MSBuild.exeUATHelper: Packaging (Windows): Executing commands...UATHelper: Packaging (Windows): Installed Sdk validity:UATHelper: Packaging (Windows): Win64: (Status=Valid, MinAllowed_Sdk=10.0.18362.0, MaxAllowed_Sdk=10.9.99999.0, Current_Sdk=10.0.22621.0, Allowed_AutoSdk=10.0.19041.0, Current_AutoSdk=, Flags="InstalledSdk_ValidVersionExists")UATHelper: Packaging (Windows): Scanning for envvar changes...UATHelper: Packaging (Windows): ... done! UATHelper: Packaging (Windows): Cleaning Temp Paths...UATHelper: Packaging (Windows): BUILD SUCCESSFULUATHelper: Packaging (Windows): Setting up ProjectParams for D:\UnrealGame\Test\Test.uprojectUATHelper: Packaging (Windows): ********** BUILD COMMAND STARTED **********UATHelper: Packaging (Windows): Running: C:\Program Files\Epic Games\UE_5.4\Engine\Binaries\ThirdParty\DotNet\6.0.302\windows\dotnet.exe "C:\Program Files\Epic Games\UE_5.4\Engine\Binaries\DotNET\UnrealBuildTool\UnrealBuildTool.dll" Test Win64 Shipping -Project="D:\UnrealGame\Test\Test.uproject" -Clean -NoHotReload "D:\UnrealGame\Test\Test.uproject" -NoUBTMakefiles -remoteini="D:\UnrealGame\Test" -skipdeploy -log="C:\Users\user\AppData\Roaming\Unreal Engine\AutomationTool\Logs\C+Program+Files+Epic+Games+UE_5.4\UBA-Test-Win64-Shipping.txt"UATHelper: Packaging (Windows): Log file: C:\Users\user\AppData\Roaming\Unreal Engine\AutomationTool\Logs\C+Program+Files+Epic+Games+UE_5.4\UBA-Test-Win64-Shipping.txtUATHelper: Packaging (Windows): No target name was specified on the command-line.UATHelper: Packaging (Windows): Took 0.30s to run dotnet.exe, ExitCode=6UATHelper: Packaging (Windows): UnrealBuildTool failed. See log for more details. (C:\Users\user\AppData\Roaming\Unreal Engine\AutomationTool\Logs\C+Program+Files+Epic+Games+UE_5.4\UBA-Test-Win64-Shipping.txt)UATHelper: Packaging (Windows): AutomationTool executed for 0h 0m 2sUATHelper: Packaging (Windows): AutomationTool exiting with ExitCode=6 (6)UATHelper: Packaging (Windows): BUILD FAILEDPackagingResults: Error: Unknown Error 패키징이 안되는데 무슨 문제일까요???
-
미해결이득우의 언리얼 프로그래밍 Part4 - 게임플레이 어빌리티 시스템
콤보 애니메이션 몽타주의 MontageJumpToSection에 대하여
안녕하세요. 하나의 콤보 애니메이션 몽타주에서 섹션으로 점프하는 방식으로 강의 내용이 진행되고 있는데요. 강의 프로젝트 재확인하는 느낌으로 개인 프로젝트를 조금씩 진행하고 있는 중 콤보 공격을 넣기 위해 강의 내용따라 애니메이션 몽타주를 만들었습니다. JumpToSection 을 사용하게 되면 애님 몽타주 내부에서 해당 지점으로 바로 점프해버리다보니 점프 직전 프레임과 이후 프레임간의 모션 차이가 클 경우 상당히 눈에 띄더라구요. 그래서 각 콤보 공격의 단계를 개별 애니메이션 몽타주로 제작하고 다음 콤보 입력시 개별 애니메이션 몽타주 재생을 해봤는데 이 경우는 애니메이션 블렌딩이 되어 자연스럽게 이어지는것 처럼 보였습니다. 여기서 질문인데, JumpToSection 이 직전/직후 프레임간의 애니메이션 블렌딩이 불가능하다면 실제 프로젝트에서는 어떤 상황에서 사용하게 되는지 궁금합니다. 감사합니다.
-
미해결이득우의 언리얼 프로그래밍 Part4 - 게임플레이 어빌리티 시스템
PossessedBy() 함수는 싱글플레이에서는 호출되지 않나요?
PossessedBy 함수가 서버에서만 호출된다면, 싱글플레이용 게임에서는 어느 위치에서 Character 의 ASC 에 PlayerState 의 ASC 를 대입하는게 적절할지 궁금합니다.
-
미해결이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해
SetTimer
안녕하세요. 혼자 게임을 만들어보다가 타이머 함수에 대해 궁금한게 생겨 질문을 드립니다.SetTimer(FTimerHandle& InOutHandle, UserClass* InObj, typename FTimerDelegate::TMethodPtr< UserClass > InTimerMethod, float InRate, bool InbLoop = false, float InFirstDelay = -1.f)SetTimer 함수의 인자를 살펴보면 InFirstDelay라고 있는데 이건 무슨 변수인가요?구글에서 찾아보니 최초 실행 시 대기 시간이라고 하던데 만약 2로 설정되어 있다면 2초 뒤에 타이머가 실행이 된다는 소리인가요?