안녕하십니까. 질문 남기기 앞서 강의 정말 잘 보고 있다고 말씀 드리고 싶습니다. 제가 궁금한 부분은 10번 강의에서 공격에 맞았을 때 검증(Validation) 하는 부분입니다. bool AABCharacterPlayer::ServerRPCNotifyHit_Validate(const FHitResult& HitResult, float HitCheckTime) { return (HitCheckTime - LastAttackStartTime) > AcceptMinCheckTime; } 공격 시작 타이밍과 몽타주에 배치한 트리거 함수 간의 간격을 검증하기 위한 것으로 이해했습니다. 검증 코드에서 LastAttackStartTime이란 변수가 쓰였고, LastAttackStartTime이란 변수가 아래 코드의 ServerRPCAttack에서 인자로 받은 AttackStartTime 변수로 세팅되는 것을 확인했습니다. void AABCharacterPlayer::ServerRPCAttack_Implementation(float AttackStartTime) { AB_LOG(LogABNetwork, Log, TEXT("%s"), TEXT("Begin")); bCanAttack = false; OnRep_CanAttack(); AttackTimeDifference = GetWorld()->GetTimeSeconds() - AttackStartTime; AB_LOG(LogABNetwork, Log, TEXT("LagTime : %f"), AttackTimeDifference); AttackTimeDifference = FMath::Clamp(AttackTimeDifference, 0.0f, AttackTime - 0.01f); FTimerHandle Handle; GetWorld()->GetTimerManager().SetTimer(Handle, FTimerDelegate::CreateLambda([&] { bCanAttack = true; OnRep_CanAttack(); } ), AttackTime - AttackTimeDifference, false, -1.0f); LastAttackStartTime = AttackStartTime; PlayAttackAnimation(); //MulticastRPCAttack(); for (APlayerController* PlayerController : TActorRange<APlayerController>(GetWorld())) { if (PlayerController && GetController() != PlayerController) { if(!PlayerController->IsLocalController()) { AABCharacterPlayer* OtherPlayer = Cast<AABCharacterPlayer>(PlayerController->GetPawn()); if (OtherPlayer) { OtherPlayer->ClientRPCPlayAnimation(this); } } } } } LastAttackStartTime은 서버의 변수이고 그렇기 때문에 여러 클라이언트가 동시에 공격을 한다면 LastAttackStartTime이 덮어 씌워질 수 있다고 생각하는데 그렇게 되면 검증하는 부분에서 문제가 생길 수도 있다고 생각합니다. 질문 : 여러 클라이언트가 동시에 공격 시 LastAttackStartTime이 덮어 씌워지는 것이 맞는가?
[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part5: UE5 & IOCP 서버 연동
안녕하세요. 06.+마무리.zip을 다운받아 풀고 S1.sln 파일을 실행시키면 VS에서 프로젝트 내 파일들을 읽어오질 못합니다. 그래서 S1.uproject에서 Generate Cisual Studio Project File을 해주고 솔루션을 실행시키면 프로젝트 내 파일들이 잘 나옵니다. 근데 빌드를 하면 다음과 같은 에러가 납니다. 1>[18/23] Compile [x64] S1Player.cpp cancelled 1>[19/23] Compile [x64] S1GameInstance.gen.cpp cancelled 1>[20/23] Compile [x64] S1Player.gen.cpp cancelled 1>[21/23] Compile [x64] ClientPacketHandler.cpp cancelled 1>[22/23] Compile [x64] S1.init.gen.cpp cancelled 1>[23/23] Compile [x64] BufferReader.cpp cancelled 1>C:\Program Files\Microsoft Visual Studio\2022\Professional\MSBuild\Microsoft\VC\v170\Microsoft.MakeFile.Targets(44,5): error MSB3073: The command ""D:\Epic Games\UE_5.2\Engine\Build\BatchFiles\Build.bat" S1Editor Win64 Development -Project="C:\Users\yesun\Downloads\06.+마무리\MMO\S1\S1.uproject" -WaitMutex -FromMsBuild" exited with code 6. 1>Done building project "S1.vcxproj" -- FAILED. ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== ========== Build started at 5:33 PM and took 01.657 seconds ========== 마지막 5.3버전 예제도 마찬가지로 압축푼 프로젝트파일을 실행하면 VS 에서 파일이 제대로 안나옵니다. 하지만 06. +마무리.zi p 과는 다르게 S1.uproject에서 Generate Cisual Studio Project File을 해주고 다시 VS 오픈해서 빌드하면 에러없이 언리얼 에디터가 잘 실행됩니다. 제가 뭘 잘못 실행한건지 뭔가 세팅을 제대로 안한건지 왜 이런 현상이 일어나는지 알수 있을까요?
이 함수를 이용하려면 TargetDataHandle을 넣도록 되어 있는데요. 그래서 Trace 어빌리티 테스크를 통해 전달받은 데이터를 사용한 것 같습니다. 그런데 다른 방식으로 타겟을 정하거나 수동으로 ApplyGameplayEffectSpectToTarget()를 사용하려면 FGameplayAbilityTargetDataHandle을 억지로 만들어 채워야 하나요??
강의 따라가다가 제 화면에서는 플레이어에만 HpBar가 나오는데 강의에선 NPC에도 나와서 질문 드렸습니다. + npc에도 같은 위젯코드를 넣어봤더니 에디터를 처음 켤 때 로딩중에 위젯컴포넌트에서 InitWidget()이 실행되면서 위젯의 SetAbilitySystemComponent()를 호출하게 되는데요. 저는 SetAbilitySystemComponent()에 ensure을 놔뒀더니 이 타이밍이 빙의 전이라 어트리뷰트가 등록이 안되있는 상태라서 에러가 발생하는 것같습니다. 강의 처럼 if 로직으로 바꾸면 되긴하는데 로딩중에 위젯컴포넌트의 InitWidget()가 호출되는 이유가 무엇인가요? 월드에 npc가 배치되있긴하지만 BeginPlay()를 호출하지는 않는데 왜 InitWidget()이 호출되는지 잘 모르겠습니다. 제가 part2에서 들었던거는 액터의 BeginPlay() 이후에 호출된다고만 들었는데 다른 이유가 있나요?? 이것 때문인 것 같습니다.
trigger volume 박스를 4개 만들어서 영역에 가면 소리가 레이어 되는 것 까지 잘 공부하였습니다. 궁금한것은 On Actor End Overlap(TriggerVolume) 을 이용하여 영역 밖으로 나올때 음악을 정지 혹은 안 나오게 하고 싶은데 어찌해야 할까요? 답변 부탁드립니다 감사합니다.
언리얼에서 얼마나 정확히 이러한 문제에 대해서 네트워크동기화를 잘 해주는지 모르겠어서 여쭈어봅니다. 주황 녹색 모두 서버(제3의 호스트 또는 데디케이티드서버)에 접속한 클라이언트입니다. 서버로의 핑은 200ms라 모두 가정하고 주황캐릭터가 움직이는 녹색 캐릭터를 공격하는 경우 내 클라이언트에서는 내 주황이 잘 조준해서(Line trace나 Collision overlay) 녹색을 맞추었는데 서버에서는 녹색이 이미 주황이 조준한 위치를 벗어나 계속 움직이고 있는 상황이 생기지 않나요? 캐릭터가 사람처럼 100m를 20초에 움직이면 200ms 면 1미터의 오차가 생길수 있어서 충분히 클라이언트와 서버의 공격 오차가 발생할수 있다고 보는데요. 언리얼엔진이 이러한 핑에 따른 오차들을 보정하여 공격에 대한 충돌체크를 해주는 기능이 있나요? 없다면 어떻게 처리를 하는게 좋을지 팁을 알려주시면 감사하겠습니다.
여기저기 찾아봐도 해결방법을 찾지못해서 이렇게 올려봅니다 ㅠㅠ 현상은 버전상관없이 발생하는것같구요 단지 작업중 저장하고 언리얼프로젝트를 닫았다 다시 열게되면 한번씩 75%에서 무한로딩이 걸려 움직이질 않습니다.. CPU랑 프로세스 메모리도 변화가 없구요 파일로드중 혹은 초기화중 무한로딩 걸리는 시점도 제각각인데 진행도만 항상 75%에서 멈추네요.. 해결방법이나 최소한 원인을 찾을방법이 전혀 없을까요..? 그냥 처음부터 다시 프로젝트를 만들어야 할까요??
안녕하세요. 강의를 듣고 나서 멀티플레이 게임을 만들어보려고 하고 있는데, Replicate에 대해 궁금한게 있는데 구글링을 해보아도 알 수가 없어서 이렇게 질문 드립니다. SpawnActor<>() 함수 같은 경우 서버에서 호출하면 자동으로 클라이언트들에게 Replicate 되는 것으로 알고 있습니다. 이 함수 내부에서는 NewObject<>()를 호출하는 것을 확인하였는데요. 그렇다면, NewObject<>() 함수도 마찬가지로 서버에서 호출 하면 클라이언트들에게 Replicate 되어 클라이언트들도 해당 객체를 생성하게 되나요?
서버 전용 캐릭터든 클라이이언트 전용 캐릭터든 빙의 함수랑 SetupPlayerInputComponent()은 클라이언트에서는 아예 호출이 안되고 관련된 것들은 다 복제로 처리되고, 서버에서는 이 두 함수가 다 호출되면서 SetupGASInputComponent()가 중복 호출 되는 걸로 알고있는데 서버에서 중복 처리는 별로 상관 없는 건가요?