Răsfoiți Sursa

Updates to the multiplayer sample to fix movement with multiple clients connected

karlberg 4 ani în urmă
părinte
comite
1dce201881

+ 6 - 7
Gem/Code/Source/Components/CharacterComponent.cpp

@@ -41,7 +41,8 @@ namespace MultiplayerSample
 
     void CharacterComponent::OnActivate([[maybe_unused]] Multiplayer::EntityIsMigrating entityIsMigrating)
     {
-        m_physicsCharacter = Physics::CharacterRequestBus::FindFirstHandler(GetEntityId());
+        Physics::CharacterRequests* characterRequests = Physics::CharacterRequestBus::FindFirstHandler(GetEntityId());
+        m_physicsCharacter = (characterRequests != nullptr) ? characterRequests->GetCharacter() : nullptr;
         GetNetBindComponent()->AddEntitySyncRewindEventHandler(m_syncRewindHandler);
 
         if (!HasController())
@@ -55,9 +56,8 @@ namespace MultiplayerSample
         ;
     }
 
-    void CharacterComponent::OnTranslationChangedEvent(const AZ::Vector3& translation)
+    void CharacterComponent::OnTranslationChangedEvent([[maybe_unused]] const AZ::Vector3& translation)
     {
-        GetEntity()->GetTransform()->SetWorldTranslation(translation);
         OnSyncRewind();
     }
 
@@ -69,10 +69,9 @@ namespace MultiplayerSample
         }
 
         const AZ::Vector3 currPosition = m_physicsCharacter->GetBasePosition();
-
-        if (currPosition != GetNetworkTransformComponent()->GetTranslation())
+        if (!currPosition.IsClose(GetNetworkTransformComponent()->GetTranslation()))
         {
-            m_physicsCharacter->SetBasePosition(GetNetworkTransformComponent()->GetTranslation());
+            //m_physicsCharacter->SetBasePosition(GetNetworkTransformComponent()->GetTranslation());
         }
     }
 
@@ -99,7 +98,7 @@ namespace MultiplayerSample
             return GetEntity()->GetTransform()->GetWorldTranslation();
         }
         GetParent().m_physicsCharacter->AddVelocity(velocity);
-        GetParent().m_physicsCharacter->GetCharacter()->ApplyRequestedVelocity(deltaTime);
+        GetParent().m_physicsCharacter->ApplyRequestedVelocity(deltaTime);
         GetEntity()->GetTransform()->SetWorldTranslation(GetParent().m_physicsCharacter->GetBasePosition());
         AZLOG
         (

+ 2 - 2
Gem/Code/Source/Components/CharacterComponent.h

@@ -17,7 +17,7 @@
 
 namespace Physics
 {
-    class CharacterRequests;
+    class Character;
 }
 
 namespace MultiplayerSample
@@ -42,7 +42,7 @@ namespace MultiplayerSample
         void OnTranslationChangedEvent(const AZ::Vector3& translation);
         void OnSyncRewind();
 
-        Physics::CharacterRequests* m_physicsCharacter = nullptr;
+        Physics::Character* m_physicsCharacter = nullptr;
         Multiplayer::EntitySyncRewindEvent::Handler m_syncRewindHandler = Multiplayer::EntitySyncRewindEvent::Handler([this]() { OnSyncRewind(); });
         AZ::Event<AZ::Vector3>::Handler m_translationEventHandler;
     };

+ 2 - 0
Gem/Code/Source/Components/NetworkAnimationComponent.cpp

@@ -96,6 +96,8 @@ namespace MultiplayerSample
             return;
         }
 
+        constexpr bool isAuthoritative = true;
+        m_networkRequests->CreateSnapshot(isAuthoritative);
         m_networkRequests->UpdateActorExternal(deltaTime);
 
         if (m_velocityParamId == InvalidParamIndex)

+ 1 - 0
Gem/Code/Source/Components/WasdPlayerMovementComponent.cpp

@@ -121,6 +121,7 @@ namespace MultiplayerSample
         UpdateVelocity(*wasdInput);
 
         // Ensure any entities that we might interact with are properly synchronized to their rewind state
+        if (IsAuthority())
         {
             const AZ::Aabb entityStartBounds = AZ::Interface<AzFramework::IEntityBoundsUnion>::Get()->GetEntityLocalBoundsUnion(GetEntity()->GetId());
             const AZ::Aabb entityFinalBounds = entityStartBounds.GetTranslated(GetVelocity());