NetworkPrefabSpawnerComponent.h 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project
  3. *
  4. * SPDX-License-Identifier: Apache-2.0 OR MIT
  5. *
  6. */
  7. #pragma once
  8. #include <NetworkPrefabSpawnerInterface.h>
  9. #include <AzCore/Component/Component.h>
  10. #include <AzFramework/Spawnable/Spawnable.h>
  11. #include <AzFramework/Spawnable/SpawnableEntitiesInterface.h>
  12. namespace MultiplayerSample
  13. {
  14. /**
  15. * \brief Can spawn prefabs using C++ API.
  16. * Does not keep track of instances. The user should save a copy of the ticket using callbacks in @PrefabCallbacks.
  17. */
  18. class NetworkPrefabSpawnerComponent
  19. : public AZ::Component
  20. , public NetworkPrefabSpawnerRequestBus::Handler
  21. , public AZ::Data::AssetBus::MultiHandler
  22. {
  23. public:
  24. AZ_COMPONENT(NetworkPrefabSpawnerComponent, "{7E48961B-7E39-4FBC-95E4-74B712229E9B}", Component);
  25. static void Reflect(AZ::ReflectContext* reflection);
  26. static void GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided)
  27. {
  28. provided.push_back(AZ_CRC_CE("NetworkPrefabSpawnerComponent"));
  29. }
  30. void Activate() override;
  31. void Deactivate() override;
  32. // NetworkPrefabSpawnerRequestBus
  33. void SpawnPrefab(const AZ::Transform& worldTm, const char* assetPath, PrefabCallbacks callbacks) override;
  34. void SpawnPrefabAsset(const AZ::Transform& worldTm, const AZ::Data::Asset<AzFramework::Spawnable>& asset, PrefabCallbacks callbacks) override;
  35. void SpawnDefaultPrefab(const AZ::Transform& worldTm, PrefabCallbacks callbacks) override;
  36. // AssetBus
  37. void OnAssetReady(AZ::Data::Asset<AZ::Data::AssetData> asset) override;
  38. private:
  39. AZ::Data::Asset<AzFramework::Spawnable> m_defaultSpawnableAsset;
  40. AZ::Data::AssetId GetSpawnableAssetId(const char* assetPath) const;
  41. struct AssetItem
  42. {
  43. AZStd::string m_pathToAsset;
  44. AZ::Data::Asset<AzFramework::Spawnable> m_spawnableAsset;
  45. };
  46. AZStd::unordered_map<AZ::Data::AssetId, AssetItem> m_assetMap;
  47. struct SpawnRequest
  48. {
  49. AZ::Data::AssetId m_assetIdToSpawn;
  50. AZ::Transform m_whereToSpawn = AZ::Transform::CreateIdentity();
  51. PrefabCallbacks m_callbacks;
  52. };
  53. AZStd::vector<SpawnRequest> m_requests;
  54. AZStd::vector<AZStd::shared_ptr<AzFramework::EntitySpawnTicket>> m_instanceTickets;
  55. void CreateInstance(const SpawnRequest& request, const AssetItem* asset);
  56. };
  57. }