Merge branch 'development' into Atom/guthadam/atomtools_support_ly_set_gem_variant_to_load
commit
1dcc20fd76
@ -0,0 +1,11 @@
|
|||||||
|
#
|
||||||
|
# Copyright (c) Contributors to the Open 3D Engine Project.
|
||||||
|
# For complete copyright and license terms please see the LICENSE at the root of this distribution.
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: Apache-2.0 OR MIT
|
||||||
|
#
|
||||||
|
#
|
||||||
|
|
||||||
|
set(FILES
|
||||||
|
test_EditorCamera.cpp
|
||||||
|
)
|
||||||
@ -0,0 +1,225 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) Contributors to the Open 3D Engine Project.
|
||||||
|
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0 OR MIT
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <AZTestShared/Math/MathTestHelpers.h>
|
||||||
|
#include <AtomToolsFramework/Viewport/ModularViewportCameraController.h>
|
||||||
|
#include <AzCore/UnitTest/TestTypes.h>
|
||||||
|
#include <AzFramework/Viewport/ViewportControllerList.h>
|
||||||
|
#include <AzTest/GemTestEnvironment.h>
|
||||||
|
#include <AzToolsFramework/API/EditorCameraBus.h>
|
||||||
|
#include <AzToolsFramework/ToolsComponents/TransformComponent.h>
|
||||||
|
#include <EditorModularViewportCameraComposer.h>
|
||||||
|
|
||||||
|
namespace UnitTest
|
||||||
|
{
|
||||||
|
class EditorCameraTestEnvironment : public AZ::Test::GemTestEnvironment
|
||||||
|
{
|
||||||
|
// AZ::Test::GemTestEnvironment overrides ...
|
||||||
|
void AddGemsAndComponents() override;
|
||||||
|
};
|
||||||
|
|
||||||
|
void EditorCameraTestEnvironment::AddGemsAndComponents()
|
||||||
|
{
|
||||||
|
AddDynamicModulePaths({ CAMERA_EDITOR_MODULE });
|
||||||
|
AddComponentDescriptors({ AzToolsFramework::Components::TransformComponent::CreateDescriptor() });
|
||||||
|
}
|
||||||
|
|
||||||
|
class EditorCameraFixture : public ::testing::Test
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
AtomToolsFramework::ModularCameraViewportContext* m_cameraViewportContextView = nullptr;
|
||||||
|
AZStd::unique_ptr<SandboxEditor::EditorModularViewportCameraComposer> m_editorModularViewportCameraComposer;
|
||||||
|
AZStd::unique_ptr<AZ::DynamicModuleHandle> m_editorLibHandle;
|
||||||
|
AzFramework::ViewportControllerListPtr m_controllerList;
|
||||||
|
AZStd::unique_ptr<AZ::Entity> m_entity;
|
||||||
|
|
||||||
|
static const AzFramework::ViewportId TestViewportId;
|
||||||
|
|
||||||
|
void SetUp() override
|
||||||
|
{
|
||||||
|
m_editorLibHandle = AZ::DynamicModuleHandle::Create("EditorLib");
|
||||||
|
[[maybe_unused]] const bool loaded = m_editorLibHandle->Load(true);
|
||||||
|
AZ_Assert(loaded, "EditorLib could not be loaded");
|
||||||
|
|
||||||
|
m_controllerList = AZStd::make_shared<AzFramework::ViewportControllerList>();
|
||||||
|
m_controllerList->RegisterViewportContext(TestViewportId);
|
||||||
|
|
||||||
|
m_entity = AZStd::make_unique<AZ::Entity>();
|
||||||
|
m_entity->Init();
|
||||||
|
m_entity->CreateComponent<AzToolsFramework::Components::TransformComponent>();
|
||||||
|
m_entity->Activate();
|
||||||
|
|
||||||
|
m_editorModularViewportCameraComposer = AZStd::make_unique<SandboxEditor::EditorModularViewportCameraComposer>(TestViewportId);
|
||||||
|
|
||||||
|
auto controller = m_editorModularViewportCameraComposer->CreateModularViewportCameraController();
|
||||||
|
// set some overrides for the test
|
||||||
|
controller->SetCameraViewportContextBuilderCallback(
|
||||||
|
[this](AZStd::unique_ptr<AtomToolsFramework::ModularCameraViewportContext>& cameraViewportContext) mutable
|
||||||
|
{
|
||||||
|
cameraViewportContext = AZStd::make_unique<AtomToolsFramework::PlaceholderModularCameraViewportContextImpl>();
|
||||||
|
m_cameraViewportContextView = cameraViewportContext.get();
|
||||||
|
});
|
||||||
|
|
||||||
|
m_controllerList->Add(controller);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TearDown() override
|
||||||
|
{
|
||||||
|
m_editorModularViewportCameraComposer.reset();
|
||||||
|
m_cameraViewportContextView = nullptr;
|
||||||
|
m_entity.reset();
|
||||||
|
m_editorLibHandle = {};
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const AzFramework::ViewportId EditorCameraFixture::TestViewportId = AzFramework::ViewportId(1337);
|
||||||
|
|
||||||
|
TEST_F(EditorCameraFixture, ModularViewportCameraControllerReferenceFrameUpdatedWhenViewportEntityisChanged)
|
||||||
|
{
|
||||||
|
// Given
|
||||||
|
const auto entityTransform = AZ::Transform::CreateFromQuaternionAndTranslation(
|
||||||
|
AZ::Quaternion::CreateRotationX(AZ::DegToRad(90.0f)), AZ::Vector3(10.0f, 5.0f, -2.0f));
|
||||||
|
AZ::TransformBus::Event(m_entity->GetId(), &AZ::TransformBus::Events::SetWorldTM, entityTransform);
|
||||||
|
|
||||||
|
// When
|
||||||
|
// imitate viewport entity changing
|
||||||
|
Camera::EditorCameraNotificationBus::Broadcast(
|
||||||
|
&Camera::EditorCameraNotificationBus::Events::OnViewportViewEntityChanged, m_entity->GetId());
|
||||||
|
|
||||||
|
// ensure the viewport updates after the viewport view entity change
|
||||||
|
const float deltaTime = 1.0f / 60.0f;
|
||||||
|
m_controllerList->UpdateViewport({ TestViewportId, AzFramework::FloatSeconds(deltaTime), AZ::ScriptTimePoint() });
|
||||||
|
|
||||||
|
// retrieve updated camera transform
|
||||||
|
const AZ::Transform cameraTransform = m_cameraViewportContextView->GetCameraTransform();
|
||||||
|
|
||||||
|
// Then
|
||||||
|
// camera transform matches that of the entity
|
||||||
|
EXPECT_THAT(cameraTransform, IsClose(entityTransform));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(EditorCameraFixture, ReferenceFrameRemainsIdentityAfterExternalCameraTransformChangeWhenNotSet)
|
||||||
|
{
|
||||||
|
// Given
|
||||||
|
m_cameraViewportContextView->SetCameraTransform(AZ::Transform::CreateTranslation(AZ::Vector3(10.0f, 20.0f, 30.0f)));
|
||||||
|
|
||||||
|
// When
|
||||||
|
AZ::Transform referenceFrame = AZ::Transform::CreateTranslation(AZ::Vector3(1.0f, 2.0f, 3.0f));
|
||||||
|
AtomToolsFramework::ModularViewportCameraControllerRequestBus::EventResult(
|
||||||
|
referenceFrame, TestViewportId, &AtomToolsFramework::ModularViewportCameraControllerRequestBus::Events::GetReferenceFrame);
|
||||||
|
|
||||||
|
// Then
|
||||||
|
// reference frame is still the identity
|
||||||
|
EXPECT_THAT(referenceFrame, IsClose(AZ::Transform::CreateIdentity()));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(EditorCameraFixture, ExternalCameraTransformChangeWhenReferenceFrameIsSetUpdatesReferenceFrame)
|
||||||
|
{
|
||||||
|
// Given
|
||||||
|
const AZ::Transform referenceFrame = AZ::Transform::CreateFromQuaternionAndTranslation(
|
||||||
|
AZ::Quaternion::CreateRotationX(AZ::DegToRad(90.0f)), AZ::Vector3(1.0f, 2.0f, 3.0f));
|
||||||
|
AtomToolsFramework::ModularViewportCameraControllerRequestBus::Event(
|
||||||
|
TestViewportId, &AtomToolsFramework::ModularViewportCameraControllerRequestBus::Events::SetReferenceFrame, referenceFrame);
|
||||||
|
|
||||||
|
const AZ::Transform nextTransform = AZ::Transform::CreateTranslation(AZ::Vector3(10.0f, 20.0f, 30.0f));
|
||||||
|
m_cameraViewportContextView->SetCameraTransform(nextTransform);
|
||||||
|
|
||||||
|
// When
|
||||||
|
AZ::Transform currentReferenceFrame = AZ::Transform::CreateTranslation(AZ::Vector3(1.0f, 2.0f, 3.0f));
|
||||||
|
AtomToolsFramework::ModularViewportCameraControllerRequestBus::EventResult(
|
||||||
|
currentReferenceFrame, TestViewportId,
|
||||||
|
&AtomToolsFramework::ModularViewportCameraControllerRequestBus::Events::GetReferenceFrame);
|
||||||
|
|
||||||
|
// Then
|
||||||
|
EXPECT_THAT(currentReferenceFrame, IsClose(nextTransform));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(EditorCameraFixture, ReferenceFrameReturnedToIdentityAfterClear)
|
||||||
|
{
|
||||||
|
// Given
|
||||||
|
const AZ::Transform referenceFrame = AZ::Transform::CreateFromQuaternionAndTranslation(
|
||||||
|
AZ::Quaternion::CreateRotationX(AZ::DegToRad(90.0f)), AZ::Vector3(1.0f, 2.0f, 3.0f));
|
||||||
|
AtomToolsFramework::ModularViewportCameraControllerRequestBus::Event(
|
||||||
|
TestViewportId, &AtomToolsFramework::ModularViewportCameraControllerRequestBus::Events::SetReferenceFrame, referenceFrame);
|
||||||
|
|
||||||
|
// When
|
||||||
|
AtomToolsFramework::ModularViewportCameraControllerRequestBus::Event(
|
||||||
|
TestViewportId, &AtomToolsFramework::ModularViewportCameraControllerRequestBus::Events::ClearReferenceFrame);
|
||||||
|
|
||||||
|
AZ::Transform currentReferenceFrame = AZ::Transform::CreateTranslation(AZ::Vector3(1.0f, 2.0f, 3.0f));
|
||||||
|
AtomToolsFramework::ModularViewportCameraControllerRequestBus::EventResult(
|
||||||
|
currentReferenceFrame, TestViewportId,
|
||||||
|
&AtomToolsFramework::ModularViewportCameraControllerRequestBus::Events::GetReferenceFrame);
|
||||||
|
|
||||||
|
// Then
|
||||||
|
EXPECT_THAT(currentReferenceFrame, IsClose(AZ::Transform::CreateIdentity()));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(EditorCameraFixture, InterpolateToTransform)
|
||||||
|
{
|
||||||
|
// When
|
||||||
|
AZ::Transform transformToInterpolateTo = AZ::Transform::CreateFromQuaternionAndTranslation(
|
||||||
|
AZ::Quaternion::CreateRotationZ(AZ::DegToRad(90.0f)), AZ::Vector3(20.0f, 40.0f, 60.0f));
|
||||||
|
AtomToolsFramework::ModularViewportCameraControllerRequestBus::Event(
|
||||||
|
TestViewportId, &AtomToolsFramework::ModularViewportCameraControllerRequestBus::Events::InterpolateToTransform,
|
||||||
|
transformToInterpolateTo, 0.0f);
|
||||||
|
|
||||||
|
// simulate interpolation
|
||||||
|
m_controllerList->UpdateViewport({ TestViewportId, AzFramework::FloatSeconds(0.5f), AZ::ScriptTimePoint() });
|
||||||
|
m_controllerList->UpdateViewport({ TestViewportId, AzFramework::FloatSeconds(0.5f), AZ::ScriptTimePoint() });
|
||||||
|
|
||||||
|
const auto finalTransform = m_cameraViewportContextView->GetCameraTransform();
|
||||||
|
|
||||||
|
// Then
|
||||||
|
EXPECT_THAT(finalTransform, IsClose(transformToInterpolateTo));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(EditorCameraFixture, InterpolateToTransformWithReferenceSpaceSet)
|
||||||
|
{
|
||||||
|
// Given
|
||||||
|
const AZ::Transform referenceFrame = AZ::Transform::CreateFromQuaternionAndTranslation(
|
||||||
|
AZ::Quaternion::CreateRotationX(AZ::DegToRad(90.0f)), AZ::Vector3(1.0f, 2.0f, 3.0f));
|
||||||
|
AtomToolsFramework::ModularViewportCameraControllerRequestBus::Event(
|
||||||
|
TestViewportId, &AtomToolsFramework::ModularViewportCameraControllerRequestBus::Events::SetReferenceFrame, referenceFrame);
|
||||||
|
|
||||||
|
AZ::Transform transformToInterpolateTo = AZ::Transform::CreateFromQuaternionAndTranslation(
|
||||||
|
AZ::Quaternion::CreateRotationZ(AZ::DegToRad(90.0f)), AZ::Vector3(20.0f, 40.0f, 60.0f));
|
||||||
|
|
||||||
|
// When
|
||||||
|
AtomToolsFramework::ModularViewportCameraControllerRequestBus::Event(
|
||||||
|
TestViewportId, &AtomToolsFramework::ModularViewportCameraControllerRequestBus::Events::InterpolateToTransform,
|
||||||
|
transformToInterpolateTo, 0.0f);
|
||||||
|
|
||||||
|
// simulate interpolation
|
||||||
|
m_controllerList->UpdateViewport({ TestViewportId, AzFramework::FloatSeconds(0.5f), AZ::ScriptTimePoint() });
|
||||||
|
m_controllerList->UpdateViewport({ TestViewportId, AzFramework::FloatSeconds(0.5f), AZ::ScriptTimePoint() });
|
||||||
|
|
||||||
|
AZ::Transform currentReferenceFrame = AZ::Transform::CreateTranslation(AZ::Vector3(1.0f, 2.0f, 3.0f));
|
||||||
|
AtomToolsFramework::ModularViewportCameraControllerRequestBus::EventResult(
|
||||||
|
currentReferenceFrame, TestViewportId,
|
||||||
|
&AtomToolsFramework::ModularViewportCameraControllerRequestBus::Events::GetReferenceFrame);
|
||||||
|
|
||||||
|
const auto finalTransform = m_cameraViewportContextView->GetCameraTransform();
|
||||||
|
|
||||||
|
// Then
|
||||||
|
EXPECT_THAT(finalTransform, IsClose(transformToInterpolateTo));
|
||||||
|
EXPECT_THAT(currentReferenceFrame, IsClose(AZ::Transform::CreateIdentity()));
|
||||||
|
}
|
||||||
|
} // namespace UnitTest
|
||||||
|
|
||||||
|
// required to support running integration tests with the Camera Gem
|
||||||
|
AZTEST_EXPORT int AZ_UNIT_TEST_HOOK_NAME(int argc, char** argv)
|
||||||
|
{
|
||||||
|
::testing::InitGoogleMock(&argc, argv);
|
||||||
|
AZ::Test::printUnusedParametersWarning(argc, argv);
|
||||||
|
AZ::Test::addTestEnvironments({ new UnitTest::EditorCameraTestEnvironment() });
|
||||||
|
int result = RUN_ALL_TESTS();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
IMPLEMENT_TEST_EXECUTABLE_MAIN();
|
||||||
@ -1,115 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) Contributors to the Open 3D Engine Project.
|
|
||||||
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: Apache-2.0 OR MIT
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <Source/Pipeline/NetBindMarkerComponent.h>
|
|
||||||
#include <AzCore/Asset/AssetManager.h>
|
|
||||||
#include <AzCore/Serialization/SerializeContext.h>
|
|
||||||
#include <Multiplayer/IMultiplayer.h>
|
|
||||||
#include <Multiplayer/INetworkSpawnableLibrary.h>
|
|
||||||
#include <AzCore/Component/TransformBus.h>
|
|
||||||
#include <AzFramework/Components/TransformComponent.h>
|
|
||||||
|
|
||||||
namespace Multiplayer
|
|
||||||
{
|
|
||||||
void NetBindMarkerComponent::Reflect(AZ::ReflectContext* context)
|
|
||||||
{
|
|
||||||
AZ::SerializeContext* serializeContext = azrtti_cast<AZ::SerializeContext*>(context);
|
|
||||||
if (serializeContext)
|
|
||||||
{
|
|
||||||
serializeContext->Class<NetBindMarkerComponent, AZ::Component>()
|
|
||||||
->Version(1)
|
|
||||||
->Field("NetEntityIndex", &NetBindMarkerComponent::m_netEntityIndex)
|
|
||||||
->Field("NetSpawnableAsset", &NetBindMarkerComponent::m_networkSpawnableAsset);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
AzFramework::Spawnable* GetSpawnableFromAsset(AZ::Data::Asset<AzFramework::Spawnable>& asset)
|
|
||||||
{
|
|
||||||
AzFramework::Spawnable* spawnable = asset.GetAs<AzFramework::Spawnable>();
|
|
||||||
if (!spawnable)
|
|
||||||
{
|
|
||||||
asset =
|
|
||||||
AZ::Data::AssetManager::Instance().GetAsset<AzFramework::Spawnable>(asset.GetId(), AZ::Data::AssetLoadBehavior::PreLoad);
|
|
||||||
AZ::Data::AssetManager::Instance().BlockUntilLoadComplete(asset);
|
|
||||||
|
|
||||||
spawnable = asset.GetAs<AzFramework::Spawnable>();
|
|
||||||
}
|
|
||||||
|
|
||||||
return spawnable;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void NetBindMarkerComponent::Activate()
|
|
||||||
{
|
|
||||||
const auto agentType = AZ::Interface<IMultiplayer>::Get()->GetAgentType();
|
|
||||||
const bool spawnImmediately =
|
|
||||||
(agentType == MultiplayerAgentType::ClientServer || agentType == MultiplayerAgentType::DedicatedServer);
|
|
||||||
|
|
||||||
if (spawnImmediately && m_networkSpawnableAsset.GetId().IsValid())
|
|
||||||
{
|
|
||||||
AZ::Transform worldTm = GetEntity()->FindComponent<AzFramework::TransformComponent>()->GetWorldTM();
|
|
||||||
auto preInsertionCallback =
|
|
||||||
[worldTm = AZStd::move(worldTm), netEntityIndex = m_netEntityIndex, spawnableAssetId = m_networkSpawnableAsset.GetId()]
|
|
||||||
(AzFramework::EntitySpawnTicket::Id, AzFramework::SpawnableEntityContainerView entities)
|
|
||||||
{
|
|
||||||
if (entities.size() == 1)
|
|
||||||
{
|
|
||||||
AZ::Entity* netEntity = *entities.begin();
|
|
||||||
|
|
||||||
auto* transformComponent = netEntity->FindComponent<AzFramework::TransformComponent>();
|
|
||||||
transformComponent->SetWorldTM(worldTm);
|
|
||||||
|
|
||||||
AZ::Name spawnableName = AZ::Interface<INetworkSpawnableLibrary>::Get()->GetSpawnableNameFromAssetId(spawnableAssetId);
|
|
||||||
PrefabEntityId prefabEntityId;
|
|
||||||
prefabEntityId.m_prefabName = spawnableName;
|
|
||||||
prefabEntityId.m_entityOffset = static_cast<uint32_t>(netEntityIndex);
|
|
||||||
AZ::Interface<INetworkEntityManager>::Get()->SetupNetEntity(netEntity, prefabEntityId, NetEntityRole::Authority);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
AZ_Error("NetBindMarkerComponent", false, "Requested to spawn 1 entity, but received %d", entities.size());
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
m_netSpawnTicket = AzFramework::EntitySpawnTicket(m_networkSpawnableAsset);
|
|
||||||
AzFramework::SpawnEntitiesOptionalArgs optionalArgs;
|
|
||||||
optionalArgs.m_preInsertionCallback = AZStd::move(preInsertionCallback);
|
|
||||||
AzFramework::SpawnableEntitiesInterface::Get()->SpawnEntities(
|
|
||||||
m_netSpawnTicket, { m_netEntityIndex }, AZStd::move(optionalArgs));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void NetBindMarkerComponent::Deactivate()
|
|
||||||
{
|
|
||||||
if(m_netSpawnTicket.IsValid())
|
|
||||||
{
|
|
||||||
AzFramework::SpawnableEntitiesInterface::Get()->DespawnAllEntities(m_netSpawnTicket);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t NetBindMarkerComponent::GetNetEntityIndex() const
|
|
||||||
{
|
|
||||||
return m_netEntityIndex;
|
|
||||||
}
|
|
||||||
|
|
||||||
void NetBindMarkerComponent::SetNetEntityIndex(size_t netEntityIndex)
|
|
||||||
{
|
|
||||||
m_netEntityIndex = netEntityIndex;
|
|
||||||
}
|
|
||||||
|
|
||||||
void NetBindMarkerComponent::SetNetworkSpawnableAsset(AZ::Data::Asset<AzFramework::Spawnable> networkSpawnableAsset)
|
|
||||||
{
|
|
||||||
m_networkSpawnableAsset = networkSpawnableAsset;
|
|
||||||
}
|
|
||||||
|
|
||||||
AZ::Data::Asset<AzFramework::Spawnable> NetBindMarkerComponent::GetNetworkSpawnableAsset() const
|
|
||||||
{
|
|
||||||
return m_networkSpawnableAsset;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@ -1,47 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) Contributors to the Open 3D Engine Project.
|
|
||||||
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: Apache-2.0 OR MIT
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <AzCore/Component/Component.h>
|
|
||||||
#include <AzCore/Asset/AssetCommon.h>
|
|
||||||
#include <AzFramework/Spawnable/Spawnable.h>
|
|
||||||
#include <AzFramework/Spawnable/SpawnableEntitiesInterface.h>
|
|
||||||
|
|
||||||
namespace Multiplayer
|
|
||||||
{
|
|
||||||
//! @class NetBindMarkerComponent
|
|
||||||
//! @brief Component for tracking net entities in the original non-networked spawnable.
|
|
||||||
class NetBindMarkerComponent final : public AZ::Component
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
AZ_COMPONENT(NetBindMarkerComponent, "{40612C1B-427D-45C6-A2F0-04E16DF5B718}");
|
|
||||||
|
|
||||||
static void Reflect(AZ::ReflectContext* context);
|
|
||||||
|
|
||||||
NetBindMarkerComponent() = default;
|
|
||||||
~NetBindMarkerComponent() override = default;
|
|
||||||
|
|
||||||
//! AZ::Component overrides.
|
|
||||||
//! @{
|
|
||||||
void Activate() override;
|
|
||||||
void Deactivate() override;
|
|
||||||
//! @}
|
|
||||||
|
|
||||||
size_t GetNetEntityIndex() const;
|
|
||||||
void SetNetEntityIndex(size_t val);
|
|
||||||
|
|
||||||
void SetNetworkSpawnableAsset(AZ::Data::Asset<AzFramework::Spawnable> networkSpawnableAsset);
|
|
||||||
AZ::Data::Asset<AzFramework::Spawnable> GetNetworkSpawnableAsset() const;
|
|
||||||
|
|
||||||
private:
|
|
||||||
AZ::Data::Asset<AzFramework::Spawnable> m_networkSpawnableAsset{AZ::Data::AssetLoadBehavior::PreLoad};
|
|
||||||
size_t m_netEntityIndex = 0;
|
|
||||||
AzFramework::EntitySpawnTicket m_netSpawnTicket;
|
|
||||||
};
|
|
||||||
} // namespace Multiplayer
|
|
||||||
Loading…
Reference in New Issue