묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해
boolean 변수가 변경되는 이유를 모르겠습니다.
<#include "Item/ABItemBat.h"#include "Components/BoxComponent.h"#include "Components/StaticMeshComponent.h"#include "Particles/ParticleSystemComponent.h"#include "Physics/WMACollsion.h"#include "Interface/ABCharacterItemInterface.h"#include "Character/WMACharacterPlayer.h"#include <GameData/WMAGameInstance.h>#include "Blueprint/UserWidget.h"#include "Components/WidgetComponent.h"#include "UI/WMAItemInteractionWidget.h"#include "Interface/ABCharacterItemInterface.h"// Sets default valuesAABItemBat::AABItemBat(){ Trigger = CreateDefaultSubobject<UBoxComponent>(TEXT("TriggerBox")); Mesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Mesh")); Effect = CreateDefaultSubobject < UParticleSystemComponent>(TEXT("Effect")); TextE = CreateDefaultSubobject<UWidgetComponent>(TEXT("TextE")); Item = CreateDefaultSubobject<UABItemData>(TEXT("ItemBat")); static ConstructorHelpers::FClassFinder<UUserWidget>InputE(TEXT("WidgetBlueprint'/Game/UI/WBP_ItemInteraction.WBP_ItemInteraction_C'")); if (InputE.Succeeded()) { InteractionItemWidgetClass = InputE.Class; } RootComponent = Trigger; Mesh->SetupAttachment(Trigger); Effect->SetupAttachment(Trigger); Trigger->SetCollisionProfileName(CPROFILE_WMATRIGGER); Trigger->SetBoxExtent(FVector(11.0f, 10.0f, 110.0f)); Trigger->OnComponentBeginOverlap.AddDynamic(this, &AABItemBat::OnOverlapBegin); Trigger->OnComponentEndOverlap.AddDynamic(this,&AABItemBat::OnOverlapEnd); static ConstructorHelpers::FObjectFinder<UStaticMesh> BoxMeshRef(TEXT("/Script/Engine.StaticMesh'/Game/Item/Bat/Batfbx.Batfbx'")); if (BoxMeshRef.Succeeded()) { TempBoxMesh = BoxMeshRef.Object; Mesh->SetStaticMesh(BoxMeshRef.Object); } Mesh->SetRelativeLocation(FVector(0.0f, -3.5f, -20.0f)); Mesh->SetCollisionProfileName(TEXT("NoCollision")); bInteractionItem = false; PrimaryActorTick.bCanEverTick = true;}void AABItemBat::Tick(float DeltaTime){ Super::Tick(DeltaTime); //UE_LOG(LogTemp, Warning, TEXT("Character is Die :: %s"), bInteractionItem ? TEXT("true") : TEXT("false")); if (bInteractionItem) { Trigger->OnComponentBeginOverlap.AddDynamic(this, &AABItemBat::OnOverlapBegin); UE_LOG(LogTemp,Warning,TEXT("NO item Attach")) }}void AABItemBat::OnOverlapBegin(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepHitResult){ //TextE->SetHiddenInGame(false); if (InteractionItemWidgetClass) { ItemText = CreateWidget<UUserWidget>(GetWorld(), InteractionItemWidgetClass); if(ItemText) ItemText->AddToViewport(); } if (nullptr == Item) { Destroy(); return; } //UE_LOG(LogTemp, Warning, TEXT("Character is Die :: %s"), bInteractionItem ? TEXT("true") : TEXT("false")); if (bInteractionItem) { IABCharacterItemInterface* OverlappingPawn = Cast<IABCharacterItemInterface>(OtherActor); if (OverlappingPawn) { OverlappingPawn->TakeItem(Item); //TextE->SetHiddenInGame(true); } //Effect->Activate(true); Mesh->SetHiddenInGame(true); SetActorEnableCollision(false); Effect->OnSystemFinished.AddDynamic(this, &AABItemBat::OnEffectFinished); Trigger->OnComponentBeginOverlap.RemoveDynamic(this, &AABItemBat::OnOverlapBegin); }}void AABItemBat::OnOverlapEnd(UPrimitiveComponent* OverlappedComp, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex){ if (ItemText) { ItemText->RemoveFromViewport(); ItemText = nullptr; }}void AABItemBat::OnEffectFinished(UParticleSystemComponent* ParticleSystem){ Destroy();}void AABItemBat::StartInteractionItem(){ bInteractionItem = true;}void AABItemBat::StopInteractionItem(){ //bInteractionItem = false;}> 일단 WMACharacterplayer.cpp에서 StartInteractionItem()을 호출하는데는 문제가 없습니다. StartInteractionItem() 함수 내부에서 로그를 출력해보면 bInteractionItem이 true로 잘 출력이 되는 것을 확인할 수 있습니다. 문제는 Tick함수 내부와 OnOverlapBegin()함수 내부에서 로그를 찍어보면 bInteractionItem이 false로 변경되어서 OnOverlapBegin()함수를 호출하지 못하고 있는 상황입니다. 혹시 어느 부분이 문제가 되어 bool값이 변경되는지 여쭐수 있을까요?
-
미해결이득우의 언리얼 프로그래밍 Part1 - 언리얼 C++의 이해
UPROPERTY로 선언되지 않은 언리얼 오브젝트에 대한 궁금증이 있습니다
애초에 언리얼 오브젝트가 UPROPERTY로 선언이 되지 않았다는 것은, 가비지 컬렉터에 의해 관리되지 않고 있다는 것으로 이해했습니다. 그리고 유효하지 않다는 것의 의미 또한 언리얼 오브젝트가 가비지 컬렉션에 의해 관리되지 않고 있다는 것으로 이해했습니다.그렇다면 NonPropStudent는 시작부터 "유효하지 않은 언리얼 오브젝트"여야 하지 않나요?왜 3초가 지나기 전에 Shutdown을 시키면 UPROPERTY로 선언되지 않은 오브젝트 객체인 NonPropStudent 가 "유효한 언리얼 오브젝트"라고 로그가 뜨는 건가요? 언리얼 오브젝트가 가비지 컬렉터에 의해 회수가 되는 것과 애초에 가비지 컬렉터에 의해서 관리되지 않는 것은 다른 의미 아닌가요?
-
미해결이득우의 언리얼 프로그래밍 Part1 - 언리얼 C++의 이해
첫 검증테스트에선.
포인터의 값이 nullptr인지로는 가리키는 객체가 있는지 판별이 부정확하다는것과,유효하기위해선 UPROPERTY매크로를 사용해야한다는것. //정확한 결과를 보기위해선.. if (NonPropStudent->IsValidLowLevel()) { UE_LOG(LogTemp, Log, TEXT("[NonPropStudent] 유효한 언리얼 오브젝트")); } else { UE_LOG(LogTemp, Log, TEXT("[NonPropStudent] 널 포인터")); } if (PropStudent->IsValidLowLevel()) { UE_LOG(LogTemp, Log, TEXT("[PropStudent] 유효한 언리얼 오브젝트")); } else { UE_LOG(LogTemp, Log, TEXT("[PropStudent] 널 포인터")); }//결과로그LogTemp: [NonPropStudent] 널 포인터LogTemp: [PropStudent] 유효한 언리얼 오브젝트이렇다는 말씀이죠?
-
미해결이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해
13:48경에 나오는 헤더 파일의 클래스 안에 ":" 키워드는 "="과 같다고 보면 되나요?
uint32 bUseControllerRotationYaw : 1이런 거요.
-
미해결이득우의 언리얼 프로그래밍 Part1 - 언리얼 C++의 이해
46분에 커스텀 구조체에 대한 GetTypeHash()에 대한 질문이 있습니다.
GetTypeHash()는 FStudentData 구조체를 입력으로 받아서 해당 구조체의 Order 멤버 변수를 기반으로 해시 값을 생성한다고 이해하면 되나요? 즉, return GetTypeHash(InStudentData.Order);이 부분은 FStudentData의 구조체의 Order 멤버 변수를 입력으로 받아서해당 값을 해싱한 결과를 반환하는 것이라고 이해하면 될까요? 또한, TSet에 저장된 FStudentData객체의 멤버변수 Name은 중복이 될 수 있지만, Order는 중복이 될 수 없는 거로 이해했는데 잘 이해한 건가요?
-
미해결이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해
npc와 player 에셋을 다른 것을 사용하는 경우
강의 시에는 npc와 플레이어가 같은 에셋을 사용해서 mesh등의 reference들을 사용할때 base에서 한번에 처리하는 식으로 되어있는데 만약 캐릭터 asset과 몬스터 asset이 다른 경우에는 base의 생성자에서 처리하는게 아닌 각각의 npc와 player의 코드에서 에셋 경로를 입력해 주어야하나요? 또 공격판정시에 플레이어가 총을 쏘고 몬스터는 근접공격을 한다할때 이 또한 둘의 판정을 각각의 코드에서 적어주는게 맞는건가요?
-
미해결이득우의 언리얼 프로그래밍 Part3 - 네트웍 멀티플레이 프레임웍의 이해
Trace Store 에 아무것도 안 뜹니다.
배치 파일로 에디터를 열고, unrealinsight 실행하여 connect 해 준 다음 Trace store 를 열면 아무것도 뜨지 않고 비어있습니다. 어떻게 해야 할까요?
-
미해결[입문자를 위한 UE5] Part4. 언리얼 엔진 C++
선생님 강의 늘 잘보고 있습니다 문제가 좀 있는데요
C++클래스를 생성할 때 하위폴더를 만들어 생성하면 그 위치의 헤더파일을 인식을 하질 못합니다 분명 경로에 있고 VS상에도 필터구조 아래에 잘 들어가 있는데 인식을 못하는 문제가 있는데 VS를 지웠다 깔아도 마찬가지입니다 이런 경우 해결방법이 있을까요?-> 선생님 이문제는 강의 듣다보니 바로 나왔네요 해당 하위폴더를 지우고 막바로 헤더를 인클루드 하니 해결되었습니다 -> 인클루드 하니 비주얼스튜디오 상에선 해결이 되었는데 언리얼 에디터 상에서 폴더구조가 반영이 안됩니다 혹시 이경우는 어떻게 하면 좋을까요? 또 저같은 경우 라이브코딩이 켜져있으면 빌드할 때 에러가 납니다 선생님은 같은 증상이 없으신지요?
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part5: UE5 & IOCP 서버 연동
파트4의 서버 파일이랑 다른건가요??
파트4에서 서버 프레임워크 강의를 보고 파트5로 넘어왔습니다.그런데 중간중간 서버 프레임워크 소스가 다른곳이 있는거 같은데요, 예를 들어 서버에서 사용중인 패킷핸들러 cpp에서 인클루드되어있는 파일이 현재 파트5 강의에서는 BufferReader.h와 BufferWrite.h를 포함하고있습니다. 파트4 기준으로 해당 헤더는 포함되어있지 않구요. 그리고 패킷 핸들러.h 에서는 현재 파트5에서는 MakeShared하는 부분을 언리얼과 구분 지어서 MakeShared, make_share로 강의를 해주셨는데, 애초에 파트4의 핸들러에서는 make_shared를 사용하지 않고SendBufferPtr sendBuffer = GSendBufferManager->Open( packetSize );소스를 이용중인것으로 보이는데요..혹시 제가 중간에 잘못본 강의가 있는걸까요?
-
미해결[입문자를 위한 UE5] Part5. 언리얼 엔진 VR
BP_Pawn 위치 조정
안녕하세요 선생님! 가뭄에 단비 같은 VR 강의 너무 잘 보고 있습니다!강의를 따라가는데 자꾸 실행할 때마다플레이어의 눈높이가 바닥보다 아래에 있어서 진행에 어려움이 있습니다. VR_Root 의 Z축 값을 조정해봤는데도 그대로 이더라고요. 혹시 제가 블루프린트에서 놓친 설정이 있는지 하여 사진을 첨부합니다. 다시 한번 강의를 들어봤는데 답을 찾지 못하고 계속 시간이 소요되어... 생각보다 쉬운 부분을 제가 놓치고 있는지 여쭤보고 싶네요.이상입니다, 감사합니다.
-
미해결이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해
캐릭터 애님블프변경
상속받은 블프-현재 플레이어로 쓰이는-에 skm,animBP를 바꿔보았습니다. 그냥 레벨에 두고,possess 0 이면,애니,카메라 잘 작동하는데, 게임모드를 사용하면,애니가 안되는이유가 뭘까요? 코드에서도 경로 수정한 상태입니다. 혹시나 애님블프가 문제일까해서 5마네킨 방식으로 다 고쳐도 그렇네요.(디버깅이 미숙해서,..결국은, 첨으로 자료 다운받아서 실행했습니다. 늘뜨던 두개의 fail도 없고,신기하네요...->근데,클래스추가하고나니,또 생겼습니다 ㅠ) [상담] 파트1의 메모리부분부터 정신이 탈출해서 잠깐 불붙이러 프레임웍으로 먼저 왔습니다. 낯익은 강의라 잠시 행복했는데, 4는 입력이 그닥 복잡하지않았던거같은데, 향상된 시스템에서 또 탈탈 털려서..멘탈 다시잡고 다음강의를 보고싶은데, 아무리 보고 따라코딩이지만, 직접 만든걸로 하는게 맞을까요?
-
미해결이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해
티맵 에러
Assertion failed: Pair != nullptr [File:C:\UE_Editor\UE_5.3\Engine\Source\Runtime\Core\Public\Containers\Map.h] [Line: 671]에러가 이렇게뜨고,디버깅을 하면, SetCharacterControl함수의 UEJCharacterControlData* NewCharacterControl = CharacterControlManager[NewCharacterControlType];check(NewCharacterControl);부분에서 에러가 나는걸로, 티맵값을 못받아오는거같은데요. .. 어떻게 하면될까요?
-
해결됨이득우의 언리얼 프로그래밍 Part3 - 네트웍 멀티플레이 프레임웍의 이해
PostNetInit 관련 질문
안녕하세요, PostNetInint 관련 질문이 있습니다. LogABNetwork: [SERVER] AABGameMode::PreLogin ============================================================ LogABNetwork: [SERVER] AABGameMode::PreLogin Begin LogABNetwork: [SERVER] AABGameMode::PreLogin End LogABNetwork: [SERVER] AABGameMode::Login Begin LogABNetwork: [SERVER] AABPlayerController::BeginPlay Begin BP_ABPlayerController_C_1 LogABNetwork: [SERVER] AABPlayerController::BeginPlay End LogABNetwork: [SERVER] AABGameMode::Login End LogABNetwork: [SERVER] AABGameMode::PostLogin Begin LogABNetwork: [SERVER] AABCharacterPlayer::BeginPlay Begin ABCharacterPlayer_1 LogABNetwork: [SERVER] AABCharacterPlayer::BeginPlay End ABCharacterPlayer_1 LogABNetwork: [SERVER] AABPlayerController::OnPossess Begin BP_ABPlayerController_C_1 LogABNetwork: [SERVER] AABCharacterPlayer::PossessedBy Begin ABCharacterPlayer_1 LogABNetwork: [SERVER] AABCharacterPlayer::PossessedBy No Owner LogABNetwork: [SERVER] AABCharacterPlayer::PossessedBy Owner : BP_ABPlayerController_C_1 LogABNetwork: [SERVER] AABCharacterPlayer::PossessedBy End ABCharacterPlayer_1 LogABNetwork: [SERVER] AABPlayerController::OnPossess End LogABNetwork: [SERVER] AABGameMode::PostLogin Client Connections : IpConnection_1 LogABNetwork: [SERVER] AABGameMode::PostLogin End LogABNetwork: [CLIENT1] AABPlayerController::PostNetInit Begin BP_ABPlayerController_C_0 LogABNetwork: [CLIENT1] AABPlayerController::PostNetInit Server Connection : IpConnection_0 LogABNetwork: [CLIENT1] AABPlayerController::PostNetInit End LogABNetwork: [CLIENT1] AABCharacterPlayer::OnRep_Owner Begin ABCharacterPlayer_0 LogABNetwork: [CLIENT1] AABCharacterPlayer::OnRep_Owner End ABCharacterPlayer_0 LogABNetwork: [CLIENT1] AABCharacterPlayer::PostNetInit Begin ABCharacterPlayer_0 LogABNetwork: [CLIENT1] AABCharacterPlayer::PostNetInit End LogABNetwork: [CLIENT1] AABCharacterPlayer::PostNetInit Begin ABCharacterPlayer_1 LogABNetwork: [CLIENT1] AABCharacterPlayer::PostNetInit End LogABNetwork: [CLIENT1] AABGameState::OnRep_ReplicatedHasBegunPlay Begin No Owner LogABNetwork: [CLIENT1] AABPlayerController::BeginPlay Begin BP_ABPlayerController_C_0 LogABNetwork: [CLIENT1] AABPlayerController::BeginPlay End LogABNetwork: [CLIENT1] AABCharacterPlayer::BeginPlay Begin ABCharacterPlayer_0 LogABNetwork: [CLIENT1] AABCharacterPlayer::BeginPlay End ABCharacterPlayer_0 LogABNetwork: [CLIENT1] AABCharacterPlayer::BeginPlay Begin ABCharacterPlayer_1 LogABNetwork: [CLIENT1] AABCharacterPlayer::BeginPlay End ABCharacterPlayer_1 LogABNetwork: [CLIENT1] AABGameState::OnRep_ReplicatedHasBegunPlay End 강의 말미의 로그를 보면 [CLIENT1] 의 AABPlayerController::PostNetInit 함수가 함수가 끝나고 나서 OnRep_Owner 함수가 실행됩니다. 그리고 나서 AABCharacterPlayer의 PostNetInit 함수가 시작 되는데, Actor 를 상속받은 모든 하위 클래스에서 PostNetInit 을 호출 하는 것으로 알고 있습니다. 이때 순서가 컨트롤러의 PostNetInit 이 호출되고 종료된 다음, 그 다음으로 캐릭터의 PostNetInit이 호출되고 종료되는데, 캐릭터와 컨트롤러 둘다 액터를 상속 받았는데 순서가 무조건 먼저 컨트롤러 호출 및 완료 후에 캐릭터 호출 및 완료 인지 궁금합니다. Gamemode->Controller-> Pawn 이순서가 무조건 맞나요?
-
미해결[입문자를 위한 UE5] Part3. 언리얼 엔진 3D 게임 개발 입문
파트4와 파트6은 언제쯤 나오나요?
파트4와 파트6은 언제쯤 나오나요?
-
미해결이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해
캐릭터구현부 설정중에.
bUseControllerRotationPitch = false;바로 값할당 GetCapsuleComponent()->InitCapsuleSize(42.0f, 96.0f); 포인터로 부모의 멤버변수에 접근해서,초기화. 둘다, ACharacter에서 초기화(nullptr아닌)되어있는데, 왜 불회전변수는 바로 쓰고,다른 프로퍼티들은 저런 형태로 써야하나요?
-
해결됨이득우의 언리얼 프로그래밍 Part2 - 언리얼 게임 프레임웍의 이해
Constructorhelpers 크래시 관련 질문
안녕하세요 이득우 님, Constructorhelpers 관련해서 질문이 있어서 글을 올렸습니다.생성자에서 Constructorhelpers 를 사용해 에셋과 오브젝트를 불러오려고 하는데, 에디터가 75퍼센트까지 준비되다가 자꾸 멈춰 버립니다. 아래는 제가 사용한 Constructorhelpers 코드 전문입니다. 코드는 단순하게 제가 만든 캐릭터 베이스에서 메쉬와 애니메이션 클래스를 설정해 주는 것입니다.주석 처리를 통해 이 부분에서 오류가 나는 것을 확실히 확인 했습니다. 주석으로 처리하고 블루프린트에서 에셋을 설정해주면 잘 되거든요 .. (경로도 맞는 것 여러 번 확인 하였습니다.)static ConstructorHelpers::FClassFinder<UAnimInstance> AnimInstanceClassRef(TEXT("/Game/FirstPersonArms/Animations/FirstPerson_AnimBP.FirstPerson_AnimBP_C")); if (AnimInstanceClassRef.Class) { GetMesh()->SetAnimInstanceClass(AnimInstanceClassRef.Class); } static ConstructorHelpers::FObjectFinder<USkeletalMesh> CharacterMeshRef(TEXT("/Script/Engine.SkeletalMesh'/Game/FirstPersonArms/Character/Mesh/SK_Mannequin_Arms.SK_Mannequin_Arms'")); if (CharacterMeshRef.Object) { GetMesh()->SetSkeletalMesh(CharacterMeshRef.Object); } 이럴 때는 어떻게 해야 할지 궁금합니다.
-
미해결이득우의 언리얼 프로그래밍 Part1 - 언리얼 C++의 이해
자주 뜨는 컴파일에러.
5>Done building project "BuildGraph.Automation.csproj" -- FAILED.6>Done building project "AutomationScripts.Automation.csproj" -- FAILED. 이 두개의 빌드실패가 거의 항상있습니다. PIE 실행에는 영향없는거같은데, 해결할수 있는 방법이 있을까요?
-
미해결이득우의 언리얼 프로그래밍 Part3 - 네트웍 멀티플레이 프레임웍의 이해
클라이언트의 애니메이션블루프린트를 어떻게 바꿔야 하나요
2인 멀티게임을 만들고 있는데 서버 플레이어의 메쉬와 클라이언트 플레이어의 메쉬가 다르고 클라이언트 플레이어의 AnimInstance를 바꾸고 싶은데 어떻게 해야하나요?
-
미해결이득우의 언리얼 프로그래밍 Part1 - 언리얼 C++의 이해
코드 복붙 문제...
왜 코드들을 복붙하기만 하면 꼬일까요?1. 복붙한 코드들의 API명을 새 플젝명으로 바꿔써도 빌드에 문제가 생기고, 에러들이,내가 만들지않은 엔진의 코드들이 에러났다고 표시가 되요.2. 그리고 GameBase가 생기질 않았습니다. 다시보니,이전의 다른 플젝들도요. 별도의 세팅이 필요한가요?"디버깅을 위한 편집기호"는 설치했습니다.3. 파일복사에서 너무 해매서.,언리얼플젝을 통으로 카피해서,vs파일을 열어 컴파일을 하니, 그 플젝은 디버깅이 안되고, 복사후, 새로 추가한 클래스는 컨텐츠창에 안뜹니다.vs에는 있습니다.<-이렇게 쓰면 안되는건가요?4. 결국은 그래서, 강의바뀔때마다, 같은걸 다시 만들고있는데,(코딩연습으로는 좋겠지만...)강의에서 멀쩡히 되는부분이 안되서 너무 찜찜합니다. 5.3사용합니다.
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part5: UE5 & IOCP 서버 연동
3D 이동 동기화
안녕하세요 강사님! 저는 강의 Part4,5 수강하고 서버 제작한 뒤에원래 제가 만들어놨던 컨텐츠에 서버 붙이는 중인데요 패킷 송수신까지 잘 마무리 되었고이동 동기화를 진행하는 도중에, 강의에서 연습했던 환경(평지)과 달리 제가 만든 컨텐츠에서는 울퉁불퉁한 지경도 있고 다양한 오브젝트들(몬스터, 건물, 나무...etx)이 있어 충돌을 고려해야 하는 상황인데요. 충돌이 발생하면 오차가 점점 커기는걸로 봐서 추측하건데,한 명의 클라이언트의 움직임에 대해서 각각의 클라이언트에서 충돌처리가 일어나기때문에 오차가 점점 커진다고 판단이 되었습니다. 이러한 충돌로 인한 이동 동기화 오차를 줄일 수 있는 방법으로는 어떤 방법이 있을까요?제가 생각해본걸로는.. 다음과 같은 방법이 생각났는데클라가 먼저 이동해서 발생하는 충돌이벤트도 같이 서버에 패킷으로 보내준다. (위치정보+방향+충돌이벤트)서버는 받은 패킷을 모든 클라에게 뿌린다. 다른 클라들은 해당 캐릭터를 기존과 같은 방식으로 이동시키되(방향으로만 전진) 충돌이벤트가 있다면 받은 위치정보로 AI 기능(?)을 활용해서 추가로 이동시킨다. 이러면 충돌이 발생할 때마다 AI로 움직여주고. 그럼 그 사이에 해당 캐릭터가 또 움직이면 움직임 자체에 텀이 생겨버릴것이라는 문제점이 나타나네요 ㅠㅠ.. 이러한 이동 동기화 문제점을 어떤방식으로 해결하는지 궁금합니다!