월 38,500원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결이득우의 언리얼 프로그래밍 Part3 - 네트웍 멀티플레이 프레임웍의 이해
UPROPERTY(Replicated)로 선언한 속성값의 변화는 어떻게 감지하게 되나요?
Replicated로 지정한 속성값이 변화하면 콜백함수를 호출시키는데요, 그렇다면 어떻게 속성이 변화하는걸 감지하는건가요? 언리얼내부에서 Replicated로 지정한 속성이 변화되는지 계속 감시하고 있다가 변화되면 콜백함수를 시켜주는걸까요?? 디버깅하면서 호출스택따라가봐도 뭐가 보이질 않네요...ㅜ.ㅜ
- 미해결이득우의 언리얼 프로그래밍 Part3 - 네트웍 멀티플레이 프레임웍의 이해
Authority 엑터 질문
게임에 있는 카드보드 캐릭터로 볼때 리슨서버로 동작하는 어플리케이션에서는 Authority를 가진 엑터이고 이 리슨서버에 접속된 클라의 입장에서 봤을때 이 엑터(햔재 리슨서버의 카드보드)는SimulatedProxy엑터가 되는게 맞을까요??그리고 클라의 카드보드 캐릭터는 Authority로 되던데이렇게 되면 자기 자신은 신뢰하게 되는건가요...?? 햇갈리네요 ㅜㅜ
- 미해결이득우의 언리얼 프로그래밍 Part3 - 네트웍 멀티플레이 프레임웍의 이해
Insight .bat파일 실행안되시는분들은 경로에 공백이나 한글 확인해보시면될거같습니다.
실행안되서 확인해보니 공백때문에 실행이안됬었네요
- 미해결이득우의 언리얼 프로그래밍 Part3 - 네트웍 멀티플레이 프레임웍의 이해
33:18 패밀리에 묶인다는게 어떤뜻일까요??
패밀리안에 묶인다는 표현이 자주등장하는데, 이말이 어떤 의미일까요?? 이것도 이후에 나오는 내용일까요?
- 해결됨이득우의 언리얼 프로그래밍 Part3 - 네트웍 멀티플레이 프레임웍의 이해
런타임 중 NewObject<>()의 Replicate에 대해 조금 더 궁금합니다.
런타임중에 SpawnActor<>()와 NewObject<>()를 멀티플레이 환경에서 사용하고 싶은데,강의를 듣고 엔진 코드도 살펴보고 문서도 읽어보고 5.3 환경에서 실험도 해보고 했지만잘 모르겠어서 이렇게 질문드립니다." AActor 상속 클래스를 Replicate = true로 하고 서버에서 SpawnActor를 사용해 스폰하면 클라이언트에도 자동으로 생성이 된다. "-> 이건 실험도 해보았고 에픽 포럼 글 확인해보니 맞는거 같습니다위 실험 결과를 토대로 UActorComponent는 어떻게 동작할까? 궁금해서 실험을 해보았을 때 로그를 찍으며 실험해본 결과는 아래와 같습니다. - UActorComponent는 UActorComponent의 Replicate 속성 true false 여부에 상관없이, - 서버에서 NewObject<>()로 생성 후, (여기서 outer는 ACharacter 같은 걸로 설정해서 추후 RegisterComponent()시 문제가 없도록 하고)- RegisterComponent를 통해 등록하면 https://docs.unrealengine.com/5.3/ko/replicated-subobjects-in-unreal-engine/의 과정을 거치지 않았는데도 클라이언트에서도 자동으로 생성이 된다.라는 결과를 얻었습니다. 이게 맞나요? 제 생각엔 'NewObject<>()시 사용한 Outer가 Replicate가 true인 Actor이면, UActorComponent는 UObject를 서브 오브젝트 레플리케이트 시키기 위한 추가 로직(위 문서 링크에 나와있는) 없이도 자동으로 잘 된다' 라는 생각이 드는데이게 맞는건지 아니면 틀린건지 위에 실험도 잘못한건지 잘 모르겠습니다 ㅜㅜ혹시나 맞다면 UActorComponent를 위처럼 동적으로 수정 / 삭제 시 RemoveReplicatedSubObject도 호출하지 않아도 되나요?
- 미해결이득우의 언리얼 프로그래밍 Part3 - 네트웍 멀티플레이 프레임웍의 이해
Part3 1강 레포지토리에서 플레이누르면 BluePrint쪽에서 에러가 발생하는거같습니다.
안녕하세요Part3 1강에 적혀있는 레포지토리에서1강 기본 프로젝트 샘플 커밋에서 빌드와 엔진까진 작동이되는데플레이 버튼을 누르면 아래의 에러가 발생하고있습니다 ㅠㅜ..Could not find the skeleton for Anim Blueprint 'ABP_ABCharacter' Would you like to choose a new one?
- 미해결이득우의 언리얼 프로그래밍 Part3 - 네트웍 멀티플레이 프레임웍의 이해
OnRep_ReplicatedHasBegunPlay 함수
bReplicatedHasBegunPlay 속성이 변경 됐을때 실행된다 하셨는데요.. 그러면 이미 게임이 시작된 상태에서 클라이언트가 접속시 클라이언트는 복제된 이미시작된 게임스테이트의 상태를보고bReplicatedHasBegunPlay속성을 변경 시켜주는건가요..? bReplicatedHasBegunPlay속성을 변경 시키는 타이밍이 언제 인가요??
- 미해결이득우의 언리얼 프로그래밍 Part3 - 네트웍 멀티플레이 프레임웍의 이해
10번 강의 질문 있습니다
안녕하십니까. 질문 남기기 앞서 강의 정말 잘 보고 있다고 말씀 드리고 싶습니다. 제가 궁금한 부분은 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이 덮어 씌워지는 것이 맞는가?
- 미해결이득우의 언리얼 프로그래밍 Part3 - 네트웍 멀티플레이 프레임웍의 이해
서버에서의 공격 동기화 질문입니다.
언리얼에서 얼마나 정확히 이러한 문제에 대해서 네트워크동기화를 잘 해주는지 모르겠어서 여쭈어봅니다.주황 녹색 모두 서버(제3의 호스트 또는 데디케이티드서버)에 접속한 클라이언트입니다.서버로의 핑은 200ms라 모두 가정하고 주황캐릭터가 움직이는 녹색 캐릭터를 공격하는 경우내 클라이언트에서는 내 주황이 잘 조준해서(Line trace나 Collision overlay) 녹색을 맞추었는데서버에서는 녹색이 이미 주황이 조준한 위치를 벗어나 계속 움직이고 있는 상황이 생기지 않나요? 캐릭터가 사람처럼 100m를 20초에 움직이면200ms 면 1미터의 오차가 생길수 있어서 충분히 클라이언트와 서버의 공격 오차가 발생할수 있다고 보는데요. 언리얼엔진이 이러한 핑에 따른 오차들을 보정하여 공격에 대한 충돌체크를 해주는 기능이 있나요?없다면 어떻게 처리를 하는게 좋을지 팁을 알려주시면 감사하겠습니다.
- 미해결이득우의 언리얼 프로그래밍 Part3 - 네트웍 멀티플레이 프레임웍의 이해
멀티플레이가 되도록 해주는 코드가 어디에 있는지 궁금합니다.
1강 예제코드를 다운받았을때 이미 멀티플레이가 가능한 상태였는데요, 키 입력을 송신하는 부분과 멀티플레이를 가능하게 구현을 하는 소스코드는 어디에 위치해 있는건지, 강의에서 소개한 이외의 세팅이 있는건지 궁금합니다.
- 미해결이득우의 언리얼 프로그래밍 Part3 - 네트웍 멀티플레이 프레임웍의 이해
네트워크 프로그래밍 언리얼 3 4 5 차이
현재 강의는 언리얼5 기준으로 진행이 되는데 네트워크 시스템 구성이나 커넥션 핸드셰이킹 같은 방식이 다른 버전도 똑같은지 궁금합니다.현재 강의를 듣는게 나중에 언리얼3 4 작업을 할 때도 도움이 될까요?
- 해결됨이득우의 언리얼 프로그래밍 Part3 - 네트웍 멀티플레이 프레임웍의 이해
NewObejct<>() 함수의 Replicate 여부가 궁금합니다.
안녕하세요. 강의를 듣고 나서 멀티플레이 게임을 만들어보려고 하고 있는데,Replicate에 대해 궁금한게 있는데 구글링을 해보아도 알 수가 없어서 이렇게 질문 드립니다. SpawnActor<>() 함수 같은 경우 서버에서 호출하면 자동으로 클라이언트들에게 Replicate 되는 것으로 알고 있습니다. 이 함수 내부에서는 NewObject<>()를 호출하는 것을 확인하였는데요. 그렇다면, NewObject<>() 함수도 마찬가지로 서버에서 호출 하면 클라이언트들에게 Replicate 되어 클라이언트들도 해당 객체를 생성하게 되나요?
- 해결됨이득우의 언리얼 프로그래밍 Part3 - 네트웍 멀티플레이 프레임웍의 이해
레벨 재시작이 아닌 리스폰을 한다고 했을 때
캐릭터에 붙어있던 플레이어 컨트롤러나 AI 컨트롤러는 캐릭터가 삭제되고 리스폰 됐을 때, 자동으로 다시 같은 인스턴스가 붙나요???플레이어 스테이트도 캐릭터마다 하나씩 붙어있는 걸로 알고 있는데요. 이것 역시 그대로 사용하나요?
- 미해결이득우의 언리얼 프로그래밍 Part3 - 네트웍 멀티플레이 프레임웍의 이해
안녕하세요. 강의 보기 전 질문드립니다.
안녕하세요. 유니티를 다루다가 언리얼을 공부하고자 해당 강의 구매 후 시청 전에 질문 드릴 것이 있어 남깁니다.유니티로 게임 로직을 구현할 때 경험상 씬(언리얼에서는 레벨이라고 하는 것 같습니다)을 통해 간단하게 로그인씬->로비씬->인게임씬의 로직으로 게임이 구현되는데요. 강의 내용의 서버는 인게임씬에 해당하는 것인지 로그인씬, 로비씬 같은 것도 구현이 가능한 것인지 궁금합니다.인게임씬에 해당하여 다른 씬은 따로 구현해야한다면 1강이나 2강을 보면 도움이 될 지도 궁금합니다.감사합니다.
- 미해결이득우의 언리얼 프로그래밍 Part3 - 네트웍 멀티플레이 프레임웍의 이해
10강 내용에 대해서 질문드립니다.
안녕하세요 이득우님.이전에 다른분이 남겨주신 내용과 위치가 같은데요,380번째줄, void AABCharacterPlayer::ServerRPCAttack_Implementation(float AttackStartTime) 함수에 대한 질문이 있습니다. 수업을 위해서 401번째줄에 if(!PlayerController->IsLocalController()) 조건문을 넣어주신것 같아보이긴 하는데, 사실 엄밀하게는, 이 조건문은 아예 없어도 전혀 문제되지 않는 로직이라고 생각되는데 제가 잘못 생각한걸까요? 좀 찝찝하기도 해서, 혹시 제가 놓친게 있나 싶어서 질문 남깁니다. 위 조건문이 없어도 되는 이유는, 해당 로직이 있는 곳은 클라이언트에서는 절대 동작할 수 없는 Server RPC 함수 내부 코드이며, 그렇기 때문에 서버에서만 동작하는 상태가 보장되고, 추가로 서버에 있는 모든 PlayerController는 서버 클라이언트 서버 모델에서 항상 IsLocalController가 false가 되기 때문이라고 생각하였습니다.다른분의 질문에서 올려주신 IsLocalController 함수는 AController의 함수로 올려주셨는데, 저희가 사용하는 Controller는 현재 형변환에 의해 PlayerController이고, 언리얼에서 함수 호출을 살펴보면, PlayerController의 IsLocalController이 호출되는것 같습니다. 그래서 위의 로직에서if (NetMode == NM_DedicatedServer)return false;에 의해 false가 항상 반환될거 같은데, 혹시 제가 놓친 부분이 있을까요?=> 혼자 고민을 이것저것 해보고 테스트 해보면서, 아마도 이렇게 해주신 이유는 Listen 서버이기 때문에 그런것 같네요. 리슨서버에서는 리슨서버의 PlayerController가 bIsLocalPlayerController가 true가 나오더군요. 그럼에도 불구하고, 일반적으로 데디케이티드 서버 환경에서는 리슨서버를 생각하지 않기 때문에 위 조건문은 필요없을것으로 생각됩니다. 게임 환경을 Client로 바꿔서 사용하였을때를 생각해보았습니다. 그리고 추가로 질문이 하나 더 있습니다.강의에서 Multicast 방식을 각각의 Controller에 대해 Client RPC를 사용해주면서 네트워크 최적화를 설명하신것에 대해서, 저는 이 부분을 멀티캐스트 하나를 사용하는것과 월드 내에 모든 클라이언트에 해당하는 Controller에게 직접 Client RPC를 직접 각각 호출해주는게 좀더 네트워크 성능상 좋다, 라고 이해했는데, 이 부분은 제가 올바르게 이해한게 맞을까요? 언제나 좋은 강의 해주시고, 질문도 꼼꼼하게 달아주셔서 감사드립니다(_ _)
- 미해결이득우의 언리얼 프로그래밍 Part3 - 네트웍 멀티플레이 프레임웍의 이해
안녕하세요, 혹시 GameAbilitySystem 강의는 시기가 언제쯤 업로드 되는지 여쭤봅니다
제목과 같습니다.
- 미해결이득우의 언리얼 프로그래밍 Part3 - 네트웍 멀티플레이 프레임웍의 이해
Insight를 사용하려고 하는데 오버플로우가 납니다..
- Live중인 것을 더블클릭하면 - 이 창이 뜨고 가만히 멈춥니다.(클릭도 안되고 닫기도 안됩니다) 그러다가 크래쉬가 납니다. 에러 내용입니다.. (스택오버플로우 입니다..)UnrealInsights_Slate!_chkstk()UnrealInsights_Slate!SScrollBar::Construct()UnrealInsights_Slate!STableViewBase::ConstructChildren()UnrealInsights_TraceInsights!SListView<TSharedPtr<SPacketContentView::FAggregationModeItem,1> >::Construct()UnrealInsights_TraceInsights!SComboBox<TSharedPtr<SPacketContentView::FAggregationModeItem,1> >::Construct()UnrealInsights_TraceInsights!TSlateDecl<SComboBox<TSharedPtr<SPacketContentView::FAggregationModeItem,1> >,RequiredArgs::T0RequiredArgs>::operator<<=()UnrealInsights_TraceInsights!SPacketContentView::CreateAggregationModeComboBox()UnrealInsights_TraceInsights!SPacketContentView::Construct()UnrealInsights_TraceInsights!TSlateDecl<SPacketContentView,RequiredArgs::T1RequiredArgs<TSharedRef<SNetworkingProfilerWindow,1> && __ptr64> >::operator<<=()UnrealInsights_TraceInsights!SNetworkingProfilerWindow::SpawnTab_PacketContentView()UnrealInsights_TraceInsights!TBaseRawMethodDelegateInstance<0,SNetworkingProfilerWindow,TSharedRef<SDockTab,1> cdecl(FSpawnTabArgs const & ptr64),FDefaultDelegateUserPolicy>::Execute()UnrealInsights_Slate!FTabManager::SpawnTab()UnrealInsights_Slate!FTabManager::RestoreArea_Helper()UnrealInsights_Slate!FTabManager::RestoreSplitterContent()UnrealInsights_Slate!FTabManager::RestoreArea_Helper()UnrealInsights_Slate!FTabManager::RestoreSplitterContent()UnrealInsights_Slate!FTabManager::RestoreArea_Helper()UnrealInsights_Slate!FTabManager::RestoreSplitterContent()UnrealInsights_Slate!FTabManager::RestoreArea_Helper()UnrealInsights_Slate!FTabManager::RestoreArea()UnrealInsights_Slate!FTabManager::RestoreFrom()UnrealInsights_TraceInsights!Insights::SMajorTabWindow::Construct()UnrealInsights_TraceInsights!SNetworkingProfilerWindow::Construct()UnrealInsights_TraceInsights!TSlateDecl<SNetworkingProfilerWindow,RequiredArgs::T2RequiredArgs<TSharedRef<SDockTab,1> const & ptr64,TSharedPtr<SWindow,1> const & ptr64> >::operator<<=()UnrealInsights_TraceInsights!FNetworkingProfilerManager::SpawnTab()UnrealInsights_TraceInsights!TBaseRawMethodDelegateInstance<0,FNetworkingProfilerManager,TSharedRef<SDockTab,1> cdecl(FSpawnTabArgs const & ptr64),FDefaultDelegateUserPolicy>::Execute()UnrealInsights_Slate!FTabManager::SpawnTab()UnrealInsights_Slate!FTabManager::RestoreArea_Helper()UnrealInsights_Slate!FTabManager::RestoreSplitterContent()UnrealInsights_Slate!FTabManager::RestoreArea_Helper()UnrealInsights_Slate!FTabManager::RestoreArea()UnrealInsights_Slate!FTabManager::RestoreFrom()UnrealInsights_TraceInsights!Insights::SMajorTabWindow::Construct()UnrealInsights_TraceInsights!SNetworkingProfilerWindow::Construct()UnrealInsights_TraceInsights!TSlateDecl<SNetworkingProfilerWindow,RequiredArgs::T2RequiredArgs<TSharedRef<SDockTab,1> const & ptr64,TSharedPtr<SWindow,1> const & ptr64> >::operator<<=()UnrealInsights_TraceInsights!FNetworkingProfilerManager::SpawnTab()UnrealInsights_TraceInsights!TBaseRawMethodDelegateInstance<0,FNetworkingProfilerManager,TSharedRef<SDockTab,1> cdecl(FSpawnTabArgs const & ptr64),FDefaultDelegateUserPolicy>::Execute()UnrealInsights_Slate!FTabManager::SpawnTab()UnrealInsights_Slate!FTabManager::RestoreArea_Helper()UnrealInsights_Slate!FTabManager::RestoreSplitterContent()UnrealInsights_Slate!FTabManager::RestoreArea_Helper()UnrealInsights_Slate!FTabManager::RestoreArea()UnrealInsights_Slate!FTabManager::RestoreFrom() 실행한 배치파일 인데요.. -NetTrace=1 이부분을 지우면 실행시켜도 에러는 뜨지 않지만 , Networking Insights 창이 안뜹니다... 또, 이것 때문인지는 모르겠지만, Connect버튼을 누르면 Error 메서지가 하나 뜹니다..LogTrace: Error: ReadError While reading remote command. Read returned 0:' 또 신기한 것은 처음에 실행을 했을 때는 Networking Insights가 잘 실행이 됐었습니다.. 2번째부터 실행하려니까 스택오버플로우가 나면서 창이 닫힙니다 .. ㅠㅠ
- 해결됨이득우의 언리얼 프로그래밍 Part3 - 네트웍 멀티플레이 프레임웍의 이해
언리얼 데디케이트 서버와 리슨서버 호환성에 대한 질문입니다!
안녕하세요 교수님part 1, part 2를 모두 수강하고 너무 도움이 많이 되어 part 3까지 듣고 있는 클라이언트 지망생입니다~강의를 들으니, 처음 게임을 개발 할 때, 서버를 염두해 두지 않고 개발을 하면 이후에 코드를 수정하는데 많은 시간이 걸리는 것을 이해를 했습니다.그렇다면 리슨서버로 개발을 진행하고, 이후에 데디케이트 서버로 변경을 하려고 하면 이 또한 많은 코드 수정이 필요한가요?정확히 궁금한 것은, 언리얼에 리슨서버와 데디케이트 서버의 호환성이 높은지 아니면 완전히 다른 코드를 사용해서 구현해야 하는 것인지 입니다~~
- 해결됨이득우의 언리얼 프로그래밍 Part3 - 네트웍 멀티플레이 프레임웍의 이해
액터에 우선권을 사용자 설정할 수 있었나요?
다시 쭉 보다 보니 궁금한게 하나씩 계속 나오는 것 같습니다... Owner 설정해서 배율을 높히는 것 말고 다른 manual적 방법이 있나요?
- 해결됨이득우의 언리얼 프로그래밍 Part3 - 네트웍 멀티플레이 프레임웍의 이해
스탯 구조체 리플리케이션의 컨디션 설정
실습에선 BaseStat 과 ModifierStat은 각 입력 권한이 있는 클라이언트( 원격 Autonomous)에만 전달 되도록 Condition지정하는 의도로 COND_OwnerOnly를 하였는데요. condition을 COND_AutonomousProxy으로 하는건 또 달라 지는 건가요?? 설명으로는이렇게 나와 있는데, 이 "소유권을 가지고 있다" 라는 정의가 또 좀 헷갈리기 시작한 것 같습니다..... 서버에서 로컬 룰 Authority / 원격 AutonomousProxy 인 액터가 COND_OwnerOnly에 해당한다면 COND_AutonomousOnly에 해당하는 액터는 어떤 경우인가요??