NetworkTestSpawnerComponent.cpp 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project
  3. *
  4. * SPDX-License-Identifier: Apache-2.0 OR MIT
  5. *
  6. */
  7. #include <AzCore/Component/TransformBus.h>
  8. #include <AzCore/Serialization/EditContext.h>
  9. #include <Components/PerfTest/NetworkTestSpawnerComponent.h>
  10. #include <Multiplayer/IMultiplayer.h>
  11. #include <Multiplayer/Components/NetBindComponent.h>
  12. #include "NetworkPrefabSpawnerComponent.h"
  13. #pragma optimize("", off)
  14. namespace MultiplayerSample
  15. {
  16. void NetworkTestSpawnerComponent::Reflect(AZ::ReflectContext* context)
  17. {
  18. AZ::SerializeContext* serializeContext = azrtti_cast<AZ::SerializeContext*>(context);
  19. if (serializeContext)
  20. {
  21. serializeContext->Class<NetworkTestSpawnerComponent, AZ::Component>()
  22. ->Field("Enabled", &NetworkTestSpawnerComponent::m_enabled)
  23. ->Field("Max Objects", &NetworkTestSpawnerComponent::m_maximumLiveCount)
  24. ->Field("Spawn Period", &NetworkTestSpawnerComponent::m_spawnPeriod)
  25. ->Version(1);
  26. if (AZ::EditContext* editContext = serializeContext->GetEditContext())
  27. {
  28. using namespace AZ::Edit;
  29. editContext->Class<NetworkTestSpawnerComponent>("Network Prefab Spawn Tester",
  30. "Various helpful test tools and behaviors to test multiplayer logic and performance.")
  31. ->ClassElement(ClassElements::EditorData, "")
  32. ->Attribute(AZ::Edit::Attributes::Category, "MultiplayerSample")
  33. ->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC_CE("Game"))
  34. ->DataElement(nullptr, &NetworkTestSpawnerComponent::m_enabled, "Enabled", "Enables spawning of test prefabs")
  35. ->DataElement(nullptr, &NetworkTestSpawnerComponent::m_spawnPeriod, "Spawn Period", "How often to spawn new prefab instance, in seconds")
  36. ->DataElement(nullptr, &NetworkTestSpawnerComponent::m_maximumLiveCount, "Max Objects",
  37. "Maximum objects to keep alive, will delete older objects when the count goes above this value.")
  38. ;
  39. }
  40. }
  41. }
  42. void NetworkTestSpawnerComponent::Activate()
  43. {
  44. if (const Multiplayer::NetBindComponent* netBindComponent = GetEntity()->FindComponent<Multiplayer::NetBindComponent>())
  45. {
  46. if (netBindComponent->IsNetEntityRoleAuthority())
  47. {
  48. AZ::TickBus::Handler::BusConnect();
  49. m_currentCount = 0;
  50. m_accumulatedTime = 0.f;
  51. m_sinceLastSpawn = 0.f;
  52. }
  53. }
  54. }
  55. void NetworkTestSpawnerComponent::Deactivate()
  56. {
  57. AZ::TickBus::Handler::BusDisconnect();
  58. }
  59. void NetworkTestSpawnerComponent::OnTick(float deltaTime, [[maybe_unused]] AZ::ScriptTimePoint time)
  60. {
  61. m_accumulatedTime += deltaTime;
  62. if (m_accumulatedTime > m_spawnPeriod)
  63. {
  64. m_accumulatedTime = 0.f;
  65. if (NetworkPrefabSpawnerComponent* spawner = GetEntity()->FindComponent<NetworkPrefabSpawnerComponent>())
  66. {
  67. AZ::Transform t = GetEntity()->GetTransform()->GetWorldTM();
  68. PrefabCallbacks callbacks;
  69. callbacks.m_onActivateCallback = [this](
  70. AZStd::shared_ptr<AzFramework::EntitySpawnTicket>&& ticket,
  71. [[maybe_unused]] AzFramework::SpawnableConstEntityContainerView view)
  72. {
  73. m_spawnedObjects.push_back(move(ticket));
  74. };
  75. spawner->SpawnDefaultPrefab(t, callbacks);
  76. }
  77. m_currentCount++;
  78. if (m_currentCount > m_maximumLiveCount)
  79. {
  80. m_spawnedObjects.pop_front();
  81. m_currentCount--;
  82. }
  83. }
  84. }
  85. }